修复无效的多边形| Python身材匀称

jpc*_*cgt 29 python geometry shapely

如果Polygon的任何段相交,则Shapely将Polygon定义为无效,包括colinear的段.许多软件包将创建一个带有"切口"的区域或区域,如此处所示,其具有共线段(图像):

>>> pp = Polygon([(0,0), (0,3), (3,3), (3,0), (2,0), 
                  (2,2), (1,2), (1,1), (2,1), (2,0), (0,0)])
>>> pp.is_valid
WARNING:shapely.geos:Self-intersection at or near point 2 0
False
Run Code Online (Sandbox Code Playgroud)

自然地,剪切可以在Shapely中原生实现,或者这个相同的几何体可以实现为两个有效的多边形,但是如果我只有上面显示的点列表,那么就很容易"修复"这个(从中创建有效的几何体)点数清单)?

jpc*_*cgt 38

我发现了一个适用于特定情况的解决方案:

>>> 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)]
Run Code Online (Sandbox Code Playgroud)

  • 你需要对`buffer(0)`技术稍加注意.我们有蝴蝶结案例,它摧毁了多边形的大部分,只剩下一个小弓角.因人而异. (6认同)
  • 这种方法没有解决我的问题:我有一些自相交的多边形。 (2认同)

小智 15

Shapely 为此实施了一个解决方案。通过 pip,您可以使用任何 >= 1.8a3 的 shapely 版本并以这种方式导入:

from shapely.validation import make_valid
Run Code Online (Sandbox Code Playgroud)

通过 pip 和 conda 提供的 shapely 的当前版本包含该make_valid功能。如果您需要安装旧版本的 shapely,可以使用 shapely 实现,如下所示:

def make_valid(ob):

    from shapely.geometry.base import geom_factory
    from shapely.geos import lgeos
    
    if ob.is_valid:
        return ob

    return geom_factory(lgeos.GEOSMakeValid(ob._geom))
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,会引发以下异常: AttributeError: 'LGEOS360' object has no attribute 'GEOSMakeValid' 有异议,如何解决这个问题?我想使用 make_valid 函数,但在稳定版本(并且没有 alpha 版本)上...... (3认同)

Aid*_*ane 5

未经测试,但 Shapely 似乎现在添加了支持此功能的功能。

https://shapely.readthedocs.io/en/latest/manual.html#validation.make_valid