Полігонова накладка з Shapely


15

Я намагаюсь захопити всі полігони, що не перекриваються, зазначеними нижче, використовуючи Shapely (задані багатокутники A, B & C). Більше того, я сподіваюся зробити це без ітерації, тестування на перехрестя тощо. Прийнята відповідь на це питання виражає метод PostGIS, але, здавалося б, "союз" означає різні речі для різних людей.

багатокутне накладення

Відповіді:


21

Вам потрібно повторити на якомусь рівні. ( Оновлення : я відредагував видалення всіх циклів "for", за винятком одного розуміння списку )

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

Спочатку потрібно з'єднання всіх перехресть (використовуйте каскадне з'єднання ), використовуючи комбіновану пару кожної форми. Потім ви виймаєте (через 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)

Ось як nonoverlapвиглядає (за допомогою JTS Test Builder): нерізноманітність


1

Через декілька років, здається, є краще рішення через 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))))

Він підтримує будь-яку геометричну довжину, єдина проблема, що стосується часу обчислення, а не підтримка багатокутника з отворами.


З цікавості, чому ви вважаєте, що ваше рішення краще, ніж рішення від @MikeT? Я можу прочитати про проблему лише з точки зору розрахунків.
мгрі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.