如何用MultiLineString分割Shapely中的MultiPolygon区域?
解决方案:Shapely用MultiLineString分割MultiPolygon报错处理
错误原因
报错的核心原因是Shapely的split函数不支持用MultiLineString直接分割Polygon,仅允许单个LineString作为分割器对Polygon执行分割操作。当你传入MultiLineString时,内部处理子Polygon时就会触发这个类型错误。
解决思路
需要拆解操作,分步骤处理:
- 遍历MultiPolygon中的每个子Polygon
- 对每个子Polygon,依次用MultiLineString中的每条LineString执行分割(仅处理相交的情况)
- 最后将所有分割后的多边形整合为新的MultiPolygon
修改后的代码
from shapely.geometry import MultiPolygon, Polygon, MultiLineString, LineString from shapely.ops import split multipolygon = MultiPolygon([ Polygon([(7, 10), (8, 11), (9, 11), (8, 10), (7, 9.5), (7, 10)]), Polygon([(9.5, 8.5), (10, 9), (10, 10), (11, 9), (9.5, 8.5)]) ]) multiline = MultiLineString([ LineString([(7, 10), (8, 10)]), LineString([(8, 10), (8, 11)]), LineString([(10, 9), (11, 9 )]), LineString([(8, 9), (10, 9)]) ]) divided_polygons = [] # 遍历MultiPolygon中的每个子多边形 for poly in multipolygon.geoms: current_polygons = [poly] # 用每条线段依次分割当前多边形集合 for line in multiline.geoms: temp_list = [] for geom in current_polygons: # 仅当线段与多边形相交时执行分割,避免无效操作 if geom.intersects(line): split_result = split(geom, line) temp_list.extend(split_result.geoms) else: temp_list.append(geom) current_polygons = temp_list divided_polygons.extend(current_polygons) # 组合成最终的MultiPolygon divided_multipolygon = MultiPolygon(divided_polygons) print("Divided MultiPolygon:", divided_multipolygon)
说明
- 代码通过两层循环实现:外层遍历MultiPolygon的子Polygon,内层遍历每条分割线段
- 加入
intersects判断,跳过与当前多边形不相交的线段,减少不必要的计算 - 每次分割后更新当前多边形集合,确保后续分割基于最新的结果执行
内容的提问来源于stack exchange,提问作者Prateek Tewary
相关产品推荐
相关产品推荐

