Hamparan poligon dengan Shapely

15

Saya mencoba untuk menangkap semua poligon non-tumpang tindih yang ditunjukkan di bawah ini menggunakan Shapely (diberi poligon A, B & C). Selain itu, saya berharap untuk melakukannya tanpa iterasi, pengujian untuk titik potong dll. Jawaban yang diterima untuk pertanyaan ini mengekspresikan metode PostGIS tetapi tampaknya 'persatuan' memiliki arti yang berbeda bagi orang yang berbeda.

hamparan poligon

katup London
sumber

Jawaban:

21

Anda perlu beralih di beberapa level. ( Pembaruan : Saya telah mengedit untuk menghapus semua loop "untuk", kecuali untuk satu pemahaman daftar )

# 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]

Pertama, Anda membutuhkan penyatuan semua persimpangan (menggunakan penyatuan bertingkat ), menggunakan pasangan kombinasi dari setiap bentuk. Kemudian Anda menghapus (melalui difference) persimpangan dari penyatuan semua bentuk.

# 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)

Berikut ini nonoverlaptampilannya (melalui JTS Test Builder): tidak tumpang tindih

Mike T
sumber
1

Setelah beberapa tahun, tampaknya ada solusi yang lebih baik melalui 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))))

Ini mendukung setiap panjang geometri, satu-satunya masalah adalah tentang waktu perhitungan, dan tidak mendukung poligon berlubang.

Deo Leung
sumber
Karena penasaran, mengapa menurut Anda solusi Anda lebih baik daripada yang dilakukan oleh @MikeT? Saya hanya bisa membaca tentang masalah dalam hal waktu perhitungan.
mgri