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

Nader
źródło
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.

Micha
źródło
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);

Dimo
źródło