我有一个多边形区域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)
我怎样才能完成我的任务?任何建议或帮助将不胜感激!
您收到的错误是因为
split()
操作不支持将 Polygon
与 MultiLineString
分开。它期望单个 LineString
来分割 Polygon
。
您最好的选择是迭代每个
LineString
并使用之前的结果更新下一次迭代的 MultiPolygon
。
split_polygons = []
for line in multiline:
result = split(multipolygon, line)
split_polygons.extend(result)
您可以循环遍历 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)