Servicio de autobús alimentador

9

En primer lugar, un poco de historia.

Yo trabajo para una agencia de tránsito regional. Estamos haciendo un "diagnóstico" sobre nuestro servicio de autobús alimentador. Nos gustaría saber qué proporción de nuestros usuarios podrían tomar el autobús para ir a la estación de tren en lugar de tomar su automóvil. Se ha hecho varias veces en el pase, pero ahora estamos usando gtfs como nuestra fuente de datos principal, por lo que tenemos que repensar nuestra metodología.

servicio de autobús alimentador típico

Para ser considerado "alimentando" el tren, una ruta de autobús debe tener una parada dentro de una cierta distancia de una estación de tren (topes rojos). Además, la sincronía con el servicio de trenes es muy importante porque si su autobús llega a la estación de tren media hora antes del tren, el tiempo de espera es demasiado largo y querrá dormir 20 minutos más por la mañana y tomar su automóvil.

Digamos que toma la línea A (azul) en la parada 12. Usted baja del autobús en la parada 13. El autobús llega a la parada 13, que es la parada para ir a la estación de tren # 1 5 minutos antes del tren. Eso es muy bueno. Eso significaría que todos los que toman esa ruta de autobús en una parada del 1 al 13 incluida llegarán 5 minutos antes de ese tren.

Luego, el tren, que atraviesa un área muy densamente poblada con muchas escuelas y cruces, se ve obligado a reducir su velocidad mucho. Mientras tanto, el autobús recoge a los pasajeros en la parada 14 a 17 y llega a la estación de tren # 2 10 minutos antes de ese tren. Entonces, los pasajeros que tomen el autobús en las paradas 14 a 17 tendrían un tiempo de espera de 10 minutos una vez que llegaran a la estación de tren. Entonces, a lo largo de esa línea de autobús, los pasajeros que toman el autobús en las paradas 1 a 13 tienen un tiempo de espera de 5 minutos, mientras que aquellos que toman el autobús en las paradas 14 a 17 tienen un tiempo de espera de 10 minutos.

La línea B, al otro lado de la vía, pasa cerca de la estación de tren n. ° 1, pero sus paradas están demasiado lejos para considerar la posibilidad de "alimentar" la estación de tren n. ° 1. Llega a la estación de tren n.º 2 7 minutos antes del tren (hazlo en cada tren durante la hora pico de la mañana; está muy bien sincronizado). Por lo tanto, los pasajeros a lo largo de la línea B, que toman el autobús a todas partes desde la parada 1 a la 59, tendrían un tiempo de espera de 7 minutos.

Ahora mi pregunta. Una vez que he determinado que las paradas de la línea A.13 y la línea A.17 están alimentando mi tren (se ha hecho espacialmente, en PostGIS), y que el tiempo de espera al tomar el autobús en una parada antes del # 13 es de 5 minutos, pero esos después un tiempo de espera de 10 minutos, ¿cómo puedo asignar el tiempo de espera a todas las paradas antes de ellos?

Me gustaría hacerlo en Postgres / PostGIS (pl / pgsql o pl / python), pero también puedo usar python puro (SO o arcpy).

Creo que podría retroceder. Entonces, una vez que encontré una parada que se ajusta (aquí Línea A.17), asigne el mismo tiempo de espera para detener 16, luego 15 ... hasta que encuentre otra parada que se ajuste a mis criterios (Línea A.13) y luego asigne el resto de las paradas, el mismo tiempo de espera que 13.

Sin embargo, no tengo idea de cómo crear tal bucle. No creo que pueda hacerlo en SQL, así que tendría que usar un lenguaje de procedimiento en PostgreSQL.

Tuve una idea de usar pgRouting para encontrar la ruta entre cada parada del alimentador de modo que la línea A se dividiera en dos (paradas 1 a 13 y luego 13 a 17). ¿Eso sería más fácil?

El siguiente paso, será usar pgRouting para calcular el tiempo de conducción de todas las paradas que tienen un tiempo de espera (¡perdón por la línea A.18 y más!) Y comparar eso con el horario del autobús para calcular la competitividad (¿son 5 ¿minutos más en autobús que en coche?)

¿Algunas ideas? Normalmente publico un largo guión de trabajo en progreso para mostrar el esfuerzo que he hecho hasta ahora, ¡pero estoy atascado!

fgcartographix
fuente
Debido a otros casos extraños, ahora considero cortar las rutas donde los pasajeros pueden bajarse del autobús. Por lo tanto, cada ruta "segmentos" será independiente. Todavía necesito descubrir cómo puedo cortar mis formas en PostGIS cuando mis paradas no son topológicamente correctas (las formas siguen la calle y las paradas están en el poste) ...;)
fgcartographix

Respuestas:

3

En realidad, crear el bucle que desea es realmente fácil con SQL:

SELECT DISTINCT ON (b1.line, b1.number) b1.line,b1.number,b2.waiting
FROM busstops AS b1
  LEFT JOIN busstops AS b2
    ON b1.line = b2.line
      AND b1.number<=b2.number
      AND b2.waiting IS NOT NULL
ORDER BY b1.line,b1.number,b2.number;

Violín .

También sería fácil, digamos, sumar tiempos de transferencia de una parada a otra.

Y podría usar pgRouting regular si solo logra transformar las rutas en un gráfico temporal (con nodos que representan las horas de salida y la hora del costo de la ruta).

Jakub Kania
fuente
Woot! Funciona ... Todavía hay partes que no entiendo, pero tengo la idea ... ¿Podría ser lo suficientemente valiente como para preguntarle que podría anular el tiempo de espera si una parada posterior tiene un tiempo de espera menor? La teoría es que podrías saltarte la primera estación de tren si tienes que esperar en la plataforma durante 20 minutos y quedarte en el autobús hasta la estación de tren 2 si la espera es de solo 4 minutos ...;) ¡¡¡Un millón de gracias !!!
fgcartographix
1
Solo cambia la ORDER BYcláusula. Las primeras dos columnas deben permanecer ya que están en la DISTINCT ONcláusula, pero aparte de eso, todo está permitido: sqlfiddle.com/#!1/24fab/2
Jakub Kania
Eres un mago !! :) ¡Gracias! ¡He estado luchando con eso por mucho tiempo!
fgcartographix
Solo asegúrate de que 4 minutos no sean para un tren que es una hora más tarde :)
Jakub Kania
Nah! El tiempo máximo de espera permitido es de 30 minutos y, aun así, ¡hay un gran símbolo rojo que dice que realmente no es bueno! ;) ¡Gracias de nuevo! Además, he ganado mi punto con mi jefe de que nadie realmente se quedará en un autobús tal vez 20 minutos más para ir a una estación de tren más lejos que la primera, incluso si el tiempo de espera es realmente más largo. ;)
fgcartographix
5

En el programa Google Summer of Code del año pasado, un estudiante implementó una función pgRouting para el enrutamiento multimodal. No llegó a la nueva versión 2.0, por lo que probablemente no funcione en este momento, pero es posible que desee echar un vistazo a los recursos disponibles para ver si es útil o no:

Sería bueno incluir esta función en la próxima versión, así que comuníquese con la lista de correo del desarrollador para coordinar el trabajo necesario en caso de que esté interesado: http://pgrouting.org/support.html

dkastl
fuente