2011-10-17 246 views
2

我在MatLab中遇到TriScatteredInterp问题。 我正在使用一组具有相应温度的坐标点。他们都是在程度(长,拉特,温度)。我想在这些点上插入一个插值,以便我可以找出其他点的值并构建网格。 这是我迄今所做的:如何在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) 

正如你可以看到每一个(长,LAT)点,我已经计算在球体上的对应点,并使用TriScatteredInterp的3D版本。 问题是插值只适用于'最近'的方法,因为线性或自然只产生NaN。正如我已经读过的,当我要插入的点位于三角形的凸包外部时,会发生这种情况,但是所需的点恰好位于球体上,并且输入点覆盖整个范围(Long:-180至180,Lat:-90到90),我只是看不到所有的点可能在凸包外。任何帮助将不胜感激,ty。

回答

3

你应该在两维的原始数据(LAT)插,而不是在三维的(Xÿž)。 请注意,我包含一些虚拟数据生成器,用于无法访问数据的读取器()!

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,它可以分析和可视化地理信息。

+0

这就是为什么我尝试三维插值的原因,因为我需要生成的数据具有相应的连接边缘,以便具有与地球形状相关的准确数据。 – Adrian 2011-10-18 05:41:53

+0

您的网格(由矩形面组成)近似于球体。像你的数据一样,它的顶点位于球体上。然而,面孔在球体内部。实际上,所有数据都在网格定义的凸包外。因此你得到NaN!这与我之前暗示的相关。 – 2011-10-18 12:48:04

+0

好吧,我现在明白了,只有建立三角测量的顶点同时在球体上和网格上。我查询的点位于球体上并靠近网格面,但不在它们上面。 – Adrian 2011-10-18 14:33:11