拆分自相交多边形仅在Python中以形状方式返回一个多边形

Yux*_*ang 5 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)
Run Code Online (Sandbox Code Playgroud)

自相交多边形

这是对的.然后我尝试使用以下方法获取两个单独的多边形buffer(0):

split_polygon = polygon.buffer(0)
plt.plot(*polygon.exterior.xy)
print(type(split_polygon))
plt.fill(*split_polygon.exterior.xy)
Run Code Online (Sandbox Code Playgroud)

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

仅返回一个多边形

有人可以帮忙吗?谢谢!

Mik*_*e T 12

第一步是关闭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
Run Code Online (Sandbox Code Playgroud)

但是,请注意它不简单,因为线条交叉以形成蝴蝶结.(根据我的经验,广泛使用的缓冲区(0)技巧通常不能用于修复蝴蝶结).这不适用于LinearRing,因此需要进一步的工作.使用简单的MultiLineString unary_union:

mls = unary_union(lr)
mls.geom_type  # MultiLineString'
Run Code Online (Sandbox Code Playgroud)

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

for polygon in polygonize(mls):
    print(polygon)
Run Code Online (Sandbox Code Playgroud)

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

mp = MultiPolygon(list(polygonize(mls)))
Run Code Online (Sandbox Code Playgroud)

  • 使用 shapely 1.8.0,您可以使用 `shapely.validation.make_valid(shapely.geometry.Polygon(np.c_[x, y]))` 在一行中获得相同的 Multipolygon (3认同)