背景:
最近在公司接触到了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)就行了。
如果还能优化烦请大佬指出来哈