如何通过GDAL将GeoTIFF转换为带Lon/Lat的CSV文件?
解决方法
场景1:XYZ文件的x/y本身就是经纬度(仅需修改列名)
如果你的GeoTIFF采用的是地理坐标系(如WGS84, EPSG:4326),GDAL导出的XYZ文件里的x就是经度、y就是纬度,只是列名不符合需求。直接用Pandas重命名列即可:
import pandas as pd # 读取XYZ文件(替换为你的文件名) df = pd.read_csv('output.xyz', sep=' ', header=None, names=['x', 'y', 'value']) # 重命名列 df.rename(columns={'x': 'lon', 'y': 'lat'}, inplace=True) # 保存为标准CSV df.to_csv('final_output.csv', index=False)
场景2:XYZ文件的x/y是投影坐标(需转换为经纬度)
如果GeoTIFF用的是投影坐标系(如UTM、高斯-克吕格),x/y是平面坐标,需要转换成WGS84经纬度。可以用pyproj库完成坐标转换:
步骤1:获取原影像的投影EPSG编码
先通过GDAL读取原GeoTIFF的投影信息,提取对应的EPSG编码(也可手动输入已知的编码):
from osgeo import gdal ds = gdal.Open('input.tif') proj = ds.GetProjection() # 示例:假设原投影是UTM 50N,对应EPSG:32650 src_crs = 'EPSG:32650' # 替换为你的影像实际投影EPSG dst_crs = 'EPSG:4326' # 目标坐标系:WGS84经纬度
步骤2:批量转换坐标并输出CSV
import pandas as pd from pyproj import Transformer # 读取XYZ文件 df = pd.read_csv('output.xyz', sep=' ', header=None, names=['x', 'y', 'value']) # 创建坐标转换器 transformer = Transformer.from_crs(src_crs, dst_crs, always_xy=True) # 将投影坐标转为经纬度 df['lon'], df['lat'] = transformer.transform(df['x'].values, df['y'].values) # 丢弃原投影坐标列,保存最终CSV df.drop(columns=['x', 'y'], inplace=True) df.to_csv('final_output.csv', index=False)
额外优化:直接用GDAL生成带经纬度列名的XYZ
可以跳过后续列名修改步骤,直接在GDAL导出XYZ时指定列名:
gdal_translate -of XYZ -co COLUMN_NAMES="lon,lat,value" input.tif output.xyz
导出的XYZ文件直接使用lon、lat作为列名,读取后可直接保存为标准CSV。
内容的提问来源于stack exchange,提问作者Stozi Python
相关产品推荐
相关产品推荐

