如何将旋转极坐标NetCDF气候数据转换为常规网格?
旋转极坐标NetCDF转常规经纬度网格方案
数据疑惑解释
你的数据中虽然包含lat和lon变量,但它们是二维数组(随rlat/rlon网格点变化),仅代表旋转极网格每个点对应的真实经纬度,并非规则的经纬度网格(如固定间隔的1°×1°网格)。如果需要按固定经纬度范围调用、与其他规则网格数据对比或做标准化绘图,就需要将数据插值到常规经纬度网格上。
方法一:使用CDO(气候数据操作工具)
CDO可自动识别文件中的rotated_pole投影信息,无需手动指定旋转极参数,直接通过插值命令完成转换:
1. 定义目标规则网格
你可以先创建一个文本文件(比如target_grid.txt)描述目标网格,以1°分辨率全球网格为例:
gridtype = lonlat xsize = 360 ysize = 180 xfirst = -180 xinc = 1 yfirst = -90 yinc = 1
或者直接在命令中用字符串定义网格,省去文件步骤。
2. 执行插值转换
- 双线性插值(适合降水这类连续变量):
# 使用网格文件 cdo remapbil,target_grid.txt input.nc output.nc # 直接用字符串定义网格(1°分辨率) cdo remapbil,"lonlat,360,180,-180,1,-90,1" input.nc output.nc
- 保守插值(适合需要保持总量的通量类变量):
cdo remapcon,target_grid.txt input.nc output.nc
3. 可选:先裁剪区域再插值
如果只需要特定经纬度范围的数据,可先裁剪再插值,减少计算量:
# 裁剪东经70-140°、北纬15-55°区域 cdo sellonlatbox,70,140,15,55 input.nc cropped.nc # 插值到目标网格 cdo remapbil,target_grid.txt cropped.nc output_cropped.nc
方法二:使用Python(xarray + xesmf)
如果需要更灵活的自定义操作,用Python的xarray和xesmf库实现:
import xarray as xr import xesmf as xe import numpy as np # 1. 读取原始旋转极坐标数据 ds = xr.open_dataset('input.nc') # 2. 创建目标常规经纬度网格(示例为1°分辨率) target_ds = xr.Dataset({ 'lon': (['lon'], np.arange(-180, 180, 1)), 'lat': (['lat'], np.arange(-90, 90, 1)), }) # 3. 创建重映射器,选择插值方法 # 双线性插值:'bilinear';保守插值:'conservative' regridder = xe.Regridder(ds, target_ds, 'bilinear', extrap_method='nearest_s2d') # 4. 对TOT_PREC变量执行重映射 ds_remapped = regridder(ds['TOT_PREC']) # 5. 保存转换后的文件 ds_remapped.to_netcdf('output_python.nc')
补充说明
- 若仅需绘图,也可直接利用原始数据中的二维
lat/lon变量,用matplotlib.pyplot.pcolormesh或cartopy绘制,但这种方式无法实现规则网格的批量操作或数据对比。 - 插值方法选择:双线性插值计算快、结果平滑;保守插值能保持变量总量,适合降水、通量等需要守恒的变量。
内容的提问来源于stack exchange,提问作者tryingnottodiewhilecoding
相关产品推荐
相关产品推荐

