Dopasowane do mapy punkty GPS do sieci drogowej!


11

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) wprowadź opis zdjęcia tutaj


To interesujący problem. Zakładam, że jeśli następny punkt w buforze 20 m ma również niedopuszczalny azymut, to chcesz kontynuować wyszukiwanie?
John Powell,

Tak, John, ale tylko dla odcinków dróg, które mają 20-metrowy bufor! Właściwie chcę zidentyfikować odcinki drogi znajdujące się w buforze o długości 20 m, a następnie znaleźć najbliższy odcinek o akceptowalnym azymucie!
Nader

„NIE MAM azymutu linków i nie jestem pewien, jak mogę go obliczyć za pomocą funkcji postgis ST_azimuth. Wszystko, co mam, to plik kształtu sieci dróg zawierający kolumny wymienione powyżej”. Możesz (i powinieneś) wprowadzić swoje drogi do Postgres / PostGIS za pomocą shp2pgsql . Następnie możesz użyć ST_Azimuth, ale pamiętaj, że powie ci azymut w odniesieniu do kierunku digitalizacji .
alphabetasoup

Odpowiedzi:


1

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.

with new_pts AS (
    SELECT ST_ClosestPoint(geom, gpspoints) AS geompt
    FROM routes JOIN gpspoints ON ST_Distance(routes.geom, gpspoints.geom)<20
    )


SELECT ST_Azimuth(new_pts.geompt, 
    ST_Line_Interpolate_Point(routes.geom, 
        ST_Line_Locate_Point(routes.geom, new_pts.geompt)*0.999))

FROM routes JOIN new_pts ON ST_Distance(routes.geom,new_pts.geompt)<20;

Znowu nie testowałem, ale mam nadzieję, że będzie to pomocne.


0

spróbuj czegoś takiego:

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

  2. zamień sieć dróg na wierzchołki dróg (punkty) i zaimportuj do PostGIS.

  3. 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);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.