You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:13:18