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.
postgis
point
line
geometry-conversion
Thomas Becker
fuente
fuente
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 ...?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.Respuestas:
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.
fuente