6

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

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

因为我真正想要的是一张地形图,所以我真的在寻找一种方法来构建等高线的等高线,并且可能有一些巧妙的几何方法可以做到这一点,而不必谈论表面。当然,我希望轮廓线也很平滑。

欢迎任何和所有建议。我希望这是一个众所周知的数值问题。我对 C 语言非常熟悉,并且具备 FORTRAN 的工作知识。关于 Matlab 和 R 我相当一无所知。


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

  • 我们不知道需要映射多少地形才能找到我们正在寻找的特征。

  • 取样费用适中,大约需要 10 分钟。因此,对 100x100 网格进行采样可能需要很长时间。

4

4 回答 4

3

R 有许多不同的相关工具。特别是看一下空间视图。之前在 R-Help 中提出了一个类似的问题,所以你可能想看看.

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()功能。可以在这里找到一个例子(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()
于 2009-09-30T18:51:42.570 回答
3

克里金插值可能对平滑插值稀疏样本有一些用处。

于 2009-08-26T17:51:44.497 回答
2

对等高线算法的出色回顾,您可能需要先对表面进行网格化以插入网格。

于 2009-08-26T17:28:26.790 回答
1

也许你可以使用:

在 R 中

于 2009-08-26T17:40:28.870 回答