python – 拆分自相交多边形只返回Shapely中的一个多边形
作者:互联网
我在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)
这是对的.然后我尝试使用buffer(0)获取两个单独的多边形:
split_polygon = polygon.buffer(0)
plt.plot(*polygon.exterior.xy)
print(type(split_polygon))
plt.fill(*split_polygon.exterior.xy)
不幸的是,它只返回了两个多边形:
有人可以帮忙吗?谢谢!
解决方法:
第一步是关闭LineString以生成一个LinearRing,这是Polygons的组成部分.
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
但是,请注意它不简单,因为线条交叉以形成蝴蝶结. (根据我的经验,广泛使用的缓冲区(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)))
标签:shapely,python 来源: https://codeday.me/bug/20191008/1870624.html