xarray数据集按变量子集化后丢失CRS信息,如何保留?
解决xarray子集化GOES数据丢失CRS的问题
核心原因
GOES系列卫星的NetCDF数据,其CRS信息并非存储在普通的coords属性中,而是依赖三类关键信息:
- 名为
goes_imager_projection的专用坐标变量(存储投影核心参数,如投影类型、地球半径、卫星高度等) x/y坐标变量的属性(包含投影偏移、缩放参数)- 数据集的全局属性(符合CF规范的投影声明)
仅通过DS[bands]选取波段时,goes_imager_projection这个关键坐标变量未被纳入子集,导致QGIS无法识别投影信息。
解决方法
方法1:子集时显式包含投影坐标变量
在选取目标波段的同时,加入投影相关的坐标变量:
import xarray as xr DS = xr.open_dataset("my_data.nc") bands = ['CMI_C01','CMI_C02','CMI_C03'] # 追加投影变量到保留列表 keep_vars = bands + ['goes_imager_projection'] test = DS[keep_vars] # 导出后QGIS可正常识别CRS test.to_netcdf("test.nc")
方法2:手动复制投影相关属性(备用方案)
如果方法1未生效,可以手动同步原始数据集的属性和投影变量:
test = DS[bands] # 复制全局属性 test.attrs = DS.attrs.copy() # 同步x/y坐标的属性 test.x.attrs = DS.x.attrs.copy() test.y.attrs = DS.y.attrs.copy() # 添加投影坐标变量 test = test.assign_coords(goes_imager_projection=DS.goes_imager_projection) test.to_netcdf("test.nc")
验证CRS是否保留
可以通过以下代码检查子集后的数据集是否包含完整的投影信息:
# 查看全局属性 print(test.attrs) # 查看投影变量详情 print(test.goes_imager_projection) # 查看x坐标的投影相关属性 print(test.x.attrs)
内容的提问来源于stack exchange,提问作者Sean Carter
相关产品推荐
相关产品推荐

