【问题标题】:Convert polygons into mesh将多边形转换为网格
【发布时间】:2011-11-21 16:03:12
【问题描述】:

我有很多多边形。理想情况下,所有多边形不得相互重叠,但它们可以彼此相邻。

但实际上,我必须允许 轻微 多边形重叠(由一定的公差定义),因为所有这些多边形都是从用户手绘输入中获得的,这不像我那样机器精确希望他们成为。

我的问题是,是否有任何软件库组件:

  1. 允许输入一系列多边形
  2. 检查多边形的重叠是否超过了预先指定的容差
  3. 如果是,则停止,否则,继续
  4. 通过将公共顶点和边组合在一起,根据多边形的坐标和元素创建网格?
  5. 更重要的是,将网格边缘链接回原始多边形的边缘?

或者以前有人解决过这个问题吗?

【问题讨论】:

  • 多边形是二维还是三维?

标签: algorithm gis computational-geometry


【解决方案1】:

这个问题是 GIS 应用程序的日常“面包”——这正是在那里所做的。我们还在 GIS 课程中了解到这一点。研究 GIS 系统如何解决这个问题。例如。 ArcGIS 定义了所谓的拓扑规则,并具有一些功能来检查编辑的要素是否拓扑正确。见http://webhelp.esri.com/arcgisdesktop/9.2/index.cfm?TopicName=Topology_rules

【讨论】:

    【解决方案2】:

    这很长,只是因为问题太大了。我已尝试根据您的要点对我的 cmets 进行分组。

    绘制多边形的组件

    我的猜测是,如果不提供更多信息,您将获得有限的成功 - 绘制多边形的组件将与您在项目的其余部分使用的语言和 UI 范例非常耦合,即。 Web 组件的代码看起来与本机组件非常不同。

    也许另一种方法是将流程的这个元素与您尝试做的其他事情分开。有一些非常棒的预先存在的编辑器可用于创建 2d 和 3d 多边形。

    Inkscape 是矢量图形编辑器的一个示例,它可以轻松输入 2d 多边形,并具有生成输出 SVG 的优势,它相当容易解析。

    在三个维度Blender 是一个开源编辑器,可用于生成可导出为多种格式的任意几何图形。

    如果您可以使用 google-maps API(可能在原生 HTML 渲染控件中),并且您有兴趣在地图叠加层上添加空间点,您可能会对相关的click-to-draw polygon question on stackoverflow 感兴趣。根据以往的经验,OpenLayers 等其他地图 API 支持类似的方法。

    检查多边形是否重叠

    Thomas T 在他的answer 中指出,有一系列相关谓词可用于解决此问题和相关查询。如果您实际上只是在二维中寻找重叠和其他集合理论运算(并集、交集、集差),您可以使用General Polygon Clipper

    当两个多边形不重叠或不共享顶点时,您可能还需要考虑稍微更一般的问题。您可以使用 Minkowski 和来扩大(放大)二维和三维多边形以避免此类问题。 Computational Geometry Algorithms Library 具有这些算法的强大实现。

    我认为您更有可能真的在寻找一款可以执行顶点焊接的软件,Christer Ericson 的书Real-time Collision Detection 包含对该领域基础知识的广泛且非常易读的描述,以及相关问题边缘捕捉、裂纹检测、T 形接头等。然而,即使那本书包含了 sn-ps 代码,我知道没有现成的库可以解决这些问题,特别是除了基本的顶点焊接之外,没有给出任何完整的实现。

    显然所有 3D 软件包(blender、maya、max、rhino)都包含用于解决此问题的内置软件和工具。

    根据顶点对多边形进行分组

    从过去的经验来看,这是开发软件来解决该领域问题的最耗时的部分之一。它需要对图论和算法有合理的理解才能跨越边界。值得依靠实体几何或图形库为您完成繁重的工作。过去我在igraph 上取得了成功。

    将更新后的多边形链接回原始多边形。

    再一次,从过去的经验来看,这只是一个仔细记账的例子,并且预先对您的网格类进行了一些非常仔细的设计。我想提供更多建议,但即使在过去六个月的大部分时间都花在这上面之后,我仍然在努力寻找一种“好”的方法来做到这一点。

    其他评论

    如果您正在与用户交互,我强烈建议您尽可能避免此问题,方法是使用“捕捉”编辑器,将所有用户输入的点四舍五入到网格上。这有望显着减少您必须做的工作量。

    【讨论】:

      【解决方案3】:

      是的,您可以使用OGR。它有python绑定。具体来说,Geometry 类有一个 Intersects 方法。我不完全理解您在第 4 点和第 5 点中想要什么。

      【讨论】:

      • 我真的不认为 OGR 是相关的,我正在寻找通用算法,而不是一些应用程序来读取/写入具有 GIS 特定格式的文件。
      • 呃,我看到您正在寻找一个库,这正是 OGR 的含义。它可以进行全矢量操作,是许多 GIS 软件包的基础。所以是的,完全相关(除非你想手动完成)。
      • 交集方法/函数将解决重叠要求,但仅在 2d 中且仅在安装了 GEOS 的情况下。通常,这意味着从源代码构建。 Shapely 可能是更好的选择gispython.org/shapely/docs/1.0/manual.html
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 2016-06-07
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多