将多边形转换为网格

时间:2011-09-21 06:35:29

标签: algorithm gis computational-geometry

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

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

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

  1. 允许输入一系列多边形
  2. 检查多边形是否重叠超过预先规定的公差
  3. 如果是,则停止,否则,继续
  4. 通过将公共顶点和边缘组合在一起,根据多边形的坐标和元素创建网格物体?
  5. 更重要的是,将网格边缘链接回原始多边形的边缘?
  6. 或者之前是否有人处理此问题?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

绘制多边形的组件

我的猜测是,如果不提供更多信息,您将获得有限的成功 - 绘制多边形的组件将非常多地与您用于项目其余部分的语言和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型接头等问题。但是,即使该书中包含了代码片段,我也知道没有现成的库来解决这些问题,特别是除了基本的顶点焊接之外,没有给出任何完整的实现。

显然,所有3D软件包(blender,maya,max,rhino)都包含内置的软件和工具来解决这个问题。

基于顶点分组多边形

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

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

同样,从过去的经验来看,这只是一个仔细记账的情况,并且预先设计了一些非常仔细的网格类设计。我想提出更多的建议,但即使在过去六个月中花了很大一部分,我仍然在努力找到一个“好”的方法来做到这一点。

其他评论

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

答案 2 :(得分:1)

是的,您可以使用OGR。它有python绑定。具体来说,Geometry类具有Intersects方法。我不完全明白你想要的第4和第5点。