He preparado un conjunto de datos de seguimiento por GPS, que actualmente consiste en una tabla con puntos de parada y una tabla con los puntos GPS en bruto. La primera tabla contiene una columna para cualquier punto de parada que muestra los identificadores de los puntos agrupados.
Ahora quiero conectar los puntos de parada con líneas, no sólo con conexiones directas (st_makeline(geom, geom)), sino con puntos vía de la tabla de puntos brutos. Por lo tanto, he intentado algo como
st_makeline(array[stoppingpoint, viapoints_lying_between_these, next_stoppingpoint])
Lamentablemente, esta consulta conecta todos los puntos de paso con el punto de parada con una sola línea, como se ve aquí:
La consulta tiene el siguiente aspecto:
st_makeline(stops.the_geom, raw_points.the_geom, ARRAY[lead(stops.the_geom) OVER (ORDER BY stops.group_id)])AS lines,
stops.group_id, row_number() OVER (ORDER BY stops.group_id) AS line_id
from // semantic: where raw_points.id lies between maximum_id_from_first_stop and minimum_id_from_next_stop
Cuando pongo manualmente los puntos de paso y los dos puntos de parada en una matriz dentro de la función st_makeline, funciona en términos de dibujar una línea.
Gracias por cualquier consejo.
ACTUALIZACIÓN:
Bien, todavía no he resuelto el problema. Así que, aquí está la tabla para una mejor comprensión: Lo que necesito son líneas desde cada punto de parada (marcado por la columna group_type), que son los centroides de los puntos agrupados, hasta el siguiente punto de parada a través de los puntos intermedios. En este caso, una línea comenzaría en el punto con group_id 38, terminaría en group_id 42 y se conectaría a través de los puntos 498, 499 y 500.
ACTUALIZACIÓN:
Finalmente encontré una solución. Primero fusioné todos los waypoints consecutivos (id 38-42 en la imagen inferior) con una función de ventana dando nuevos group_nr's:
sum(group_flag) OVER (ORDER BY id) AS group_nr
FROM ( SELECT
CASE WHEN lag(group_type) OVER (ORDER BY id) = group_type THEN
ELSE 1
END AS group_flag from table) t1
Luego hago líneas desde cada grupo de waypoints (multipuntos) y añado la geometría del punto de parada anterior y el siguiente a cada línea:
-- 1. previous stop:
st_addpoint(st_linefrommultipoint(groups.the_geom), lag(groups.the_geom) OVER (ORDER BY groups.group_id), 0)
-- 2. next stop:
st_addpoint(t1.new_geom, lead(t1.the_geom) OVER (ORDER BY t1.group_id)