Python如何将带经纬度的pandas dataframe转为WGS84坐标系geoTIFF文件
Pandas DataFrame 转 WGS84 坐标系 GeoTIFF 实现方案
前置依赖安装
执行以下命令安装需要的第三方库:pip install pandas numpy rasterio pyproj scipy
完整实现代码
import pandas as pd import numpy as np import rasterio from rasterio.transform import from_origin from pyproj import CRS from scipy.interpolate import griddata # 1. 读取你的DataFrame,这里替换成你自己的数据源读取逻辑 df = pd.read_csv("你的数据文件路径.csv") # 确认列名:lon是经度,lat是纬度,value是你要存入栅格的属性值,可根据实际修改 lon_col = "lon" lat_col = "lat" value_col = "value" # 2. 配置栅格参数 pixel_size = 0.001 # WGS84下单位是度,0.001度约等于111米分辨率,根据需求调整 crs_wgs84 = CRS.from_epsg(4326) # WGS84坐标系EPSG编码 # 3. 生成规则栅格网格 min_lon = df[lon_col].min() max_lon = df[lon_col].max() min_lat = df[lat_col].min() max_lat = df[lat_col].max() # 计算网格的行列数 x_size = int(np.ceil((max_lon - min_lon) / pixel_size)) y_size = int(np.ceil((max_lat - min_lat) / pixel_size)) # 生成网格坐标 x_grid = np.linspace(min_lon, max_lon, x_size) y_grid = np.linspace(max_lat, min_lat, y_size) xx, yy = np.meshgrid(x_grid, y_grid) # 4. 散点插值到规则网格,这里用最近邻插值,可替换为'linear'/'cubic'等方法 points = df[[lon_col, lat_col]].values values = df[value_col].values grid_values = griddata(points, values, (xx, yy), method='nearest') # 5. 写入GeoTIFF文件 output_path = "输出文件路径.tif" with rasterio.open( output_path, 'w', driver='GTiff', height=y_size, width=x_size, count=1, # 单波段,多波段的话修改对应数值和写入逻辑 dtype=grid_values.dtype, crs=crs_wgs84, transform=from_origin(min_lon, max_lat, pixel_size, pixel_size), nodata=np.nan # 无值区域填充值,可根据需求修改 ) as dst: dst.write(grid_values, 1)
注意事项
- 如果你已经有规则排列的X/Y坐标,不需要做插值步骤,直接把数据整理成[y_size, x_size]的二维数组即可
- 插值方法可根据业务需求调整,对精度要求高的场景可以替换为克里金、反距离权重等插值算法
- 如果你的原始经纬度不是WGS84坐标系,需要先用
pyproj做坐标转换,再执行后续逻辑
内容的提问来源于stack exchange,提问作者Preet Khaturia
相关产品推荐
相关产品推荐

