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)
小智 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)
未经测试,但 Shapely 似乎现在添加了支持此功能的功能。
https://shapely.readthedocs.io/en/latest/manual.html#validation.make_valid