
本文介绍如何利用 rioxarray 对带有旋转极点(rotated pole)坐标的 xarray 数据集进行 crs 间变量重投影,避免手动展平插值,支持自动地理坐标转换与网格对齐。
本文介绍如何利用 rioxarray 对带有旋转极点(rotated pole)坐标的 xarray 数据集进行 crs 间变量重投影,避免手动展平插值,支持自动地理坐标转换与网格对齐。
在气象、气候建模等场景中,常遇到多个 xarray 数据集使用不同旋转极点坐标系(如 ob_tran 投影)的情况——它们各自定义了独立的 rlat/rlon 网格及对应的 lat/lon 辅助坐标,但 CRS 参数(如 o_lat_p、lon_0)不同。此时若需将一个数据集中的变量(如 var1)插值到另一数据集的网格上,传统做法(如 scipy.interpolate.griddata 手动展平+反展平)不仅代码冗长、易出错,且无法处理缺失地理元数据或非规则网格的边界问题。
推荐方案:使用 rioxarray.reproject() 实现端到端 CRS 转换
rioxarray 是专为栅格地理空间数据设计的 xarray 扩展库,其 .rio.reproject() 方法可直接对 DataArray 进行基于 GDAL 的高质量重投影,自动完成:
- 源 CRS 解析(支持 Proj4 字符串、EPSG、WKT 等格式);
- 目标网格定义(可指定目标 CRS + 目标分辨率/范围,或直接复用另一数据集的地理参考);
- 双线性/最近邻/三次卷积等重采样;
- 坐标系元数据(.rio.crs)与空间维度(x, y)的同步更新。
✅ 前提条件
确保数据已正确设置地理空间属性:
import rioxarray import xarray as xr # 为 ds1 和 ds2 显式设置 CRS(需先解析 Proj4 字符串) ds1 = ds1.rio.write_crs(ds1_proj4, inplace=True) ds2 = ds2.rio.write_crs(ds2_proj4, inplace=True) # 若变量 var1 需重投影,先提取为 DataArray 并指定空间维度 da_var1 = ds1["var1"].rio.set_spatial_dims(x_dim="rlon", y_dim="rlat", inplace=True)
✅ 核心操作:重投影到目标 CRS
# 方式1:重投影到 ds2 的 CRS(推荐:保持目标网格结构一致)
da_var1_reprojected = da_var1.rio.reproject(
match_grid=ds2["var2"], # 自动匹配 ds2 的空间参考(CRS + 分辨率 + 范围)
resampling="bilinear" # 或 "nearest", "cubic"
)
# 方式2:显式指定目标 CRS(当需自定义输出范围时)
da_var1_reprojected = da_var1.rio.reproject(
dst_crs=ds2.rio.crs,
shape=ds2["var2"].shape, # 可选:强制输出尺寸
resampling="bilinear"
)
⚠️ 关键注意事项
- rioxarray 要求输入 DataArray 必须有明确的空间维度(默认 x/y),若原始数据使用 rlat/rlon,需通过 .rio.set_spatial_dims(x_dim="rlon", y_dim="rlat") 显式声明;
- match_grid 是最便捷方式,它会自动复用目标数据集的 CRS、仿射变换(affine transform)和形状,避免手动计算目标网格;
- 若 lat/lon 坐标未嵌入 CRS 元数据,仅靠辅助坐标无法驱动重投影——必须通过 .rio.write_crs() 提供权威 CRS 定义;
- 对于高纬度旋转极点网格,建议优先使用 "bilinear" 或 "cubic" 插值,"nearest" 可能导致块状伪影;
- 重投影后,新 DataArray 的 rlat/rlon 坐标将被替换为重采样后的规则网格坐标(通常转为 x/y),如需保留原始旋转索引结构,可后续用 .rio.reproject_match() 对齐后再映射回 rlat/rlon。
✅ 整合至目标数据集
# 将重投影结果添加为 ds2 的新变量(自动继承 ds2 的 rlat/rlon 坐标)
ds2 = ds2.assign(var1=da_var1_reprojected)
# 或:若需严格保持 dims 名称与坐标一致性
ds2["var1"] = da_var1_reprojected.rename({"x": "rlon", "y": "rlat"})
综上,rioxarray.reproject() 不仅大幅简化跨 CRS 插值流程,还通过底层 GDAL 保障精度与性能,是处理旋转极点数据集间变量转换的工业级标准方案。务必确保 CRS 元数据完整、空间维度正确定义,并善用 match_grid 参数实现无缝集成。











