2

我在 MatLab 中遇到 TriScatteredInterp 的问题。我在该位置使用一组具有相应温度的坐标点。它们的形式都是度数(long、lat、temp)。我想在这些点上做一个插值,这样我就可以找出其他点的值并建立一个网格。这是我到目前为止所做的:

long = data(:,1)
lat = data(:,2)
values = data(:,3)
lat = lat.*(pi/180)
long = long.*(pi/180)
X = cos(lat).*cos(long)
Y = cos(lat).*sin(long)
Z = sin(lat)
F = TriScatteredInterp(X,Y,Z,values)
[long1 lat1] = meshgrid(-pi:pi/360:pi, -pi/2:pi/360:pi/2);
X1 = cos(lat1).*cos(long1)
Y1 = cos(lat1).*sin(long1)
Z1 = sin(lat1);
F.Method = 'natural'
InterpVals = F(X1,Y1,Z1);
mesh(long1, lat1, InterpVals)

正如您所看到的,对于每个(长、纬)点,我已经计算了球体上的对应点并使用了 3d 版本的 TriScatteredInterp。问题是插值仅适用于“最近”方法,因为线性或自然仅产生 NaN。正如我所读到的,当我想要插值的点在三角剖分的凸包之外时会发生这种情况,但是由于所需的点正好在球体上,并且输入点覆盖了整个范围(长:-180 到180,纬度:-90 到 90),我只是看不出所有的点怎么可能在凸包之外。任何帮助将不胜感激,ty。

4

1 回答 1

3

您应该在二维原始数据(longlat)上插值,而不是在三维原始数据(X Y Z 上插值。请注意,我为无法访问您的数据()的读者提供了一些虚拟数据生成器!

n = 100;
long = rand(n,1)*720-360;
lat = rand(n,1)*180-90;
values = rand(n,1)*30-5;
lat = lat.*(pi/180);
long = long.*(pi/180);

F = TriScatteredInterp(long,lat,values);
[long1 lat1] = meshgrid(-pi:pi/36:pi, -pi/2:pi/24:pi/2);
InterpVals = F(long1,lat1);

X1 = cos(lat1).*cos(long1);
Y1 = cos(lat1).*sin(long1);
Z1 = sin(lat1);
mesh(X1,Y1,Z1,InterpVals); %note here the meshing on the regular grid (X1,Y1,Z1)

地图边缘仍然存在问题,因为插值器不知道数据“环绕”。这些边缘上的InterpVals的内容将是.. NaN!

编辑:包装建议:1)重写 TriScatteredInterp 以便它使用模数;2)在地图的“边缘”周围镜像数据,插值,然后将其裁剪回原始大小;3) 查看 Matlab Mapping Toolbox,它可以分析和可视化地理信息。

于 2011-10-17T14:51:57.940 回答