代码之家  ›  专栏  ›  技术社区  ›  Norman Ramsey

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

  •  6
  • Norman Ramsey  · 技术社区  · 15 年前

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

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

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

    欢迎提出任何建议。我希望这是一个众所周知的数值问题。我对C语言很熟悉,对FORTRAN有一定的工作知识。关于Matlab和R我完全不知道。


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

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

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

    4 回复  |  直到 15 年前
        1
  •  3
  •   Jim Lewis    15 年前

    Kriging interpolation 可能对平滑插值稀疏样本有一定的用处。

        2
  •  3
  •   Shane    15 年前

    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提出了一个改进方案:“将平滑的曲面拟合到数据中,在更精细的网格上对该曲面进行求值,并将结果传递给contour,通常效果更好。这样可以确保轮廓线不会相互交叉,并避免可能从平滑轮廓线本身获得的虚假循环。薄板样条(Tps from library(“fields”))和黄土(以及其他)可以适合表面

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

    这会产生非常平滑的绘图,因为它使用 Tps() 先适应数据,然后调用 轮廓 . 它最终看起来是这样的(如果希望着色,也可以使用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()
    
        3
  •  2
  •   Community CDub    8 年前

    优秀评论 contouring algorithm ,可能需要先对曲面进行网格划分才能插值到网格上。

        4
  •  1
  •   pageman    15 年前