给定由纬度/经度/高程对组成的高程图,找到给定高程水平以上的所有点的最快方法是什么(或者更好的是,只有2D凹面船体)?
我正在开发一个GIS应用程序,我需要在地图上方渲染一个叠加层,以便直观地显示海拔较高的区域;它正在确定这个多边形/区域让我难倒(现在)。我有一个简单的纬度/经度/高程对数组(更具体地说是GTOPO30 DEM文件),但我可以自由地将其转换为您建议的任何数据结构。
我们一直指向三角网不规则网络(TIN),但我不确定在生成TIN后如何有效地查询数据。如果我们的问题可以像人们如何生成等高线图那样解决,我也不会感到惊讶,但我没有任何经验。任何建议都很棒。
答案 0 :(得分:1)
听起来你正在尝试创建高地边界的多边形表示。
如果您正在处理栅格数据(在矩形网格上采样),请尝试此操作。
将您的网格视为直角三角形的集合。
假设您有一个3x3点数网格
你的三角形是:
您的算法有以下步骤。
构建高于海拔阈值的三角形列表。
取这些三角形的并集来形成多边形区域。
确定多边形的边界。
如有必要,请平滑多边形边界以使图层在显示时看起来正常。
如果你想要产生漂亮的轮廓线,第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并让它杀死上面的碎片或者低于某个高度。