Shapely多边形包含判断异常:视觉包含但返回False
Shapely多边形包含/相交判断异常问题排查与解决
问题原因
你构造的多边形b是无效的空多边形:
- 顶点存在大量重复值,比如
(243324,6254378)和(243330,6254383)重复出现,导致生成的几何没有面积、不具备有效多边形的形态。 - 在Shapely中,空多边形的
is_empty属性为True,这类几何对象无法参与正常的空间关系判断,因此contains、intersects、overlaps都会返回False——即使matplotlib把重复点画成了一个点/短线,看起来像是在a内部,但这并非有效多边形。
解决办法
1. 修复多边形顶点数据
确保多边形b的顶点是3个及以上不共线的唯一顶点,构造出有面积的有效多边形。比如修改b的顶点为:
b = shapely.geometry.Polygon(( (243324,6254378), (243330,6254383), (243328,6254375), (243324,6254378) # 闭合顶点 ))
2. 提前验证几何有效性
在进行空间关系判断前,先检查几何对象的有效性,避免无效几何导致的错误结果:
print("b是否为空:", b.is_empty) print("b是否有效:", b.is_valid)
修改后的完整测试代码
#!/usr/bin/env python import shapely import matplotlib.pyplot as plt def main(): a = shapely.geometry.Polygon(( (239948.84366885605,6247904.745529621),(238281.02710020886,6250794.291071406), (238693.67295395266,6251899.199182685),(238292.52776364237,6253065.862501571), (239369.8867152306,6255078.983834209),(241149.62036734243,6258808.484109194), (246601.12030818601,6254149.774368979),(247369.5081433506,6252263.219573404), (246378.77811632192,6251486.8296787),(246522.3713691934,6251301.933776115), (245312.5127001227,6249410.396470293),(243242.96423660984,6248751.24094899), (239948.84366885605,6247904.745529621) )) # 修复后的有效多边形b b = shapely.geometry.Polygon(( (243324,6254378), (243330,6254383), (243328,6254375), (243324,6254378) )) print("a.contains(b):", a.contains(b)) print("a.intersects(b):", a.intersects(b)) print("a.overlaps(b):", a.overlaps(b)) print("b是否为空:", b.is_empty) print("b是否有效:", b.is_valid) plt.plot(*a.exterior.xy, c='red') plt.plot(*b.exterior.xy, c='green') plt.gca().axis("equal") plt.show() if __name__ == '__main__': main()
预期输出说明
a.contains(b): True a.intersects(b): True a.overlaps(b): False
注:
overlaps返回False是因为Shapely中overlaps要求两个几何都有维度,且交集的维度与原几何相同,但当一个完全包含另一个时,交集是被包含的几何本身,不符合overlaps的定义(overlaps要求交集不是任何一个几何的全部)。如果需要判断两个几何有重叠区域,可以结合intersects和not contains/not within来实现。
内容的提问来源于stack exchange,提问作者aguilbau
相关产品推荐
相关产品推荐

