¿Crear línea a partir de puntos usando PostGIS?

10

Tengo una tabla PostGIS con datos de posición de numerosos vehículos y quiero crear líneas a partir de estos puntos.

Los datos pueden seleccionarse por identificación del vehículo y ordenarse por marca de tiempo, pero ¿cómo crear líneas a partir del resultado?

Lo que básicamente necesito es un segmento de línea desde el punto 1 hasta el punto 2, finalizar la línea y luego nuevamente desde el punto 2 hasta el punto 3. Por supuesto, todo eso en consideración de la identificación del vehículo.

Este último es necesario porque quiero calcular la dirección de crucero y la velocidad del vehículo de un punto a otro.

Thomas Becker
fuente
1
La función ST_MakeLine () hará esto, una vez que tenga su GROUP BY vehicle_id y ORDER BY marca de tiempo resuelto. Ver: postgis.refractions.net/docs/ST_MakeLine.html
Micha
Muy bien, simplemente lo intenté y emití la siguiente declaración: 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;Eso me dará la pista de cada vehículo, y no es exactamente lo que necesito. ¿Cómo decirle a ST_MakeLine () que cree una línea desde el punto 1 al punto 2, finalice la línea y comience una nueva desde el punto 2 al punto 3 ...?
Thomas Becker
¿Qué son "punto 1", "punto 2", "punto 3"? ¿Cómo los reconoces?
Micha
Pensé en reconocerlos a través del pedido de la marca de tiempo ... ORDER BY ais_data.bs_ts- ¿es posible? Entonces, el punto 1, el punto 2 y demás son básicamente la información del punto dada en cada línea como resultado de la instrucción Select.
Thomas Becker
En un primer paso, puede generar una línea por vehículo y luego generar vértices a partir de esta línea utilizando consejos de la lista de correo postgis postgis.17.x6.nabble.com/…
ThomasG77

Respuestas:

12

Se puede hacer de varias maneras, usando autouniones o subconsultas correlacionadas, pero usar funciones de ventana es probablemente la forma más fácil.

La función lead()devuelve un valor que está adelante en la partición dada y nuestra partición es(PARTITION BY <vehicle_id> ORDER BY <timestamp>)

Esta consulta nos da el número del vehículo, la posición de ese punto en la partición (que es igual a la posición de la línea que comienza con él) y las dos geometrías que formarán la línea. Por supuesto, devuelve NULL geom2 para el último punto, por lo que debemos verificarlo en la consulta externa.

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;
Jakub Kania
fuente