Python中Shapely的contains方法对同一多边形输出为何不一致?
为什么Shapely中同一多边形调用contains()结果不同?
核心原因:多边形有效性问题
- 先看你定义的两个多边形:
poly1 = geometry.Polygon([[3,0], [1,0], [0, 1], [1,1]]):顶点连接后是无自相交的简单四边形,通过poly1.is_valid可验证它是有效的多边形。对于有效多边形,contains()方法符合预期,因此poly1.contains(poly1)返回True。poly2 = geometry.Polygon([[0,0], [1,0], [0, 1], [1,1]]):顶点依次连接后会形成自相交的复杂四边形(交叉形状)。Shapely的Polygon要求必须是边界无自相交的简单多边形,这种自相交的多边形属于无效状态(poly2.is_valid会返回False)。无效多边形的内部区域定义不符合OGC空间标准,导致contains()方法行为异常,所以poly2.contains(poly2)返回False。
关于互相包含的结果
poly1.contains(poly2)和poly2.contains(poly1)都返回False是正常的:
- poly1的范围是x=0到3、y=0到1;poly2的范围是x=0到1、y=0到1。poly2仅覆盖poly1的部分区域,poly1无法完全包含poly2;反过来poly2范围更小,也不可能包含poly1,因此两者互相包含的判断均为
False。
解决方法:修复无效多边形
如果需要让poly2成为有效的多边形,可以用Shapely的buffer(0)方法自动修复自相交问题:
valid_poly2 = poly2.buffer(0) print(valid_poly2.is_valid) # 返回True print(valid_poly2.contains(valid_poly2)) # 返回True
或者用polygonize方法处理边界线,生成分割后的有效多边形:
from shapely.ops import polygonize from shapely.geometry import LineString line = LineString(poly2.exterior.coords) valid_polygons = list(polygonize([line])) # 会得到两个不相交的三角形,对应自相交四边形分割后的部分
内容的提问来源于stack exchange,提问作者Felixstd
相关产品推荐
相关产品推荐

