Primeiro de tudo, um pouco de fundo.
Eu trabalho para uma agência de trânsito regional. Estamos fazendo um "diagnóstico" sobre nosso serviço de barramento de alimentação. Gostaríamos de saber qual a proporção de nossos usuários que podem pegar o ônibus para ir à estação de trem em vez de pegar o carro. Isso já foi feito várias vezes no passe, mas agora estamos usando gtfs como nossa principal fonte de dados, por isso precisamos repensar nossa metodologia.
Para ser considerado "alimentando" o trem, uma linha de ônibus deve parar a uma certa distância de uma estação de trem (amortecedores vermelhos). Além disso, a sincronicidade com o serviço de trem é muito importante, porque se o seu ônibus chegar à estação de trem meia hora antes do trem, o tempo de espera será muito longo e você deverá dormir mais 20 minutos pela manhã e pegar seu carro.
Digamos que você pegue a Linha A (Azul) na parada 12. Você sai do ônibus na parada 13. O ônibus chega na parada 13, que é a parada para ir para a Estação de Trem # 1 5 minutos antes do trem. Isso é muito bom. Isso significaria que todos que pegassem a linha de ônibus em uma parada de 1 a 13 incluídos chegariam 5 minutos antes do trem.
Então, o trem, passando por uma área muito densamente povoada, com muitas escolas e travessias, é forçado a reduzir muito sua velocidade. Enquanto isso, o ônibus pega os passageiros nas paradas 14 a 17 e chega à Estação de Trem # 2 10 minutos antes desse trem. Assim, o passageiro pegando o ônibus nas paradas 14 a 17 teria um tempo de espera de 10 minutos quando chegasse à estação de trem. Assim, ao longo dessa linha de ônibus, os passageiros que tomam o ônibus nas paradas de 1 a 13 têm um tempo de espera de 5 minutos, enquanto aqueles que tomam o ônibus nas paradas de 14 a 17 têm um tempo de espera de 10 minutos.
A linha B, do outro lado da pista, passa perto da Estação de Trem # 1, mas suas paradas são muito longe para considerar "alimentar" a Estação de Trem # 1. Ele chega à Estação de Trem # 2 7 minutos antes do trem (faça isso para todos os trens durante a hora do rush da manhã; está muito bem sincronizado). Assim, os passageiros ao longo da Linha B, pegando o ônibus em qualquer lugar da parada 1 a 59, teriam um tempo de espera de 7 minutos.
Agora minha pergunta. Depois de determinar que as paradas da Linha A.13 e da Linha A.17 estão alimentando meu trem (isso foi feito espacialmente, no PostGIS), e que o tempo de espera ao pegar o ônibus em uma parada antes do nº 13 é de 5 minutos, mas os que estão depois um tempo de espera de 10 minutos, como posso atribuir o tempo de espera a todas as paradas antes deles?
Eu gostaria de fazê-lo no Postgres / PostGIS (pl / pgsql ou pl / python), mas também posso usar python puro (sistema operacional ou arcpy).
Eu poderia, penso, voltar para trás. Então, uma vez que encontrei uma parada que se encaixa (aqui LinhaA.17), atribua o mesmo tempo de espera à parada 16, depois 15 ... até encontrar outra parada que atenda aos meus critérios (LinhaA.13) e depois atribua o restante das paradas, o mesmo tempo de espera que 13.
Não tenho idéia de como criar esse loop. Eu não acho que posso fazer isso no SQL, então eu teria que usar uma linguagem processual no PostgreSQL.
Eu tive uma idéia de usar o pgRouting para encontrar a rota entre cada parada do alimentador, de modo que a Linha A seria dividida em duas (paradas 1 a 13 e 13 a 17). Isso seria mais fácil?
O próximo passo será usar o pgRouting para calcular o tempo de condução de todas as paradas com tempo de espera (desculpe a Linha A.18 e mais!) E compará-lo com o horário do ônibus para calcular a competitividade (é preciso 5 minutos a mais em ônibus que em carro?)
Alguma ideia? Normalmente, posto um longo script de trabalho em andamento para mostrar o esforço que fiz até agora, mas estou emperrado!