快速查找并渲染给定高程以上的地形

时间:2010-12-01 23:29:10

标签: c# map gis terrain cartography

给定由纬度/经度/高程对组成的高程图,找到给定高程水平以上的所有点的最快方法是什么(或者更好的是,只有2D凹面船体)?

我正在开发一个GIS应用程序,我需要在地图上方渲染一个叠加层,以便直观地显示海拔较高的区域;它正在确定这个多边形/区域让我难倒(现在)。我有一个简单的纬度/经度/高程对数组(更具体地说是GTOPO30 DEM文件),但我可以自由地将其转换为您建议的任何数据结构。

我们一直指向三角网不规则网络(TIN),但我不确定在生成TIN后如何有效地查询数据。如果我们的问题可以像人们如何生成等高线图那样解决,我也不会感到惊讶,但我没有任何经验。任何建议都很棒。

5 个答案:

答案 0 :(得分:1)

听起来你正在尝试创建高地边界的多边形表示。

如果您正在处理栅格数据(在矩形网格上采样),请尝试此操作。

将您的网格视为直角三角形的集合。

假设您有一个3x3点数网格

  • a b c
  • d e f
  • g h k

你的三角形是:

  • abd部分矩形abed
  • bde矩形的另一部分abed
  • bef矩形bcfe的一部分
  • cef矩形的另一部分bcfe
  • dge ......等等

您的算法有以下步骤。

  1. 构建高于海拔阈值的三角形列表。

  2. 取这些三角形的并集来形成多边形区域。

  3. 确定多边形的边界。

  4. 如有必要,请平滑多边形边界以使图层在显示时看起来正常。

  5. 如果你想要产生漂亮的轮廓线,第4步很难做到。

    第1步是解决这个问题的关键。

    对于每个三角形,如果所有三个顶点都高于阈值,请在列表中包含整个三角形。如果所有都在下面,忘记三角形。如果某些顶点位于上方,而其他顶点位于下方,则通过添加精确位于高程线上的新顶点(通过插值高程)将三角形拆分为三个。在高地列表中包含一个或两个新三角形。

    对于其余步骤,您需要一个像样的二维几何处理库。

    如果您的点不在常规网格上,请首先使用Delaunay算法(您可以查找)将您的点组织成三角形。然后按照我上面提到的相同算法。警告。如果你没有多少分,这看起来会有点粗略。

答案 1 :(得分:0)

假设您将纬度/经度/高程数据存储在一个数组(或三个独立的数组)中,您应该能够使用数组查询技术来选择高程高于某个阈值的所有点。例如,在使用numpy的python中,您可以执行以下操作:

indices = where(array > value)

indices变量将包含array的所有元素的索引,大于阈值value。类似的命令有各种其他语言(例如IDL有WHERE()命令,类似的东西可以用Matlab完成。)

获得此索引列表后,您可以创建一个新的二进制数组,其中每个满足阈值的位置都设置为1:

binary_array[indices] = 1

(假设您创建了一个与原始纬度/长度/高度大小相同的空白数组,并将其称为binary_array

如果你正在使用栅格数据(我推荐这种类型的工作),你可能会发现你可以简单地在地图上叠加这个数组,然后出现一组很好的区域。但是,如果您需要将高程阈值以上的区域转换为矢量多边形,那么您可以使用许多内置GIS方法之一来转换栅格 - >向量。

答案 2 :(得分:0)

我会使用嵌套的C-squares排列,每个方格都有一个预先计算出的最大地面高度。这将允许我在高水平扫描,丢弃任何最大高度不高于搜索高度的方格,并进一步钻进那些地面部分高于搜索高度的方格。

如果您正在处理各种设定级别的搜索高度,则可以为您决定使用的最小方块(或所有方块)预先计算凸包的各种预定义级别。

答案 3 :(得分:0)

我不确定你的lat / lon / alt点是否在常规网格上,但如果没有,也许它们可以被插值以表示甚至100' ft高度增量,均匀 lat / lon分区(记住这不会给出均匀的距离分割)。但如果这样可行,为什么不预先计算三维数组,其中索引分别代表高度,纬度和经度。然后当飞机需要关于高度或高于某一高度的点的数据时,对于特定的地形,代码只需要读出该阵列中的一小部分数据,该数据被编入索引以制作连续的"体素&# 34;在索引方案中是连续的。

当然,经度的增量不一定是均匀的:如果需要均匀的距离,相同的方案就可以工作,但经度的指数会指向一组不均匀的经度。

我认为没有更快的搜索方法。

答案 4 :(得分:0)

从您的问题中不清楚点集是否是静态的,您需要多次找到高于给定高程的点,或者您只需要执行一次查询。

最简单的解决方案是将点存储在数组中,按高程排序。查找特定高程范围内的所有点只是二进制搜索,您只需要排序一次。

如果您只需要执行一次查询,只需按照获得的顺序对数组进行线性搜索。无论如何,从数组构建一个更好的数据结构将是O(n),因此通过使事情复杂化将无法获得更好的结果。

如果您有其他一些要求,比如说您需要有效地列出用户正在查看的某个矩形内的所有点,或者可以在运行时添加或删除这些点,那么不同的数据结构可能会更好。大概是某种树或网格。

如果您关心的只是渲染,您可以使用图形硬件非常有效地执行此操作,并且根本不需要使用花哨的数据结构,您只需将三角形发送到GPU并让它杀死上面的碎片或者低于某个高度。