1) 在用户设置新的分辨率(即基础单元格网大小发生变化)后,插值生成的结果格网与原始格网保持不变的是,最小和最大XYZ轴数值,而单元大小变化导致格网的行数与列数重新计算。
2) 对结果格网初始化后,逐行列进行每个单元的循环,仅仅差每个单元位置处的Z轴数值,此时以位置为参数(在两个格网之间是保持不变的),寻找原始格网此处的Z轴数值,此刻可在原始格网此位置的邻域运用各种插值算法确定这个未知数值。
3) 接下来的工作,首先找到最接近此位置的单元格,然后确定此单元格邻域4X4的范围内16个元素的Z轴数值,以此位置与单元格的距离差和16个邻域数值为参数,采用双三次样条曲线插值方法计算未知数值。
double CGV3dDEMGrid::GetValAtPosBiCubicSpline(double dx, double dy, double z_xy[4][4])
{
double a0, a2, a3, b1, b2, b3, c[4];
for(int i=0; i<4; i++)
{
a0 = z_xy[0][i] - z_xy[1][i];
a2 = z_xy[2][i] - z_xy[1][i];
a3 = z_xy[3][i] - z_xy[1][i];
b1 = -a0 / 3.0 + a2 - a3 / 6.0; //求解系数
b2 = a0 / 2.0 + a2 / 2.0;
b3 = -a0 / 6.0 - a2 / 2.0 + a3 / 6.0;
c[i] = z_xy[1][i] + b1 * dx + b2 * dx*dx + b3 * dx*dx*dx; //记录系数
}
a0 = c[0] - c[1];
a2 = c[2] - c[1];
a3 = c[3] - c[1];
b1 = -a0 / 3.0 + a2 - a3 / 6.0; //求解系数
b2 = a0 / 2.0 + a2 / 2.0;
b3 = -a0 / 6.0 - a2 / 2.0 + a3 / 6.0;
return( c[1] + b1 * dy + b2 * dy*dy + b3 * dy*dy*dy );
}
附图:
图1 10米分辨率重采样结果图
图2 原始数据显示图(5米分辨率)
图3 2.5米分辨率重采样结果图