无坐标信息的PNG格式图片转GEOTIF格式图片(WSG84)

背景:

最近在公司接触到了gis的项目需要将PNG图片转成tif图片,而且是geotif图片(带坐标系的tif),使用了arcmap去转遇到了各种各样的问题,最后找chatgpt解决了(算是勉强解决把总感觉还是有点模糊)。

代码是不断与chatgpt沟通之后,优化出来的;使用python3.1写的。

需要输入:

png图片位置

需要输出tif的位置

PNG图像的边缘坐标WSG84,此坐标系就是经纬度坐标系(左上角、右上角、右下角坐标)

废话不多说,上代码了。

"""
  __author__=chatgpt、shadow
"""

import numpy as np
from PIL import Image
from osgeo import gdal, osr


# 加载 PNG 图像并获取图像数据 TODO 普通PNG图片
png_image = Image.open("D:\\a_project\\python\\img\\xxxxxx.png")
image_data = np.array(png_image)
height, width, channels = image_data.shape

# 定义 GeoTIFF 文件的输出路径和文件名 TODO GEOTIFF图片(带坐标的tif图片)
output_geotiff = "D:\\a_project\\python\\img\\xxxxxx.tif"

# 创建 GeoTIFF 文件
driver = gdal.GetDriverByName("GTiff")
geotiff_dataset = driver.Create(output_geotiff, width, height, channels, gdal.GDT_Byte)

# 将 PNG 图像数据写入 GeoTIFF 文件
for band in range(channels):
    geotiff_band = geotiff_dataset.GetRasterBand(band + 1)
    geotiff_band.WriteArray(image_data[:, :, band])

# 定义 PNG 图像的边缘坐标(WSG84) TODO 依次 左上角、右上角、右下角坐标
top_left = (109.53041934967, 29.5403505145483)
top_right = (109.550847053528, 29.5403505145483)
bottom_right = (109.550847053528, 29.5316645315345)

# 定义 GeoTIFF 文件的空间参考(Spatial Reference)
spatial_reference = osr.SpatialReference()
spatial_reference.ImportFromEPSG(4326)  # WGS84 EPSG code

# 设置 GeoTIFF 文件的地理转换信息(GeoTransform)
geotransform = (
    top_left[0], (top_right[0] - top_left[0]) / width, 0,
    top_left[1], 0, (bottom_right[1] - top_left[1]) / height
)


geotiff_dataset.SetGeoTransform(geotransform)
geotiff_dataset.SetProjection(spatial_reference.ExportToWkt())

# 设置 GeoTIFF 文件的重采样方法为最近邻法
geotiff_dataset.SetMetadataItem('RESAMPLING', 'NEAREST_NEIGHBOR')

# 设置 GeoTIFF 文件的压缩方法为 DEFLATE
geotiff_dataset.SetMetadataItem('COMPRESS', 'DEFLATE')

# 保存并关闭 GeoTIFF 文件
geotiff_dataset.FlushCache()
geotiff_dataset = None

直接复制到编译器,修改需要的参数(TODO)就行了。

如果还能优化烦请大佬指出来哈

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WSG84(World Geodetic System 1984)和CGCS2000(中国大地坐标系统2000)是两种常用的地理坐标系。在Java中将WSG84换为CGCS2000可以通过使用坐标换库来实现。 首先,我们需要确定所使用的坐标换库。Java中有许多开源的坐标换库可以使用,例如Geotools和Proj4j。这里以使用Geotools为例进行说明。 在使用Geotools进行坐标换之前,我们需要先导入相关的库文件。可以在Maven项目中的pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>org.geotools</groupId> <artifactId>gt-epsg-hsql</artifactId> <version>24.1</version> </dependency> ``` 接下来,我们可以使用以下代码将WSG84坐标换为CGCS2000坐标: ```java import org.geotools.geometry.DirectPosition2D; import org.geotools.referencing.CRS; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.crs.CoordinateReferenceSystem; public class CoordinateConversion { public static void main(String[] args) { // 输入的坐标点(WSG84) double longitude = 116.3975; double latitude = 39.9085; // 设置源坐标系(WSG84) CoordinateReferenceSystem sourceCRS; try { sourceCRS = CRS.decode("EPSG:4326"); } catch (NoSuchAuthorityCodeException | FactoryException e) { e.printStackTrace(); return; } // 设置目标坐标系(CGCS2000) CoordinateReferenceSystem targetCRS; try { targetCRS = CRS.decode("EPSG:4490"); } catch (NoSuchAuthorityCodeException | FactoryException e) { e.printStackTrace(); return; } // 创建源坐标点 DirectPosition2D sourcePosition = new DirectPosition2D(sourceCRS, longitude, latitude); // 坐标换 try { DirectPosition2D targetPosition = (DirectPosition2D) CRS.transform(sourcePosition, targetCRS); double targetLongitude = targetPosition.x; double targetLatitude = targetPosition.y; System.out.println("换后的坐标(CGCS2000):"); System.out.println("经度:" + targetLongitude); System.out.println("纬度:" + targetLatitude); } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码中,首先设置源坐标系为WSG84(EPSG:4326)和目标坐标系为CGCS2000(EPSG:4490),然后创建源坐标点并利用`CRS.transform()`方法进行坐标换。 运行上述代码后,将输出换后的CGCS2000坐标,包括经度和纬度。 需要注意的是,WSG84和CGCS2000的坐标系定义可能因使用的地理坐标换库而有所不同,可以根据实际情况进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值