给定一个由纬度/经度/高程对组成的高程图,找到给定高程水平以上的所有点(或者更好的是,仅找到 2D 凹包)的最快方法是什么?
我正在开发一个 GIS 应用程序,我需要在 map 上渲染叠加层以直观地指示海拔较高的区域;它正在确定这个让我难过的多边形/区域(目前)。我有一个简单的纬度/经度/高程对数组(更具体地说,GTOPO30 DEM 文件),但我可以随意将其转换为您建议的任何数据结构。
我们已被指向不规则三角网 (TIN),但我不确定在生成 TIN 后如何有效地查询该数据。如果我们的问题可以像生成等值线图一样得到解决,我不会感到惊讶,但我对此没有任何经验。任何建议都会很棒。
最佳答案
听起来您正在尝试创建高地边界的多边形表示。
如果您正在处理栅格数据(在矩形网格上采样),请试试这个。
将您的网格想象成直角三角形的组合。
假设您有一个 3x3 的点网格
- abc
- d e f
- g h k
你的三角形是:
- 矩形abd的abd部分
- bde 矩形的另一部分
- bef 矩形 bcfe 的一部分
- cef矩形bcfe的另一部分
- dge ...等等
你的算法有这些步骤。
构建高于海拔阈值的三角形列表。
将这些三角形组合起来形成一个多边形区域。
确定多边形的边界。
如有必要,平滑多边形边界以使图层在显示时看起来正常。
如果您想要生成好看的轮廓线,则第 4 步很难正确执行。
第一步是解决这个问题的关键。
对于每个三角形,如果所有三个顶点都高于阈值,则将整个三角形包含在您的列表中。如果全部都在下面,请忘记三角形。如果一些顶点在上方而另一些在下方,则通过添加恰好位于高程线上的新顶点(通过插值高程)将三角形分成三部分。将这些新三角形中的一两个包含在您的高地列表中。
对于其余步骤,您需要一个合适的二维几何处理库。
如果您的点不在规则网格上,请先使用 Delaunay 算法(您可以查找该算法)将您的点组织成三角形。然后按照我上面提到的相同算法。警告。如果你没有很多点,这看起来有点粗略。
关于c# - 快速查找并渲染给定海拔以上的地形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4330213/