Cómo extraer una subcadena de una cadena lineal con segmentos superpuestos

15

Planteamiento del problema: dada una ruta de autobús (definida como una cadena lineal ln.the_geom), y un conjunto de ubicaciones de paradas de autobús (pt1.the_geom, pt2.the_geom, ... ptn.the_geom), divida la ruta de autobús en segmentos entre paradas de autobús . Estoy usando dos funciones postgis

    ST_line_substring(ln.the_geom,ST_line_locate_point
    ln.the_geom,pt1.the_geom),ST_line_locate_point(ln.the_geom,pt2.the_geom))

Lo anterior funciona bien si la ruta del autobús no tiene secciones superpuestas. Sin embargo, si hay secciones superpuestas, ST_line_locate_point ajustará un punto al otro extremo de la cadena lineal. Como ejemplo: el autobús viaja de A a B, realiza un bucle, luego viaja de B a A. "A a B" y "B a A" son rutas paralelas con todos los puntos superpuestos. En el caso de las paradas de autobús P1 y P2, P2 se asigna en el punto P2 'en su lugar (en la dirección opuesta). El segmento se extrae incorrectamente en este caso (donde se incluyen segmentos adicionales).

¿Cómo resolver problemas como este? Las rutas de autobús superpuestas pueden ocurrir en cualquier sección de la ruta ... EJEMPLO

usuario35469
fuente
¿Hay alguna manera de identificar los términos de sus rutas de autobús y dividir la cadena de líneas cerrada en una línea en cualquier dirección? Entonces ya no tendrás segmentos superpuestos. Por ejemplo, podría encontrar el punto más alejado de la línea desde el principio y separar su línea en dos direcciones usando ese punto.
raphael
33
Antigua pregunta, pero parece que necesita comenzar y definir secciones, unirse con el conjunto de datos de puntos y eliminar cualquier sección con un orden inicial de puntos mayor que el punto final. ¿Tiene esto algún sentido?
Jorge Sanz
1
¿Podría proporcionar la geometría WKT para la ruta de autobús dada?
kttii

Respuestas:

1

Suponiendo que la ruta del autobús se solape no más de 2 veces en cualquier punto dado, esto podría resolverse invirtiendo la línea para el punto de localización de la segunda línea, localizando el punto más cercano al final de la línea. Deberá restar esto de 1 para usar en la consulta ST_LineSubstring. P.ej

ST_LineSubstring(ln.the_geom,
  ST_LineLocatePoint(ln.the_geom, pt1.the_geom),
  1 - ST_LineLocatePoint(ST_Reverse(ln.the_geom), pt2.the_geom))
Nathan Lawrence
fuente