使用shapefile裁剪NetCDF后保存出现grid_mapping相关ValueError求助
报错原因
这个错误的核心是rioxarray写入CRS信息时,会给所有数据变量的属性添加grid_mapping字段,而xarray调用to_netcdf方法时会自动在变量的序列化编码中生成同名的grid_mapping字段,两者重复导致写入冲突。保存为GeoTIFF时rioxarray的to_raster方法会自动处理该冲突,因此不会报错。
可行解决方法
方法1:删除变量属性中的grid_mapping字段
遍历所有数据变量,手动删除属性中重复的grid_mapping字段后再保存:
import rioxarray as rxr import rasterio as rio import xarray as xr import geopandas as gpd from shapely.geometry import mapping xds = xr.open_dataset("file.nc") geodf = gpd.read_file("shape.shp") xds.rio.write_crs("EPSG:4326", inplace=True) clipped = xds.rio.clip(geodf.geometry.apply(mapping), geodf.crs) # 新增:删除所有数据变量属性中的grid_mapping for var in clipped.data_vars: if "grid_mapping" in clipped[var].attrs: del clipped[var].attrs["grid_mapping"] clipped.to_netcdf("test.nc")
方法2:保存时通过encoding参数指定忽略grid_mapping
不需要修改属性,直接在保存时通过编码配置规避冲突:
# 其余裁剪代码同上 encoding = {var: {"grid_mapping": None} for var in clipped.data_vars} clipped.to_netcdf("test.nc", encoding=encoding)
方法3:删除rioxarray生成的空间参考变量
如果不需要在输出的NetCDF中保留CRS信息,可以直接删除rioxarray插入的spatial_ref变量后保存:
# 其余裁剪代码同上 if "spatial_ref" in clipped: clipped = clipped.drop_vars("spatial_ref") clipped.to_netcdf("test.nc")
内容的提问来源于stack exchange,提问作者Luckasino
相关产品推荐
相关产品推荐

