Kartenangepasste GPS-Punkte zum Straßennetz!

11

Ich bin ziemlich neu bei Postgres und PostGIS.

Ich versuche, eine einfache Kartenanpassung (oder Pfadinferenz, wenn Sie dies wünschen) einiger GPS-Punkte durchzuführen. Ich benutze Postgres (Postgis) .

Ich habe eine Tabelle in meiner Datenbank, die meine GPS-Punkte enthält: gpspoints (Lat, Long, Zeit, Geschwindigkeit, Azimut, Geometrie, ...)

Ich habe auch ein Shapefile des Straßennetzes in meine Datenbank importiert: Routen (gid, idrte, version, nomrte, norte, clsrte, geom, ...) - Ich habe den Azimut der Links NICHT und bin es auch Ich bin mir nicht sicher, wie ich es mit der Postgis-Funktion ST_azimuth berechnen kann. Ich habe nur ein Shapefile des Straßennetzes mit den oben aufgeführten Spalten.

Ich möchte jeden GPS-Punkt nur dann der nächsten Verbindung (in einem Puffer von 20 Metern um den Punkt) zuordnen, wenn die Richtung der Verbindung mit dem Azimut des GPS-Punkts (+ oder -15 Grad) übereinstimmt, und die projizierte Position abrufen. Ansonsten möchte ich, dass es innerhalb des 20-Meter-Puffers nach dem nächstgelegenen nächsten Link sucht, der einen akzeptablen Azimut hat! (Genau wie auf dem Bild!)

Ich möchte, dass die neuen Koordinaten der projizierten GPS-Punkte in der Tabelle "gpspoints" als "projiziertLat" und "projiziertLong" hinzugefügt werden.

(In der Abbildung unten werden tatsächliche Punkte anhand einer Richtung dargestellt, während projizierte Punkte keine Richtungsmarkierung haben.) Geben Sie hier die Bildbeschreibung ein

Nader
quelle
Es ist ein interessantes Problem. Ich gehe davon aus, dass Sie die Suche fortsetzen möchten, wenn der nächste Punkt innerhalb des 20-m-Puffers ebenfalls einen inakzeptablen Azimut aufweist.
John Powell
Ja John, aber nur für die Straßensegmente, die den 20-Meter- Puffer haben! Eigentlich möchte ich die Straßensegmente identifizieren, die sich im 20-m-Puffer befinden, und dann das nächste Segment finden, das einen akzeptablen Azimut hat!
Nader
"Ich habe den Azimut der Links NICHT und bin mir nicht sicher, wie ich ihn mit der Postgis-Funktion ST_azimuth berechnen kann. Ich habe nur ein Shapefile des Straßennetzes mit den oben aufgeführten Spalten." Sie können (und sollten) Ihre Straßen mit shp2pgsql in Postgres / PostGIS bringen . Dann können Sie verwenden ST_Azimuth, aber denken Sie daran, dass es Ihnen den Azimut in Bezug auf die Richtung der Digitalisierung anzeigt .
Alphabetasoup

Antworten:

1

Ich habe keine vollständig ausgearbeitete Antwort, aber vielleicht genug, um Ihnen den Einstieg zu erleichtern. Diese Funktionen könnten helfen:

ST_Line_Locate_Point () gibt den Abstand als Teil der gesamten Linienlänge eines Punkts entlang einer Linie an. ST_Line_Interpolate_Point () gibt eine Punktgeometrie für einen Punkt in einem bestimmten Abstand (wiederum als Teil der Gesamtlänge) entlang einer Linie zurück.

Was ich vorschlage, um die Punktgeometrie einer Position 'new_pts' auf Ihrer Linie zu erhalten, die Ihren gpspoints am nächsten liegt (in einer Unterabfrage unten, formuliert als WITH-Klausel). Verwenden Sie dann diesen Punkt, um den nächstgelegenen Punkt auf der Linie zu finden, jedoch in einem geringfügig geringeren Abstand, sodass er näher am Anfang liegt. Verwenden Sie als nächstes diesen gefundenen Punkt zusammen mit dem 'new_pt', um den Azimut zwischen ihnen zu erhalten. Dies würde mehr oder weniger die Tangente an die Linie an diesem Punkt darstellen.

Dann können Sie diesen Winkel mit dem Azimut Ihrer gpspoints vergleichen, um zu bestimmen, ob Sie den gpspoint hinzufügen möchten oder nicht.

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;

Wieder nicht getestet, aber ich hoffe, es wird eine Hilfe sein.

Micha
quelle
0

versuchen Sie so etwas:

  1. Berechnen Sie die Ausrichtung Ihrer Polylinien in Grad, Beispiel: z. B. im ArcGIS-Feldrechner: 180 + math.atan2 ((! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)

  2. Konvertieren Sie Ihr Straßennetz in Straßenscheitelpunkte (Punkte) und importieren Sie es in PostGIS.

  3. Matching-Algorithmus anwenden:

    INSERT in Matching (gid, Fahrzeug_ID, Segment_ID, Datum, Uhrzeit, the_geom)

    SELECT DISTINCT ON (b.gid) b.gid, b.vehicle_id, a.segment_id, b.date, b.time, ST_Closestpoint (ST_Collect (a.the_geom), b.the_geom) als the_geom FROM

    segment_vertices_geom a inner join fahrzeug_geom b ON ST_Dwithin (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 .the_geom);

Dimo
quelle