Skip to content

采样、插值与缺测 ​

数据只记录有限位置的数值,屏幕像素却可能落在任意位置。采样(sampling)读取离散数据;插值(interpolation)根据已知样本估计样本之间的值。插值带来连续外观,也引入了对未知区域的假设。

先从两个数开始 ​

设左端温度 10°C、右端温度 30°C。参数 s 表示从左到右的比例,s=0 在左端,s=1 在右端。线性插值(linear interpolation)为:

lerp(a,b,s)=(1−s)a+sb

当 s=0.25,值为 0.75×10 + 0.25×30 = 15°C。两个权重(weights)和为 1;当 s 在 [0,1] 内时,权重非负,结果不会超出端点范围。超出此范围叫外推(extrapolation),保证也随之改变。

双线性插值的四个权重,以及缺测处理与纹素中心的位置

符号 / 英文含义单位
s,t / local coordinates单元内横向、纵向比例无量纲,通常 [0,1]
f00,f10,f01,f11 / samples左下、右下、左上、右上样本例如 °C
wij / weights四个样本的贡献比例无量纲
mi / validity mask样本是否有效0 或 1

双线性是做三次一维插值 ​

双线性插值(bilinear interpolation)先在下边和上边各插一次,再沿纵向插值:

a=lerp(f00,f10,s),b=lerp(f01,f11,s),f=lerp(a,b,t).w00=(1−s)(1−t),w10=s(1−t),w01=(1−s)t,w11=st.

取四角 0、10、20、30°C,在 (s,t)=(0.25,0.5) 时,权重是 0.375、0.125、0.375、0.125,结果为 12.5°C。它对 s 和 t 分别线性,但一般含有 s×t 项,因此并非总是一张平面。

ts
const lerp = (a: number, b: number, s: number) => (1-s)*a + s*b
function bilinear(values: readonly number[], s: number, t: number) {
  if (values.length !== 4 || !values.every(Number.isFinite)) return null
  if (s < 0 || s > 1 || t < 0 || t > 1) return null
  const [f00, f10, f01, f11] = values
  return lerp(lerp(f00, f10, s), lerp(f01, f11, s), t)
}
bilinear([0, 10, 20, 30], 0.25, 0.5) // 12.5

缺测不是零度 ​

缺测(missing data)表示不知道,零则是一个确定数值。若右上角缺测,直接填 0 会拉低结果。常见策略有两种:任何角点缺测就返回无效;或者只对有效邻居重新归一化权重,计算 Σ(wi mi fi) / Σ(wi mi)。

后一种策略在上述例子中给出 (1.25+7.5)/0.875 = 10°C,但它已不再是原来的完整双线性场,可能跨越缺测边界产生误导。没有通用正确选择:陆海边界、观测空洞和纯显示遮罩可能需要不同策略;策略必须在底色、等值线和拾取读值之间一致。

数组下标与纹理坐标有半格差异 ​

假设 n 个数据节点包含区域的两个端点,第 i 个节点的地理比例为 i/(n−1)。把它们各存为一个纹素(texel)后,第 i 个纹素中心的归一化纹理坐标是 (i+0.5)/n。二者不是同一个数。

对 n=4,节点比例是 0、1/3、2/3、1;纹素中心是 0.125、0.375、0.625、0.875。若使用硬件线性过滤,可将地理比例 q 映射为 u=(q(n−1)+0.5)/n。若数据代表单元中心而非节点,映射应重新定义。经纬度空间中的插值也不等于按地表米制距离插值。

自检:平滑与可信度 ​

四角为 0、0、0、100,中心是多少?如果 100 是地类编号,能否采用同样做法?

答案与理由

有效连续标量的中心是 25。地类编号是分类量(categorical data),25 不代表两类之间的自然状态,应使用最近邻或明确的分类汇聚规则。画面平滑程度不代表数据分辨率或准确度。

回到主课:纹理作为数据容器、空间采样、时间插值。

气象学 · 数学基础 · 地理可视化