如何将GeoTIFF转为DataFrame并保留经纬度坐标列?
问题描述
从USDA下载的GeoTIFF文件(投影为NAD_1983_Contiguous_USA_Albers,对应EPSG:5070),需要转换为包含经纬度对+对应数值的DataFrame。原代码生成的x、y是投影坐标系下的数值,而非经纬度。
解决方案
核心思路是先将栅格数据从EPSG:5070转换为经纬度常用的WGS84(EPSG:4326),再转换为DataFrame:
步骤1:转换投影到WGS84
利用rioxarray的rio.reproject方法,将数据转换为EPSG:4326坐标系,此时x/y会对应经度/纬度。
步骤2:转换为长格式DataFrame
使用xarray的to_dataframe方法直接转换,再整理列名。
完整代码
import rioxarray import pandas as pd # 读取GeoTIFF文件 fl = 'data/cpc2021/corn/cpccorn2021/condition/cornCond21w24.tif' da = rioxarray.open_rasterio(fl, masked=True) # 转换投影到WGS84(EPSG:4326,经纬度坐标系) da_wgs84 = da.rio.reproject("EPSG:4326") # 转换为DataFrame,移除多余的band维度 df = da_wgs84.squeeze(dim="band").to_dataframe(name="value").reset_index() # 可选:过滤无数据的行 df = df.dropna(subset=["value"]) # 查看结果 print(df.head())
代码说明
rio.reproject("EPSG:4326"):将原投影(EPSG:5070)转换为全球通用的经纬度坐标系,此时x对应经度,y对应纬度。squeeze(dim="band"):移除多余的band维度(输入文件仅含1个波段)。to_dataframe(name="value"):直接将xarray的坐标和数值转换为DataFrame,列名分别为x(经度)、y(纬度)、value(栅格数值)。dropna(subset=["value"]):可选操作,移除无数据的栅格点,减少无效数据。
输出示例
转换后的DataFrame结构如下:
| x | y | value |
|---|---|---|
| -127.3609 | 51.72383 | 3.250000 |
| -127.2717 | 51.72383 | 3.100000 |
| ... | ... | ... |
得到的x、y即为覆盖美国本土的经纬度坐标,每个坐标对应一个栅格数值。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

