Come interpolare le posizioni GPS in PostGIS


13

Ho una tabella PostGIS delle posizioni GPS per ogni cinque secondi:

2011-01-01 00:00:05, POINT(x1,y1)
2011-01-01 00:00:10, POINT(x2,y2)
2011-01-01 00:00:15, POINT(x3,y3)
...

Sto cercando una query che restituirà valori (data e ora) per ogni secondo. Va bene supporre che i punti siano collegati da una linea retta.

Sto specificatamente cercando un modo per farlo all'interno del database e non scrivendo alcuni script esterni.


Penso che dovrai scrivere una funzione PL / Python per questo.
Pablo,

1
Ecco uno snippet di Postgis in azione che può aiutare: bostongis.com/postgis_translate.snippet
Pablo

@Pablo: Sì, molto probabilmente. Adatterò la mia domanda.
underdark

Risposte:


13

ciao

Se la tua tabella originale si chiama gps_p, il tuo campo timestamp si chiama ts e i punti si chiamano th_geom:

SELECT (geom).geom,  ts1 + (((geom).path[1]-1) ||' seconds')::interval FROM 
    (SELECT ts1, ST_DumpPoints(ST_Segmentize(geom, ST_Length(geom)/5)) as geom FROM 
        (SELECT ts1, ST_LineFromMultipoint(ST_Union(geom1, geom2)) as geom FROM
            (SELECT p1.ts as ts1, p2.ts as ts2, p1.the_geom as geom1, p2.the_geom as geom2 
                FROM gps_p p1 INNER JOIN gps_p p2 on p1.ts + '00:00:05'::interval = p2.ts
            ) a
        )b
    ) c
WHERE (geom).path[1] <= 5;

Quello che fa è che costruisce linee tra i punti e usa st_segmentize per dividere la linea in 5 segmenti.

Se non sono esattamente 5 secondi tra i punti originali, non funzionerà. Quindi puoi semplicemente aggiungere un campo ID con una sequenza e usarlo per unirti alla tabella con id1 + 1 = id2.

HTH

/ Nicklas


6

ecco una bozza di codice per pl / python, è solo l'idea di base di tradurre i punti in base a una data distanza e azimut.
Per eseguire le funzioni Postgis in pl / python, l'unica soluzione che ho trovato è usare plpy.prepare e plpy.execute (molto noioso).

total_distance=St_distance(P1,P2)
azimuth=st_azimuth(p1,p2)
partial_distance=total_distance / 5

for i in range(4):
  distance = (i+1)*partial_distance
  x_increment=distance*math.cos(math.degrees(azimuth))
  y_increment=distance*math.sin(math.degrees(azimuth))
  ST_translate(P1, x_increment, y_increment)

0

Se non sbaglio ...
Quello che dovresti fare è determinare la linea di connessione e quindi fare una divisione su di essa.

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.