2016-01-31 20 views
5

Sto usando Python 3.5 64 bit in Windows 7 a 64 bit, versione shapely 1.5.13.La suddivisione del poligono autointersecante ha restituito un poligono solo in Python

Ho il seguente codice che mi ha restituito un poligono autointersecante:

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

Questo è corretto. Poi ho cercato di ottenere i due poligoni individuali utilizzando buffer(0):

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

Purtroppo, è solo rinviato dei due poligoni:

Only returned one polygon

Qualcuno potrebbe aiutare? Grazie!

risposta

7

Il primo passaggio consiste nel chiudere LineString per creare un LinearRing, ovvero di cui sono composti i poligoni.

Tuttavia, si noti che non è semplice, poiché le linee si incrociano per fare un papillon. (Il trucco del buffer ampiamente utilizzato (0) di solito non funziona per la fissazione delle cravatte a farfalla nella mia esperienza). Questo non è adatto per un LinearRing, quindi ha bisogno di ulteriore lavoro. Rendere semplice e MultiLineString con unary_union:

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

Quindi utilizzare polygonize per trovare i Poligoni dal disegno al tratto:

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

Oppure, se volete una geometria MultiPolygon:

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

funziona come un fascino. Grazie mille! –