Наложение полигонов с помощью Shapely

15

Я пытаюсь захватить все непересекающиеся полигоны, указанные ниже, используя Shapely (данные полигоны A, B и C). Более того, я надеюсь сделать это без итерации, проверки на пересечение и т. Д. Принятый ответ на этот вопрос выражает метод PostGIS, но может показаться, что «объединение» означает разные вещи для разных людей.

наложение многоугольника

valveLondon
источник

Ответы:

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): nonoverlap

Майк Т
источник
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))))

Он поддерживает любую длину геометрии, единственная проблема - время расчета, а не поддержка многоугольника с отверстиями.

Deo Leung
источник
Из любопытства, почему вы думаете, что ваше решение лучше, чем решение @MikeT? Я могу только прочитать о проблеме с точки зрения времени расчета.
Мгри