gpt4 book ai didi

python - 拆分自相交多边形仅在 Shapely 中返回一个多边形

转载 作者:太空狗 更新时间:2023-10-30 00:31:36 25 4
gpt4 key购买 nike

我在 Windows 7 64 位版本 1.5.13 中使用 Python 3.5 64 位。

我有以下代码返回了一个自相交的多边形:

import numpy as np
from shapely.geometry import Polygon, MultiPolygon
import matplotlib.pyplot as plt

x = np.array([ 0.38517325, 0.40859912, 0.43296919, 0.4583215 , 0.4583215 ,
0.43296919, 0.40859912, 0.38517325, 0.36265506, 0.34100929])
y = np.array([ 62.5 , 56.17977528, 39.39698492, 0. ,
0. , 17.34605377, 39.13341671, 60.4180932 ,
76.02574417, 85.47008547])
polygon = Polygon(np.c_[x, y])
plt.plot(*polygon.exterior.xy)

Self-intersecting polygon

这是正确的。然后我尝试使用 buffer(0) 获取两个单独的多边形:

split_polygon = polygon.buffer(0)
plt.plot(*polygon.exterior.xy)
print(type(split_polygon))
plt.fill(*split_polygon.exterior.xy)

不幸的是,它只返回了两个多边形:

Only returned one polygon

有人可以帮忙吗?谢谢!

最佳答案

第一步是关闭 LineString 以创建一个 LinearRing,这是多边形的组成部分。

from shapely.geometry import LineString, MultiPolygon
from shapely.ops import polygonize, unary_union

# original data
ls = LineString(np.c_[x, y])
# closed, non-simple
lr = LineString(ls.coords[:] + ls.coords[0:1])
lr.is_simple # False

但是请注意,它并不简单,因为线条交叉形成领结。 (根据我的经验,广泛使用的 buffer(0) 技巧通常不适用于固定领结)。这不适合 LinearRing,因此需要进一步的工作。使用 unary_union 使其变得简单和 MultiLineString:

mls = unary_union(lr)
mls.geom_type # MultiLineString'

然后使用polygonize 从线条中找到多边形:

for polygon in polygonize(mls):
print(polygon)

或者,如果您想要一个 MultiPolygon 几何体:

mp = MultiPolygon(list(polygonize(mls)))

关于python - 拆分自相交多边形仅在 Shapely 中返回一个多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35110632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com