5 votos

¿Cómo trazar una línea entre dos lugares con puntos de paso?

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í:

enter image description here

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.

enter image description here

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)

3voto

Michael Barker Puntos 8234

Cambia la subselección para adaptarla a tus necesidades

select  st\_makeline(res.geom) 
FROM (SELECT geom from points group by group\_id order by time\_order)
Asegúrese de que la subselección devuelva los datos en el orden correcto

editar

¿Ayuda esto?

SELECT id, geom from lines where line\_id = 1  
union all 
select id, geom from stops where line\_id = 1
where id in (
        select id, geom from 
    (SELECT MAX(id) as id from stops WHERE line\_id = x  
    UNION ALL SELECT MIN(id) as id from stops WHERE line\_id = x  
    UNION ALL select id from linepoints  WHERE line\_id = x  
    ) as a group by id ) ORDER BY id

la tabla de paradas y la de líneas no pueden tener los mismos identificadores primero unimos la tabla de paradas y líneas y luego hacemos una lista ordenada por id's a partir de los datos que devuelve la subselección

  1. subselect obtiene el id máximo de line_id de la tabla stops
  2. subselect obtiene min id para line_id de la tabla stops
  3. obtiene todos los identificadores en line_id

(y ya se me olvidaba si tienes id's únicos en la tabla de paradas y líneas )

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X