Szukam skutecznego sposobu zgrupowania linii niezależnie od ich kierunku. Oznacza to, że linia między Nowym Jorkiem a Los Angeles powinna znajdować się w tym samym klastrze, co linia w innym kierunku między Los Angeles i Nowym Jorkiem. Lokalizacje punktów początkowych / końcowych powinny być podobne (tj. San Diego do Long Island powinny znajdować się w tej samej grupie co LA-NY, ale prawdopodobnie nie San Francisco do Bostonu) i nie ma punktów pośrednich. Dane wejściowe byłyby podobne do tego przykładu:
(Autor: Cassiopeia sweet z japońskiej Wikipedii GFDL lub CC-BY-SA-3.0 , za pośrednictwem Wikimedia Commons)
Wcześniej próbowałem posortować linie z wyprzedzeniem, np. Aby wszystkie biegły z zachodu na wschód, ale to nie rozwiązuje problemu dla linii biegnących z północy na południe i na odwrót.
Czy znasz jakiś algorytm radzący sobie z tym problemem? Szukałem, ale oprócz algorytmu do obliczania średniego kierunku przekierowanych segmentów nie znalazłem nic zdalnie pomocnego, więc muszę używać niewłaściwych wyszukiwanych terminów.
źródło
Odpowiedzi:
Jeśli dobrze cię rozumiem, chcesz zgrupować linie, które są mniej więcej takie same bez względu na kierunek.
Oto pomysł, który moim zdaniem mógłby zadziałać.
podziel linie w punkcie początkowym i końcowym
Zbierz punkty i uzyskaj identyfikator klastra
Znajdź linie o tej samej kombinacji identyfikatora klastra. To są gromady
Powinno to być możliwe w PostGIS (oczywiście :-)) w wersji 2.3
Nie testowałem funkcji ST_ClusterDBSCAN, ale powinna działać.
Jeśli masz taką tabelę wiersza:
I chcesz utworzyć klaster, w którym punkty początkowy i końcowy znajdują się w odległości maksymalnie 10 km od siebie. Aby klaster mógł istnieć co najmniej 2 punkty, zapytanie może wyglądać następująco:
Łącząc się
a.cluster_id<b.cluster_id
, otrzymasz porównywalny identyfikator klastra niezależnie od kierunku.źródło
Czy naprawdę chcesz skupiać się wyłącznie według kierunku, bez względu na pochodzenie lub miejsce docelowe? Jeśli tak, istnieje kilka bardzo prostych sposobów. Być może najłatwiej jest obliczyć namiar każdej linii, podwoić ją i narysować jako punkt na okręgu. Ponieważ łożyska do przodu i do tyłu różnią się o 180 stopni, różnią się o 360 stopni po podwojeniu, a zatem drukują w dokładnie tym samym miejscu. Teraz skup punkty w płaszczyźnie za pomocą dowolnej metody.
Oto działający przykład
R
, którego wynik pokazuje linie pokolorowane zgodnie z każdym z czterech klastrów. Oczywiście prawdopodobnie użyłbyś GIS do obliczenia łożysk - dla uproszczenia użyłem łożysk euklidesowych.źródło
Wyjaśnienie pytania wskazuje, że chciałbyś, aby klastrowanie opierało się na rzeczywistych segmentach linii , w tym sensie, że dowolne dwie pary początek-miejsce docelowe (OD) powinny być uważane za „zamknięte”, gdy oba początki są bliskie, a oba miejsca docelowe są bliskie , niezależnie od tego, który punkt uważa się za początek lub cel podróży .
Ta formuła sugeruje, że masz już wyczucie odległości d między dwoma punktami: może to być odległość podczas lotu samolotu, odległość na mapie, czas podróży w obie strony lub jakikolwiek inny parametr, który nie zmienia się, gdy O i D są zamieniono. Jedyną komplikacją jest to, że segmenty nie mają unikalnych reprezentacji: odpowiadają one nieuporządkowanym parom {O, D}, ale muszą być reprezentowane jako pary uporządkowane , (O, D) lub (D, O). Możemy zatem przyjąć odległość między dwiema uporządkowanymi parami (O1, D1) i (O2, D2), aby być jakąś symetryczną kombinacją odległości d (O1, O2) id (D1, D2), takich jak ich suma lub kwadrat pierwiastek z sumy ich kwadratów. Napiszmy tę kombinację jako
Wystarczy zdefiniować odległość między nieuporządkowanymi parami, aby była mniejsza z dwóch możliwych odległości:
W tym momencie możesz zastosować dowolną technikę grupowania opartą na macierzy odległości.
Jako przykład obliczyłem wszystkie 190 odległości punkt-punkt na mapie dla 20 najbardziej zaludnionych amerykańskich miast i poprosiłem o osiem klastrów przy użyciu metody hierarchicznej. (Dla uproszczenia użyłem euklidesowych obliczeń odległości i zastosowałem domyślne metody w używanym przeze mnie oprogramowaniu: w praktyce będziesz chciał wybrać odpowiednie odległości i metody grupowania dla swojego problemu). Oto rozwiązanie z klastrami oznaczonymi kolorem każdego segmentu linii. (Kolory zostały losowo przypisane do klastrów).
Oto
R
kod, który wytworzył ten przykład. Jego dane wejściowe to plik tekstowy z polami „Długość geograficzna” i „Szerokość geograficzna” dla miast. (Aby oznaczyć miasta na rysunku, zawiera również pole „Klucz”).źródło