使用to_netcdf保存DataArray丢失坐标?QGIS无法识别正确位置
问题
我正在使用xarray和rioxarray从现有数据集计算数值,该数据集包含red、blue、green等波段,代码如下:
import xarray as xr dataset: xr.Dataset = ... red, blue, green = dataset["red"], dataset["blue"], dataset["green"] gray = (red + blue + green) / 3.0
随后我保存了三个文件:
red.to_netcdf("red.nc") gray.to_netcdf("gray.nc") gray.rio.to_raster("gray.tif")
将这些文件在QGIS中打开时,red.nc和gray.tif位置正确,但gray.nc显示在(0,0)位置。我对比了red和gray变量的属性等信息,未发现差异。请问如何正确保存gray为NC文件,让QGIS能正常识别?
解决方案
问题核心是:算术运算生成的gray DataArray丢失了原数据集的地理空间元数据(如CRS、空间变换参数)。red直接取自原数据集,自带这些关键元数据,因此QGIS能正确识别位置;gray.rio.to_raster()通过rioxarray的方法自动写入了空间信息,但直接调用to_netcdf()时,这些地理元数据没有被序列化到NetCDF文件中。
以下是两种可行的解决方法:
方法1:将
gray加入原数据集后保存
原数据集的所有空间元数据会被完整保留,只需将计算后的gray添加到原Dataset中再单独保存该变量:import xarray as xr dataset: xr.Dataset = ... red, blue, green = dataset["red"], dataset["blue"], dataset["green"] gray = (red + blue + green) / 3.0 # 将gray变量加入原数据集 dataset["gray"] = gray # 保存gray变量为NetCDF文件 dataset["gray"].to_netcdf("gray.nc")方法2:手动复制空间元数据
如果不想修改原数据集,可以手动为gray复制CRS和空间坐标的属性:import xarray as xr dataset: xr.Dataset = ... red, blue, green = dataset["red"], dataset["blue"], dataset["green"] gray = (red + blue + green) / 3.0 # 复制原数据集的CRS信息 gray.rio.set_crs(dataset.rio.crs, inplace=True) # 复制空间坐标的属性(替换为你数据集实际的坐标名,如lon/lat) for coord_name in ["x", "y"]: gray.coords[coord_name].attrs = dataset.coords[coord_name].attrs gray.to_netcdf("gray.nc")
处理后,gray.nc的空间元数据会与red.nc完全一致,QGIS即可正确识别其地理位置。
内容的提问来源于stack exchange,提问作者Holt
相关产品推荐
相关产品推荐

