Shapely ile çokgen kaplama


15

Shapely (verilen A, B & C poligonları) kullanılarak aşağıda belirtilen tüm çakışan olmayan çokgenleri yakalamaya çalışıyorum. Dahası, yinelemeden, kesişim vb. İçin test yapmadan yapmayı umuyorum. Bu soruya kabul edilen cevap PostGIS yöntemini ifade ediyor, ancak 'sendika' farklı insanlar için farklı şeyler ifade ediyor gibi görünüyor.

çokgen kaplama

Yanıtlar:


21

Bir düzeyde yinelemeniz gerekiyor. ( Güncelleme : Bir liste kavrama dışında tüm "için" döngülerini kaldırmak üzere düzenledim )

# imports used throughout this example
from shapely.geometry import Point
from shapely.ops import cascaded_union
from itertools import combinations

# Here are your input shapes (circles A, B, C)
A = Point(3, 6).buffer(4)
B = Point(6, 2).buffer(4)
C = Point(1, 2).buffer(4)

# list the shapes so they are iterable
shapes = [A, B, C]

Öncelikle , her bir şeklin kombinasyon çiftini kullanarak tüm kavşakların birleşmesine ihtiyacınız var ( kademeli bir birleşim kullanın ) . Ardından tüm şekillerin birleşiminden kesişimleri (üzerinden ) kaldırırsınız .difference

# All intersections
inter = cascaded_union([pair[0].intersection(pair[1]) for pair in combinations(shapes, 2)])
# Remove from union of all shapes
nonoverlap = cascaded_union(shapes).difference(inter)

İşte budur nonoverlap(OTS Testi Builder üzerinden) gibi görünür: nonoverlap


1

Birkaç yıl sonra daha iyi bir çözüm var gibi görünüyor shapely:

# imports used throughout this example
from shapely.geometry import Point
from shapely.ops import polygonize, unary_union

# Here are your input shapes (circles A, B, C)
A = Point(3, 6).buffer(4)
B = Point(6, 2).buffer(4)
C = Point(1, 2).buffer(4)
...

# list the shapes so they are iterable
shapes = [A, B, C, ...]

# generate the overlay
list(polygonize(unary_union(list(x.exterior for x in shapes))))

Herhangi bir geometri uzunluğunu destekler, hesaplama süresi ile ilgili tek problemdir ve delikli çokgeni desteklemez.


Meraktan, neden çözümünüzün @MikeT'den daha iyi olduğunu düşünüyorsunuz? Bir problemi yalnızca hesaplama süreleri açısından okuyabilirim.
mgri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.