2016-01-31 32 views
5

biçiminde düzgün bir şekilde bir çokgen döndürdü. Windows 7 64 bit'te Python 3.5 64 bit, düzgün bir şekilde 1.5.13 sürümü kullanıyorum.Kendiliğinden kesişen çokgen bölme, Python

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

Bu doğrudur:

bana bir kendini kesen poligon döndü aşağıdaki kodu var. Sonra buffer(0) kullanarak iki ayrı çokgenler elde etmeye çalıştı: Ne yazık ki, sadece iki çokgen döndü

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

:

Only returned one polygon

kimse yardım eder misiniz? Teşekkürler!

cevap

7

İlk adım, LineString'i yapmak için LineString'i kapatmaktır. Bu, Çokgenlerin yapıldığı şeydir.

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 

Ancak, çizginin bir papyon yapmak için geçtiği için basit olmadığını unutmayın. (Yaygın olarak kullanılan arabellek (0) hilesi genellikle deneyimlerime bağlı yayları sabitlemek için çalışmaz). Bu bir LinearRing için uygun değildir, bu yüzden daha fazla çalışmaya ihtiyaç duyar. unary_union ile basit ve MultiLineString olun:

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

Sonra linework gelen Çokgenler bulmak için polygonize kullanın:

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

Ya da bir MultiPolygon geometri istiyorsanız: benzeri

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

Çalışmaları çekicilik. Çok teşekkür ederim! –