Klimapy / 统计分析 / 空间插值与重映射
Klimapy 1.2.1 · 变量、单位、日历和质量控制规则见相应函数说明。

气候数据空间插值

klimapy.statistics.interpolation 接受含一维 lat、lon 坐标的 klimapy.native.Field。 时间、层次等其他维度及变量单位保留,数据按标量场处理。

函数 method 用途
no_interpolation none 保留原网格和取值
bilinear bilinear 连续、平滑场的双线性插值
first_order_conservative conservative 保持面积积分的一阶守恒重映射
second_order_conservative conservative_2nd 使用单元梯度的二阶守恒重映射
nearest_neighbor nearest 类别、离散取值;球面距离最近的源点
patch patch 3×3 局部二次最小二乘拟合

调用

import numpy as np
from klimapy.statistics import interpolation as interp

target = {'lat': np.arange(20, 41, 0.5), 'lon': np.arange(100, 121, 0.5)}
result = interp.bilinear(data, target)
result = interp.nearest_neighbor(data, target)
result = interp.patch(data, target)
original = interp.no_interpolation(data)

# 多个场共用同一网格权重;每次输入坐标必须与初始化时完全相同。
with interp.Regridder(data, target, method='bilinear') as regridder:
    result = regridder(data)

守恒插值与单元边界

守恒方法的输入值应是单元平均量或单位面积通量,例如 pr、evspsbl、mrro。 每格的总质量或总量应先除以源单元面积,再重映射并乘目标面积。 它们不适用于直接插值整个格点的总质量值。mrso 的单位与垂直积分定义也需先核实。

source = {
    'lat': [-30, 0, 30], 'lon': [10, 30, 50],
    'lat_b': [-45, -15, 15, 45], 'lon_b': [0, 20, 40, 60],
}
target = {
    'lat': [-22.5, 22.5], 'lon': [15, 45],
    'lat_b': [-45, 0, 45], 'lon_b': [0, 30, 60],
}
result = interp.first_order_conservative(data, target, source_grid=source)
result = interp.second_order_conservative(data, target, source_grid=source)
  • 边界使用 lat_b、lon_b,分别为 n+1 个边;升降序与对应坐标一致。
  • 未给边界时按中心点中点推断并外推两端,纬度边界限制在极点;单格轴必须给边界。 对科研守恒计算建议提供数据原生边界,不要把推断边界当作原始网格定义。
  • 面积权重在球面矩形单元上按 Δlon × Δsin(lat) 积分,地球半径的平方因子抵消。
  • 二阶方法以面积坐标中的单元质心为原点,加入无斜率限制器的线性梯度。 在相同覆盖域、无缺测条件下保持面积积分;输出可能超出源值范围,不自动截断。
  • 目标单元必须被源网格完整覆盖;缺失参与源值会使对应结果为 NaN,不进行重归一化。 二阶梯度邻点不足时使用常量重建;缺测区不承诺完整域守恒。

使用边界

支持规则或不等距的、严格单调的一维经纬网格,坐标单位必须是度;支持升序和降序。 尚不支持二维曲线网格、非结构网格、经度接缝和周期边界。不同经度约定应先对齐。 双线性、最近邻和 Patch 仅映射源中心坐标包围的区域,区域外为 NaN,不外推。 缺测值保留;不填补海陆掩膜。类别字段建议最近邻,双线性和高阶方法会产生中间取值。 数据会加载到内存;大型资料应按时间或层次分块调用,并复用 Regridder。 风应力等矢量分量可作为标量分别插值,但此接口不执行网格方向旋转。

本库 patch 是局部二次拟合,不是 ESMF 的多 Patch 恢复算法,不承诺相同权重或结果。 二阶守恒也是球面矩形网格上的本地实现,不宣称与 ESMF 数值完全一致。 方法性质可参见 ESMF 重网格说明。

权重构建与求值均在 Rust 执行,Regridder 应使用上下文或显式 close;关闭后不可再调用。