我有很多多边形。理想情况下,所有多边形不得相互重叠,但它们可以彼此相邻。
但实际上,我必须允许轻微的多边形重叠(由一定的公差定义),因为所有这些多边形都是从用户手绘图输入中获得的,这不是像我一样的机器精度希望他们成为。
我的问题是,是否有任何软件库组件:
或者之前是否有人处理此问题?
答案 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点。