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.
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!
Respuestas:
En realidad, crear el bucle que desea es realmente fácil con SQL:
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).
fuente
ORDER BY
cláusula. Las primeras dos columnas deben permanecer ya que están en laDISTINCT ON
cláusula, pero aparte de eso, todo está permitido: sqlfiddle.com/#!1/24fab/2En 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
fuente