如何从稀疏采样数据制作地形图?

时间:2009-08-26 17:15:12

标签: r curve-fitting numerical-methods topographical-lines

我需要制作一个地形的地形图,我只有相当稀疏的(x,y,altitude)数据样本。显然我不能制作一个完全准确的地图,但我想在某种意义上说“平滑”。我需要量化“平滑度”(可能是表面曲率平方的平均值的倒数),我想最小化一个目标函数,它是两个量的总和:

  • 表面粗糙度
  • 采样点表面高度与该点实际测量高度之间的均方距离

由于我真正想要的是地形图,我真的在寻找一种方法来构建恒定高度的等高线,并且可能有一些聪明的几何方法来做到这一点,而无需谈论表面。当然我希望轮廓线也很平滑。

欢迎任何和所有建议。我希望这是一个众所周知的数值问题。我对C很熟悉并且具有FORTRAN的工作知识。关于Matlab和R我很无能为力。


关于样品的位置:我们计划大致均匀间距,但我们会在地形更有趣的地方采集更多样品。因此,举例来说,我们将比平原更加密集地对山区进行采样。但是我们肯定会有一些关于采样的选择,如果这样可以简化问题,甚至可以采用样本。唯一的问题是

  • 我们不知道我们需要绘制多少地形才能找到我们正在寻找的功能。

  • 取样是中等昂贵的,大约10分钟。因此,对100x100网格进行采样可能需要很长时间。

4 个答案:

答案 0 :(得分:3)

Kriging interpolation可能有助于平滑插值稀疏样本。

答案 1 :(得分:3)

R有许多不同的相关工具。特别是,看看at the spatial view。一个类似的问题was asked in R-Help before, so you may want to look at that

查看contour函数。这是一些数据:

x <- seq(-3,3)
y <- seq(-3,3)

z <- outer(x,y, function(x,y,...) x^2 + y^2 )

初步情节有些粗糙:

contour(x,y,z, lty=1)
Bill Dunlap提出了一个改进:“通常可以更好地为数据拟合光滑的表面,在更精细的网格上评估该表面,并将结果传递给轮廓。这可确保轮廓线不会相互交叉,倾向于避免通过平滑轮廓线本身可能得到的虚假循环。薄板样条(来自库(“字段”)的Tps)和黄土(以及其他)可以适合表面。“

library("fields")
contour(predict.surface(Tps(as.matrix(expand.grid(x=x,y=y)),as.vector(z))))

这会产生非常平滑的情节,因为它首先使用Tps()拟合数据,然后调用contour。它最终看起来像这样(你也可以使用filled.contour,如果你想要它被着色):

对于绘图,您可以使用lattice(如上例所示)或ggplot2包。在这种情况下使用geom_contour()功能。示例can be found here (ht Thierry)

ds <- matrix(rnorm(100), nrow = 10) 
library(reshape) 
molten <- melt(data = ds) 
library(ggplot2) 
ggplot(molten, aes(x = X1, y = X2, z = value)) + geom_contour()

答案 2 :(得分:2)

contouring algorithm的优秀评论,您可能需要首先对曲面进行网格化以插入网格。

答案 3 :(得分:1)

也许你可以使用:

in R