Nakładka wielokąta za pomocą Shapely

15

Próbuję uchwycić wszystkie nie nakładające się wielokąty wskazane poniżej za pomocą Shapely (podane wielokąty A, B i C). Co więcej, mam nadzieję, że zrobię to bez iteracji, testowania przecięcia itp. Przyjęta odpowiedź na to pytanie wyraża metodę PostGIS, ale wydaje się, że „związek” oznacza różne rzeczy dla różnych ludzi.

nakładka wielokąta

klapa Londyn
źródło

Odpowiedzi:

21

Musisz iterować na pewnym poziomie. ( Aktualizacja : Zredagowałem, aby usunąć wszystkie pętle „for”, z wyjątkiem jednej listy )

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

Najpierw potrzebujesz połączenia wszystkich skrzyżowań (użyj połączenia kaskadowego ), używając pary kombinacji każdego kształtu. Następnie usuwasz (przez difference) przecięcia ze unii wszystkich kształtów.

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

Oto, jak nonoverlapwygląda (za pomocą JTS Test Builder): brak nakładania się

Mike T.
źródło
1

Po kilku latach wydaje się, że istnieje lepsze rozwiązanie poprzez 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))))

Obsługuje dowolną długość geometrii, jedynym problemem jest czas obliczeń i brak obsługi wielokąta z otworami.

Deo Leung
źródło
Z ciekawości, dlaczego uważasz, że twoje rozwiązanie jest lepsze od rozwiązania @MikeT? Mogę tylko przeczytać o problemie pod względem czasu obliczeń.
mgri