Python使用shapely计算两矩形交集面积报TopologyException错误如何解决?
报错原因
Shapely构造Polygon对象时,要求传入的顶点必须按顺时针/逆时针方向沿多边形边界连续排列,不能出现跨对角线的点顺序。
你当前传入的顶点顺序存在错误,例如第一个矩形的顶点列表为[(-3, 2), (1, 2), (-3, -2), (1, -2)],连线时会从右上点(1,2)直接跨对角线连到左下点(-3,-2),生成自相交的无效多边形,因此触发拓扑错误。你可以通过polygon.is_valid属性验证几何体有效性,无效几何体会返回False。
解决方法
方案1:修正顶点排列顺序
将矩形顶点调整为沿边连续排列的顺序即可,例如改为左上→右上→右下→左下的顺序:
from shapely.geometry import Polygon # 修正顶点顺序 polygon = Polygon([(-3, 2), (1, 2), (1, -2), (-3, -2)]) other_polygon = Polygon([(2, 1), (-1, 1), (-1, 4), (2, 4)]) if polygon.overlaps(other_polygon): print( polygon.intersection(other_polygon).area ) else: print(0)
方案2:使用box方法简化矩形构造
Shapely提供了内置的矩形构造方法shapely.geometry.box,仅需要传入矩形的最小x、最小y、最大x、最大y四个值即可生成有效矩形,完全规避顶点顺序错误的问题,同时可以大幅简化你现有的坐标处理逻辑:
from shapely.geometry import box # 传入参数格式:box(minx, miny, maxx, maxy) polygon = box(min(-3,1), min(2,-2), max(-3,1), max(2,-2)) other_polygon = box(min(2,-1), min(1,4), max(2,-1), max(1,4)) if polygon.overlaps(other_polygon): print(polygon.intersection(other_polygon).area) else: print(0)
如果需要适配你自己的坐标输入逻辑,只需要从两个对角点中提取出x的最大、最小值和y的最大、最小值,直接传入box方法即可,不需要再做复杂的顶点类型判断和排序。
内容的提问来源于stack exchange,提问作者PlatPlayZ
相关产品推荐
相关产品推荐

