如何用多条线段分割/切割多边形区域?

问题描述 投票:0回答:2

我有一个多边形区域poly1和另一个多边形区域poly2(两者都是形状上的多边形),然后我取它们的对称差,这是一个多重多边形。

有线段连接poly1和poly2的顶点。我想用线段分割通过对称差获得的多边形(这些线段位于多边形本身上)。

我运行的代码出现错误:

File "/home/runner/Python/.pythonlibs/lib/python3.10/site-packages/shapely/ops.py", line 511, in split
    [i for part in geom.geoms for i in SplitOp.split(part, splitter).geoms]
  File "/home/runner/Python/.pythonlibs/lib/python3.10/site-packages/shapely/ops.py", line 511, in <listcomp>
    [i for part in geom.geoms for i in SplitOp.split(part, splitter).geoms]
  File "/home/runner/Python/.pythonlibs/lib/python3.10/site-packages/shapely/ops.py", line 535, in split
    raise GeometryTypeError(
shapely.errors.GeometryTypeError: Splitting a Polygon with a MultiLineString is not supported

代码-

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)])
])

# Divide multipolygon by lines
divided_multipolygon = split(multipolygon, multiline)

print("Divided MultiPolygon:", divided_multipolygon)

我怎样才能完成我的任务?任何建议或帮助将不胜感激!

python geometry shapely
2个回答
0
投票

您收到的错误是因为

split()
操作不支持将
Polygon
MultiLineString
分开。它期望单个
LineString
来分割
Polygon

您最好的选择是迭代每个

LineString
并使用之前的结果更新下一次迭代的
MultiPolygon

split_polygons = []

for line in multiline:
   result = split(multipolygon, line)
   split_polygons.extend(result)

0
投票

您可以循环遍历 MultiLine 中的单条线,并分多次分割 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)]),
    ]
)

# Divide multipolygon by lines
for line in multiline.geoms:
    multipolygon = MultiPolygon(split(multipolygon, line).geoms)

print("Divided MultiPolygon:", multipolygon)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.