使用xarray/rioxarray生成NetCDF,高版本GDAL丢失空间范围求助
问题描述
我用Python的xarray和rioxarray创建DataSet后导出为NetCDF文件,用系统安装的GDAL 3.2查看时能显示正确空间范围,但在conda环境中使用GDAL≥3.4版本查看时,空间范围丢失了。
系统安装的GDAL 3.2.2输出:
micha@RMS:Kinneret$ gdalinfo --version GDAL 3.2.2, released 2021/03/05 micha@RMS:Kinneret$ gdalinfo NETCDF:"Kinneret_velocity.nc":v | grep -A 4 Corner Warning 1: dimension #2 (x) is not a Longitude/X dimension. Warning 1: dimension #1 (y) is not a Latitude/Y dimension. Warning 1: dimension #0 (z) is not a Time or Vertical dimension. Corner Coordinates: Upper Left ( 735758.000, 3644806.000) ( 35d31'15.70"E, 32d54'57.98"N) Lower Left ( 735758.000, 3621606.000) ( 35d30'54.46"E, 32d42'25.30"N) Upper Right ( 754558.000, 3644806.000) ( 35d43'18.74"E, 32d54'42.80"N) Lower Right ( 754558.000, 3621606.000) ( 35d42'55.82"E, 32d42'10.25"N)
conda环境中GDAL 3.5.2的输出:
micha@RMS:Kinneret$ conda activate geo (geo) micha@RMS:Kinneret$ gdalinfo --version GDAL 3.5.2, released 2022/09/02 (geo) micha@RMS:Kinneret$ gdalinfo NETCDF:"Kinneret_velocity.nc":v | grep -A 4 Corner Warning 1: dimension #2 (x) is not a Longitude/X dimension. Warning 1: dimension #1 (y) is not a Latitude/Y dimension. Warning 1: dimension #0 (z) is not a Time or Vertical dimension. Corner Coordinates: Upper Left ( 0.0, 0.0) Lower Left ( 0.0, 58.0) Upper Right ( 47.0, 0.0) Lower Right ( 47.0, 58.0)
注:两种环境下所有grid_mapping元数据条目均指向spatial_ref,且完整的spatial_ref详情可用。
解决方法
高版本GDAL对NetCDF空间元数据的解析逻辑更严格,需给xarray Dataset添加以下配置:
为x/y维度添加标准CF元数据:
明确空间坐标的类型、单位和轴信息,让GDAL正确识别维度属性:ds.x.attrs = { 'units': 'meters', # 匹配你的投影单位,如UTM坐标系用米 'standard_name': 'projection_x_coordinate', 'axis': 'X' } ds.y.attrs = { 'units': 'meters', 'standard_name': 'projection_y_coordinate', 'axis': 'Y' }显式关联grid_mapping到数据变量:
确保数据变量的grid_mapping属性正确指向空间参考变量:# 假设数据变量名为v ds['v'].attrs['grid_mapping'] = 'spatial_ref'用rioxarray指定空间维度:
避免GDAL混淆维度类型,显式声明x/y维度名称:ds = ds.rio.set_spatial_dims(x_dim='x', y_dim='y', inplace=True)按CF兼容格式保存NetCDF:
导出时使用NETCDF4格式,确保元数据完整写入:ds.to_netcdf('Kinneret_velocity.nc', format='NETCDF4')
以上配置会让高版本GDAL正确识别空间维度与坐标信息,从而显示正确的空间范围。
内容的提问来源于stack exchange,提问作者Micha
相关产品推荐
相关产品推荐

