如何在MatLab中使用TriScatteredInterp?

时间:2011-10-17 13:18:17

标签: matlab interpolation points

我在MatLab中遇到TriScatteredInterp问题。 我正在使用一组坐标点以及该位置的相应温度。它们都是度数(长,纬度,温度)。我想在这些点上进行插值,这样我就可以找到其他点的值并构建一个网格。 这是我到目前为止所做的:

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)

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

1 个答案:

答案 0 :(得分:3)

您应该在二维原始数据( lat )上插入,而不是在三维原始数据上插入(< em> 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,它可以分析和可视化地理信息。