我需要制作一个地形的地形图,我只有相当稀疏的(x,y,altitude)数据样本。显然我不能制作一个完全准确的地图,但我想在某种意义上说“平滑”。我需要量化“平滑度”(可能是表面曲率平方的平均值的倒数),我想最小化一个目标函数,它是两个量的总和:
由于我真正想要的是地形图,我真的在寻找一种方法来构建恒定高度的等高线,并且可能有一些聪明的几何方法来做到这一点,而无需谈论表面。当然我希望轮廓线也很平滑。
欢迎任何和所有建议。我希望这是一个众所周知的数值问题。我对C很熟悉并且具有FORTRAN的工作知识。关于Matlab和R我很无能为力。
关于样品的位置:我们计划大致均匀间距,但我们会在地形更有趣的地方采集更多样品。因此,举例来说,我们将比平原更加密集地对山区进行采样。但是我们肯定会有一些关于采样的选择,如果这样可以简化问题,甚至可以采用样本。唯一的问题是
我们不知道我们需要绘制多少地形才能找到我们正在寻找的功能。
取样是中等昂贵的,大约10分钟。因此,对100x100网格进行采样可能需要很长时间。
答案 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)