Chciałbym uzyskać przecięcie wielu wielokątów. Korzystając z shapely
pakietu Pythona , mogę znaleźć przecięcie dwóch wielokątów za pomocą intersection
funkcji. Czy istnieje podobna skuteczna funkcja uzyskiwania przecięcia wielu wielokątów?
Oto fragment kodu, aby zrozumieć, co mam na myśli:
from shapely.geometry import Point
coord1 = ( 0,0 )
point1 = Point(coord1)
circle1 = point1.buffer(1)
coord2 = ( 1,1 )
point2 = Point(coord2)
circle2 = point2.buffer(1)
coord3 = ( 1,0 )
point3 = Point(coord3)
circle3 = point3.buffer(1)
Przecięcie dwóch kręgów można znaleźć przez circle1.intersection(circle2)
. Mogę znaleźć przecięcie wszystkich trzech kręgów według circle1.intersection(circle2).intersection(circle3)
. Jednak tego podejścia nie można zastosować do dużej liczby wielokątów, ponieważ wymaga ono coraz więcej kodu. Chciałbym funkcji, która pobiera dowolną liczbę wielokątów i zwraca ich przecięcie.
Odpowiedzi:
Jednym z możliwych podejść może być rozważenie kombinacji par wielokątów, ich skrzyżowań i wreszcie połączenia wszystkich skrzyżowań poprzez połączenie kaskadowe (jak sugerowano tutaj ):
Bardziej wydajne podejście powinno wykorzystywać indeks przestrzenny, taki jak Rtree , aby poradzić sobie z wieloma geometriami (nie dotyczy to trzech okręgów):
źródło
Dlaczego nie skorzystać z iteracji lub rekurencyjności? coś jak :
źródło
Daj temu kodowi szansę. jest dość prosty w koncepcji i wierzę, że dostaniesz to, czego szukasz.
a jeśli chcesz, aby dane wyjściowe były przechowywane jako plik kształtu, użyj fiona:
dane wyjściowe -
źródło
k
iv
są kiepskim wyborem dla nazw zmiennych w twoimdict
rozumieniu. Każda z tych zmiennych odnosi się do różnych elementówdic.items()
, a nie pary klucz-wartość. Coś takiegoa, b
byłoby mniej mylące.