从一组相交线生成多边形


10

这是一个简单且非常常见的问题,已经针对不同的目的提出了此问题(例如,请参见此链接也可以参见此链接),但是,在这里,我们寻找的不是软件包,而是我们可以尝试实现的算法Python

因此,如下图所示,映射了一组线(BTW已被修剪)。
生成多边形的算法/想法(如红色所示)

在此处输入图片说明


是否要从输入线中读取外部正方形边界?
Devdatta Tengshe

Answers:


5

好吧,我们在这里放一个答案,但这并不是对我们问题的完整答案,也就是说,该问题将保持“ 开放待回答 ”的状态。但是,这是该问题的解决方案。这是我们使用的技巧:

首先让我们看一下结果
在此处输入图片说明

因此,left图中所示的已建多边形中的给定线middle。它们是实多边形,如right;)中所示。

对于下面给出的算法,我们ShapelyPython中使用package 。

  • 行==> MultiLineString {:: M}
  • 添加一个微小的buffer,说eps{:: MB}
  • 区域==> Polygon {:: P}(此处为正方形)
  • P.difference(MB) {产生多边形}

请注意,它运行时非常安静。但是,缺少的一点是该算法不是从直线构建多边形的原始方法。但是,它非常适合我们遇到的问题。


4

JTS拓扑套件具有Polygonizer类,几乎可以做到这一点。

您可以查看此处提供的源代码,并将其转换为Python。


正如代码说明所说的那样,它不能按问题作者的预期进行工作:“边缘必须正确连接;也就是说,它们只能在端点连接。多边形生成器将在节点输入不正确的情况下运行,但不会由非多边形形成多边形节点的边缘”
Pablo

1
JTS中有一项操作可以正确地在顶点处分割线。也许OP也可以考虑这一点。
Devdatta Tengshe

3

您可能会看看Python Shapely包,特别是polygonize()


快速说明一下Shapely(from shapely.ops import polygonize)中的多边形使用GEOS.Polygonize from GEOS。因此,这是一个链接,其中有指向链接的链接...:|
2013年

我们的试用polygonize根本没有成功。但是,感谢您提醒我们Shapely可以找到答案的解决方案(实际上是一个技巧)。
开发人员

2

这是我们可以找到的另一种解决方案。

使用 DCEL我们可以使接触线成为障碍。

对于Python,有一个软件包{here}。这是一个很小的实现,带有一些错误。然而,经过一些努力,它可以用于此问题。另请注意以下阶段:

可以找到线之间所有交点的预处理阶段。然后,相应地,所有线在交互点处都被细分为段。交点列表和关联边列表是DCEL所需要的。


由于此方法是原始解决方案,因此与difference使用操作的其他方法相比,性能要好得多。
开发人员
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.