Mappa GPS corrispondente alla rete stradale!


11

Sono abbastanza nuovo per Postgres e PostGIS.

Sto cercando di fare una semplice corrispondenza della mappa (o inferenza del percorso, se lo desideri) di alcuni punti GPS. Sto usando Postgres (Postgis) .

Ho una tabella nel mio database contenente i miei punti GPS: punti gps (lat, long, tempo, velocità, azimut, geometria, ...)

Ho importato un file di forma della rete stradale anche nel mio database: route (gid, idrte, version, nomrte, norte, clsrte, geom, ...) - NON HO L'azimut dei link, e lo sono non sono sicuro di come posso calcolarlo usando la funzione postgis ST_azimuth. Tutto quello che ho è un file di forma della rete stradale contenente colonne elencate sopra.

Voglio associare ciascun punto GPS al collegamento più vicino (in un buffer di 20 metri attorno al punto) solo se la direzione del collegamento concorda con l'azimut del punto GPS (+ o -15 gradi) e recuperare la posizione proiettata. Altrimenti voglio che cerchi il collegamento più vicino, all'interno del buffer di 20 metri, che ha un azimut accettabile! (Proprio come l'immagine!)

Voglio che le nuove coordinate dei punti GPS proiettati vengano aggiunte nella tabella "gpspoints" come "projectedLat" e "projectedLong".

(Nell'immagine seguente, i punti effettivi sono dimostrati usando una direzione mentre i punti proiettati non hanno alcun segno di direzione) inserisci qui la descrizione dell'immagine


È un problema interessante Suppongo che se il punto successivo all'interno del buffer di 20m ha anche un azimut inaccettabile, allora vuoi continuare la ricerca?
John Powell,

Sì John, ma solo per i tratti di strada che si trovano all'interno del buffer di 20 metri ! In realtà, voglio identificare i segmenti stradali che si trovano nel buffer di 20 m, quindi trovare il segmento più vicino che ha un azimut accettabile!
Nader,

"NON HO l'azimut dei collegamenti e non sono sicuro di come posso calcolarlo usando la funzione postgis ST_azimuth. Tutto quello che ho è un file di forma della rete stradale contenente colonne elencate sopra." Puoi (e dovresti) portare le tue strade in Postgres / PostGIS con shp2pgsql . Quindi puoi usare ST_Azimuth, ma tieni presente che ti dirà l'azimut rispetto alla direzione della digitalizzazione .
alphabetasoup,

Risposte:


1

Non ho una risposta completamente elaborata, ma forse abbastanza per iniziare. Queste funzioni potrebbero aiutare:

ST_Line_Locate_Point () indica la distanza come parte della lunghezza totale della linea di un punto lungo una linea. ST_Line_Interpolate_Point () restituisce una geometria punto per un punto a una data distanza (sempre come una parte della lunghezza totale) lungo una linea.

Cosa lo consiglio per ottenere la geometria del punto di una posizione "new_pts" sulla linea più vicina ai punti gps (in una sottoquery di seguito, formulata come clausola WITH). Quindi utilizza quel punto per trovare il punto più vicino effettivamente sulla linea, ma a una distanza leggermente più piccola, quindi sarà più vicino all'inizio. Quindi usa questo punto trovato, insieme a 'new_pt' per ottenere l'azimut tra di loro. Ciò rappresenterebbe più o meno la tangente alla linea in quel punto.

Quindi puoi confrontare questo angolo con l'azimut dei tuoi gpspoint per determinare se aggiungere o meno il gpspoint.

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;

Ancora una volta, non testato, ma spero che possa esserti di aiuto.


0

prova qualcosa del genere:

  1. calcola l'orientamento delle tue polilinee in gradi, ad esempio: ad esempio nel calcolatore di campi ArcGIS: 180 + math.atan2 ((!! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)

  2. converti la tua rete stradale in vertici stradali (punti) e importa in PostGIS.

  3. applica l'algoritmo di corrispondenza:

    INSERISCI nella corrispondenza (gid, vehicle_id, segment_id, data, ora, the_geom)

    SELEZIONA 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) come the_geom FROM

    segment_vertices_geom a join interno vehicle_geom b ON ST_Dwithin (ST_Transform (a.the_geom, 32632),

    ST_Transform (b.the_geom, 32632), 20) DOVE ((CAST (a.azimuth AS float8) - CAST (b. Direction AS float8)) <180 OR (CAST (a.azimuth AS float8) - CAST (b. Direzione 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);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.