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

6
我需要制作一个地形的等高线图,但只有相对稀疏的(x,y,高度)数据样本。显然我无法制作完全准确的地图,但我希望它在某种意义上是“平滑”的。我需要量化“平滑度”(可能是曲面曲率平方倒数的平均值),并且我想要将目标函数最小化为两个量的总和:
- 表面的粗糙程度 - 样本点处表面高度与实际测量高度之间的均方距离
由于我实际上想要的是地形图,因此我真正在寻找一种构建等高线的方法,而不必谈论曲面。当然,我也希望等高线是平滑的。
欢迎任何建议。我很舒适使用 C,并且具有 FORTRAN 的工作知识。关于 Matlab 和 R,我相当无知。
关于样本点的位置:我们计划大致均匀地分布,但会在地形更有趣的地方取更多的样本。因此,例如,在山区我们将更密集地采样,而在平原上则较少。但我们肯定有一些关于采样的选择,并且如果简化了问题,可以进行均匀采样。唯一的问题是:
- 我们不知道需要绘制多少地形才能找到我们正在寻找的特征。 - 取样是中等昂贵的,大约需要 10 分钟。因此,采样一个 100x100 的网格可能需要很长时间。

你的样本是均匀间隔还是随机的? - Mark Ransom
马克:我们可以把它们放在任何地方。我已经在上面加了一个注释。 - Norman Ramsey
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提出了一个改进意见:“通常更好的方法是将数据拟合成光滑曲面,在更细的网格上评估该曲面,并将结果传递给等高线。这样可以确保等高线不会相互交叉,并且往往避免了从平滑等高线本身中得到的虚假环。Thin plate splines(来自library(“fields”)的Tps)和loess(等等)可以拟合曲面。”

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()

3

2
优秀的轮廓算法评论,您可能需要先对表面进行网格化处理,然后再进行插值。

不再出现错误,但我认为这并不是对所提出问题的真正答案。似乎这个外部资源需要有一个函数,并从该函数中绘制等高线图。 - IRTFM

1

很抱歉,这个问题有点零散,不太能提供帮助。GEOMap可能会有用,但是文档太复杂了,我无法判断。生成拓扑地图(Generative Topographic Map)看起来更有前景。 - Norman Ramsey
实际上这就是GTM - 生成拓扑映射 - http://cran.r-project.org/web/packages/gtm/gtm.pdf - pageman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接