Creare una linea da punti usando PostGIS?


10

Ho una tabella PostGIS con i dati di posizione di numerosi veicoli e desidero creare linee da questi punti.

I dati possono essere selezionati per ID veicolo e ordinati per data e ora ma come creare linee dal risultato?

Ciò di cui ho sostanzialmente bisogno è un segmento di linea dal punto 1 al punto 2, finalizzare la linea e poi di nuovo dal punto 2 al punto 3. Naturalmente tutto ciò in considerazione dell'ID del veicolo.

Quest'ultimo è necessario perché voglio calcolare la direzione di crociera e la velocità del veicolo da un punto a quello successivo.


1
La funzione ST_MakeLine () eseguirà questa operazione, una volta elaborati il ​​timestamp GROUP BY vehicle_id e ORDER BY. Vedi: postgis.refractions.net/docs/ST_MakeLine.html
Micha,

Bene, ho semplicemente provato e rilasciato la seguente dichiarazione: SELECT ais_data.mmsi, ST_MakeLine(ais_data.geom) AS newgeom INTO ais_lines FROM (SELECT * FROM ais_data ORDER BY ais_data.mmsi, ais_data.bs_ts ASC) AS ais_data GROUP BY ais_data.mmsi;Questo mi darà la traccia di ogni veicolo, e non è esattamente quello di cui ho bisogno. Come dire a ST_MakeLine () di creare una linea dal punto 1 al punto 2, finalizzare la linea e avviarne una nuova dal punto 2 al punto 3 ...?
Thomas Becker,

Cosa sono "punto 1", "punto 2", "punto 3"? Come li riconosci?
Micha,

Ho pensato di riconoscerli tramite l'ordinamento del timestamp ... ORDER BY ais_data.bs_ts- è possibile? Quindi, il punto 1, il punto 2 e così via sono sostanzialmente le informazioni sul punto fornite in ciascuna riga come risultato dell'istruzione Select.
Thomas Becker,

In un primo momento è possibile generare una riga per veicolo e successivamente generare il vertice da questa riga utilizzando i suggerimenti della mailing list postgis postgis.17.x6.nabble.com/…
ThomasG77,

Risposte:


12

Può essere fatto in alcuni modi, usando self-join o sottoquery correlate ma l'utilizzo delle funzioni di finestra è probabilmente il modo più semplice.

La funzione lead()restituisce un valore che precede nella data partizione e la nostra partizione è(PARTITION BY <vehicle_id> ORDER BY <timestamp>)

Questa query ci fornisce il numero del veicolo, la posizione di quel punto nella partizione (che è uguale alla posizione della linea che inizia con esso) e le due geometrie che creeranno la linea. Ovviamente restituisce NULL geom2 per l'ultimo punto, quindi dobbiamo verificarlo nella query esterna.

SELECT mmsi, num, ST_MAKELINE(geom,geom2) FROM (
  SELECT mmsi, row_number() OVER w AS num, geom, lead(geom) OVER w AS geom2
  FROM ais_data WINDOW w AS (PARTITION BY mmsi ORDER BY bs_ts) ) as q
WHERE geom2 IS NOT NULL;
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.