Mam warstwę wektorową z milionami wielokątów tworzących ciągłe pokrycie. Muszę je sklasyfikować według ich kształtu. Używam już kilku indeksów kształtów z ekologii krajobrazu, takich jak zwartość ( 4piA / P ^ 2 ), średnia szerokość ( 2A / P ), numer kształtu ( P / sqrt (A) ), widziałem również tę odpowiedź na Obliczanie okrągłości / zwięzłości wielokąt?
Mój problem polega na tym, że wszystkie te wskaźniki wykorzystują tylko pewien stosunek powierzchni i obwodu. Nawet wskaźnik wymiaru fraktalnego używa tylko powierzchni i obwodu ( 2nn (0,25P) / ln (A) ). Ale jak mogę rozróżnić dwa wielokąty o tym samym obszarze i obwodzie, ale całkowicie innym kształcie? Jak ten rozgałęziony wielokąt A:
którą próbowałem narysować przy użyciu tego samego obszaru i obwodu co zakrzywiony pasek B. Wszystkie moje znane indeksy będą dla nich takie same. Ale dla mnie bardzo ważne jest odróżnianie prostych pasków (w tym zakrzywionych jak księżyc w nowiu) od skomplikowanych rozgałęzionych kształtów.
Celowo pokazuję wielokąt B jako zakrzywiony pasek, a nie prosty pasek, ponieważ znam wskaźnik pokrewnego obwodu, który wykrywa proste wydłużone kształty, ale moje wielokąty mogą mieć te same koła. Nawet jeśli zbuduję Wypukły kadłub i obliczę stosunek obszarów Apolygon / Aconvex , tutaj może być bardzo podobnie.
Jak więc wyraźnie odróżnić rozgałęziony wielokąt A od wielokąta B w danych wektorowych ? (Konwersja ich do rastra wymagałaby bardzo małej wielkości komórki, ogromnego zestawu danych i braku pamięci, więc nie jest to możliwe). Czy istnieją inne indeksy kształtów, które zawierają inne parametry? Idealnie metoda wyróżniałaby nie tylko wyraźnie rozgałęzione wielokąty, ale nawet C i D:
Moim jedynym pomysłem jest zbudowanie wypukłego kadłuba, a następnie usunięcie wielokąta z jego wypukłego kadłuba i policzenie liczby (dużych) kawałków, które pozostawia (kasowanie wielokąta po wielokącie, a nie całej warstwy). Może to pokazać złożoność granic.
Z zadowoleniem przyjmuję matematyczne rozwiązania / algorytmy, które później zaimplementuję w Pythonie.
Odpowiedzi:
Możesz rzucić okiem na następującą metodę: szkieletuj swoje wielokąty i pracuj nad funkcjami typu linii związanymi z oryginalnym wielokątem z unikalnym źródłowym identyfikatorem wielokąta. Sądzę, że jest kilka domysłów (na przykład, kiedy uważamy polilinię za prawdziwą linię środkową: minimalna długość, aby polilinia kwalifikowała się do statusu linii środkowej). Gdy liczba linii środkowych jest większa niż 1 dla jednego wielokąta źródłowego, wówczas jest rozgałęziona.
Rozgałęziony wielokąt, po wyczyszczeniu do linii środkowej, będzie miał wiele linii, podczas gdy prosty wielokąt może mieć tylko jedną dużą linię w środku (tak samo jak ludzka interpretacja).
Przykład:
Więcej przykładów tej logiki:
Nie próbowałem niczego, po prostu próbowałem logiki, ale myślę, że to może zadziałać.
Zobacz: Szkieletowanie wektorów w QGIS / Python lub http://postgis.net/docs/ST_StraightSkeleton.html
Lub
Źródło: Wyodrębnianie linii środkowej wielokąta złożonego w PostGIS / Python
EDYCJA: W przypadkach C i D musisz już mieć przefiltrowane kształty B (nierozgałęzione).
źródło