Wykrywasz rozgałęziony kształt wielokąta?

13

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:

rozgałęziony wielokąt kontra zakrzywiony pasek

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:

wprowadź opis zdjęcia tutaj

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.

nadya
źródło
1
Nie potrzebujesz dużo Pythona. Próbować ! kształt!. convexHull (). symmetricDifference (! shape!) W kalkulatorze polowym. Spróbuj najpierw na małej kopii z podzestawem. Informacje na temat poprawnej składni znajdują się w pomocy geometrii arkadowej.
FelixIP
To może być świetne pytanie, ale w tej chwili zadajesz wiele pytań, nie ograniczając, czy pytasz o QGIS lub ArcGIS Desktop, a następnie również rzucasz w Pythona. Po dokładnym sprecyzowaniu tego, co próbujesz, łatwiej jest potencjalnym użytkownikom odpowiedzieć w miejscu, w którym utknąłeś. Sugeruję skoncentrowanie się na QGIS, aby uniknąć skracania pierwszej odpowiedzi.
PolyGeo
1
Mam dane w geobazie Esri, ponieważ plik kształtu już przekraczał 2 gb. Mógłbym coś z tym zrobić, jeśli istnieje działające rozwiązanie w QGIS lub gdzieś. Ale nie pytam o konkretne oprogramowanie. Pytam o metrykę, metodę matematycznego wykrywania kształtu ze złożoną ramką (rozgałęzioną). 1 pytanie Artykuł naukowy z formułą byłby również w porządku, pomyślę, jak sam go wdrożyć.
nadya
1
Moja pierwsza myśl była taka sama jak twoja, patrząc na różnice między liczbą i rozmiarem wielokątów pozostałych po odjęciu oryginału z wypukłego (lub wklęsłego) kadłuba (patrz także kształty alfa).
user2856
1
Gdyby tylko szkielet był wystarczająco szybki do obliczenia, użyłbym do obliczenia 4A / PL, pola powierzchni, obwodu, długości między węzłami szkieletu farmost dla zwartości. To samo dotyczy największego wpisanego okręgu.
FelixIP

Odpowiedzi:

11

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:

  • rysując literę Y, używasz co najmniej 2 ciągłych pociągnięć (= 2 polilinii), więc jest rozgałęziony, ponieważ minimalna liczba pociągnięć to> 1.
  • rysując literę L, używasz co najmniej 1 ciągłego pociągnięcia. Nie jest rozgałęziony.

Więcej przykładów tej logiki:

  • Kiedy narysujesz A: 2 pociągnięcia = jest rozgałęziony
  • Kiedy wydasz B: 3 pociągnięcia = jest rozgałęziony
  • kiedy narysujesz skok C: 1 = nie jest rozgałęziony
  • itp

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

Przykład

Ź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).

  • Upewnij się, że unikalny identyfikator łączy linię środkową i wielokąt źródłowy.
  • Przekształć swoje wielokąty w polilinie
  • Zagęścić polilinię linii środkowej i polilinię linii granicznej zwykłymi punktami (nie za dużo, aby później uniknąć problemów z pamięcią, ale wystarczająco, aby „złapać” nieregularne bity.
  • Utwórz macierz odległości między punktami linii środkowej i punktami granicy
  • Zachowaj w wierszach macierzy tylko te, w których ID_centerline = ID_borderline
  • Twórz statystyki, aby mieć odchylenie standardowe
  • Ustaw wartość graniczną, aby wskazać wysokie wartości SD, że jest to nieregularny kontur i utwórz wymagany wskaźnik dla każdego unikalnego identyfikatora
  • Przywróć wskaźnik do pierwotnego wielokąta, dołączając do pola na podstawie unikalnego identyfikatora.
gisnside
źródło
Dziękuję za pomysł, spróbuję utworzyć
linie
Po prostu problem rozróżnienia moich wielokątów C i D pozostanie
nadya
Możesz potrzebować różnych metod dla różnych przypadków i podzielić pracę. Gdy masz już nierozgałęzione wielokąty (B), możesz zawęzić B, aby znaleźć C i D. Problem polega na tym, że nie widzę, jakiej logiki używasz do odróżnienia C od D. prawdopodobnie będziesz musiał wyraźnie to wyrazić za pomocą kryteria.
gisnside
1
Różnica między C i D wydaje się być taka, że ​​w C boki wielokąta są w przybliżeniu jednakowej odległości od linii środkowej, podczas gdy w D boki są nierównomierną odległością od linii środkowej.
csk
1
@csk Widzę to. Myślę, że przetłumaczenie tego na kod obliczałoby statystyki dotyczące odległości między linią środkową a linią graniczną. Zwiększając gęstość polilinii granicznej o więcej punktów, a następnie przekształcając ją w punkty + odległość od równoważnego zadania na linii środkowej dałaby statystyki dotyczące tego zachowania. Jeśli odchylenie standardowe jest duże, prawdopodobnie kształt będzie nieregularny. Trudno zobaczyć, jak to zrobić na tysiącach wielokątów ... fajne wyzwanie
gisnside