Jestem całkiem nowy w Postgres i PostGIS.
Próbuję wykonać proste dopasowanie do mapy (lub wnioskowanie o ścieżce, jeśli chcesz) niektórych punktów GPS. Używam postgres (postgis) .
Mam bazę danych w mojej bazie danych zawierającą moje punkty GPS: punkty gp ( punkty , długie, czas, prędkość, azymut, geometria, ...)
Zaimportowałem również plik kształtu sieci drogowej do mojej bazy danych: trasy (gid, idrte, wersja, nomrte, norte, clsrte, geom, ...) - NIE MAM azymutu linków i jestem nie jestem pewien, jak mogę to obliczyć za pomocą funkcji postgis ST_azimuth. Wszystko, co mam, to plik kształtu sieci drogowej zawierający kolumny wyliczone powyżej.
Chcę skojarzyć każdy punkt GPS z najbliższym łączem (w buforze 20 metrów wokół punktu) tylko wtedy, gdy kierunek łącza zgadza się z azymutem punktu GPS (+ lub -15 stopni) i pobrać rzutowaną pozycję. W przeciwnym razie chcę, aby szukał NASTĘPNEGO linku w buforze o długości 20 metrów, który ma akceptowalny azymut! (Tak jak na zdjęciu!)
Chcę, aby nowe współrzędne rzutowanych punktów GPS zostały dodane w tabeli „gpspoints” jako „projectedLat” i „projectedLong”.
(Na poniższym zdjęciu rzeczywiste punkty pokazano przy użyciu kierunku, podczas gdy rzutowane punkty nie mają żadnego znaku kierunku)
źródło
ST_Azimuth
, ale pamiętaj, że powie ci azymut w odniesieniu do kierunku digitalizacji .Odpowiedzi:
Nie mam w pełni wypracowanej odpowiedzi, ale może wystarczy, aby zacząć. Te funkcje mogą pomóc:
ST_Line_Locate_Point () podaje odległość jako część całkowitej długości linii punktu wzdłuż linii. ST_Line_Interpolate_Point () zwraca geometrię punktu dla punktu w danej odległości (ponownie jako część całkowitej długości) wzdłuż linii.
Sugeruję, aby uzyskać geometrię punktową lokalizacji „new_pts” na linii, które są najbliżej twoich punktów gpspoint (w podzapytaniu poniżej, sformułowanym jako klauzula WITH). Następnie użyj tego punktu, aby znaleźć najbliższy punkt na linii, ale w bardzo nieznacznie mniejszej odległości, więc będzie on bliżej początku. Następnie użyj tego znalezionego punktu wraz z „new_pt”, aby uzyskać azymut między nimi. Oznaczałoby to mniej więcej styczną do linii w tym punkcie.
Następnie możesz porównać ten kąt z azymutem swoich punktów gp, aby ustalić, czy dodać punkt gp.
Znowu nie testowałem, ale mam nadzieję, że będzie to pomocne.
źródło
spróbuj czegoś takiego:
obliczyć orientację polilinii w stopniach, przykład: np. w kalkulatorze ArcGIS Field: 180 + math.atan2 ((! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)
zamień sieć dróg na wierzchołki dróg (punkty) i zaimportuj do PostGIS.
zastosuj algorytm dopasowywania:
WSTAW w dopasowanie (gid, identyfikator_ pojazdu, identyfikator_ segmentu, data, godzina, the_geom)
WYBIERZ DISTINCT ON (b.gid) b.gid, b.vehicle_id, a.segment_id, b.date, b.time, ST_Closestpoint (ST_Collect (a. Thegeom), b.the_geom) as thegege FROM
segment_vertices_geom a połączenie wewnętrzne Vehicle_geom b ON ST_Dw ramach (ST_Transform (a.the_geom, 32632),
ST_Transform (b.the_geom, 32632), 20) WHERE ((CAST (a.azimuth AS float8) - CAST (b.direction AS float8)) <180 OR (CAST (a.azimuth AS float8) - CAST (b.direction AS float8))> -180) GROUP BY b.gid, b.vehicle_id, a.segment_id, b.date, b.time, a.the_geom, b.the_geom ORDER BY b.gid, ST_Distance (a.the_geom, b . thegege);
źródło