Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Shapely中修复无效多边形_Python_Geometry_Shapely - Fatal编程技术网

Python 在Shapely中修复无效多边形

Python 在Shapely中修复无效多边形,python,geometry,shapely,Python,Geometry,Shapely,如果多边形的任何线段(包括共线线段)相交,Shapely将多边形定义为无效。许多软件包将创建一个具有“剪切”的区域或区域,如图所示,该区域或区域具有共线线段: 当然,剪切可以自然地以Shapely方式实现,或者相同的几何体可以实现为两个有效的多边形,但是如果我只有上面显示的点列表,是否有一个简单的“修复”方法(从该点列表创建有效的几何体)?我找到了一个适用于给定特定情况的解决方案: >>> pp2 = pp.buffer(0) >>> pp2.is_vali

如果多边形的任何线段(包括共线线段)相交,Shapely将多边形定义为无效。许多软件包将创建一个具有“剪切”的区域或区域,如图所示,该区域或区域具有共线线段:


当然,剪切可以自然地以Shapely方式实现,或者相同的几何体可以实现为两个有效的多边形,但是如果我只有上面显示的点列表,是否有一个简单的“修复”方法(从该点列表创建有效的几何体)?

我找到了一个适用于给定特定情况的解决方案:

>>> pp2 = pp.buffer(0)
>>> pp2.is_valid
True
>>> pp2.exterior.coords[:]
[(0.0, 0.0), (0.0, 3.0), (3.0, 3.0), (3.0, 0.0), (2.0, 0.0), (0.0, 0.0)]
>>> pp2.interiors[0].coords[:]
[(2.0, 1.0), (2.0, 2.0), (1.0, 2.0), (1.0, 1.0), (2.0, 1.0)]

我的几何图形也有类似的问题。所以我首先用一个很小的公差简化了几何体。然后,我检查多边形外部的每一行相邻坐标是否与另一行相交(或接触)。如果他们这样做了,我将相交点处的多边形分成两个几何体。我递归地这样做,直到多边形的每个子几何体都是空的、直线或有效多边形

接下来,我过滤多边形的结果,并用集合中的所有其他多边形剪裁每个多边形。我得到的是一个只有“内部”区域的有效多边形列表。在这一点上,如果我有任何已知的有效的内饰,我也剪掉了它们。 最后,我构建了所有剩余子几何体片段的一元_并集()

我认为你的情况导致:

多边形(((0,0)、(0,3)、(3,3)、(3,0))、((1,1)、(2,1)、(2,2)、(1,2)))

它是一个内部为1x1的多边形


可能有点计算密集,但它可以工作并修复几乎所有损坏的二维多边形。

我发现这种缓冲区(0)方法通常适用于修复子多边形之间具有重合线的多边形。这是非常有用的。你知道有哪个地方正式推荐/认可这个技巧吗?这个方法并没有解决我的问题:我有一些自交多多边形。你需要小心使用
缓冲区(0)
技术。我们有过蝴蝶结案例,它破坏了多边形的大部分,只留下了一个小蝴蝶结角。对我来说,它创建了一个有效的多边形,但它不再有任何.external.coords,所以它仍然不能用于.inthein(polygon)分析。
>>> pp2 = pp.buffer(0)
>>> pp2.is_valid
True
>>> pp2.exterior.coords[:]
[(0.0, 0.0), (0.0, 3.0), (3.0, 3.0), (3.0, 0.0), (2.0, 0.0), (0.0, 0.0)]
>>> pp2.interiors[0].coords[:]
[(2.0, 1.0), (2.0, 2.0), (1.0, 2.0), (1.0, 1.0), (2.0, 1.0)]