c# - 快速查找并渲染给定海拔以上的地形

标签 c# map gis terrain cartography

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

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

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

最佳答案

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

如果您正在处理栅格数据(在矩形网格上采样),请试试这个。

将您的网格想象成直角三角形的组合。

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

  • abc
  • d e f
  • g h k

你的三角形是:

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

你的算法有这些步骤。

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

  2. 将这些三角形组合起来形成一个多边形区域。

  3. 确定多边形的边界。

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

如果您想要生成好看的轮廓线,则第 4 步很难正确执行。

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

对于每个三角形,如果所有三个顶点都高于阈值,则将整个三角形包含在您的列表中。如果全部都在下面,请忘记三角形。如果一些顶点在上方而另一些在下方,则通过添加恰好位于高程线上的新顶点(通过插值高程)将三角形分成三部分。将这些新三角形中的一两个包含在您的高地列表中。

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

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

关于c# - 快速查找并渲染给定海拔以上的地形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4330213/

相关文章:

c# - 使用一个签名签署 PDF,但具有多个签名外观

php - 操纵 map

Python:将多个 LANDSAT 图像导入 Grass GIS 的脚本

c# - 在 WPF XAML 中,如何连接 2 个常量以便使用预定义路径?

c# - 在方法中更改结构

scala - 如何在 Scala 中为特定 Map 类型创建类型别名

java - C++ 到 Java : searching a collection efficiently

c# - 用户代码未处理常规转换 InvalidOperationException

c# - Sharepoint 2013 中的联合身份验证 : getting rtFa and FedAuth cookies

c++ - 在 std::map 中打印迭代器的索引