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!
Respostas:
Na verdade, criar o loop que você deseja é realmente fácil com o SQL:
Violino .
Também seria fácil, digamos, somar os tempos de transferência de uma parada para outra.
E você pode usar o pgRouting regular se você conseguir transformar as rotas em gráfico temporal (com nós representando horários de partida e tempo do custo da rota).
fonte
ORDER BY
cláusula. As duas primeiras colunas deve permanecer uma vez que está naDISTINCT ON
cláusula, mas outra coisa senão que tudo é permitido: sqlfiddle.com/#!1/24fab/2No programa Google Summer of Code do ano passado, um aluno implementou uma função pgRouting para roteamento multimodal. Ele não entrou na nova versão 2.0, então provavelmente não funciona no momento, mas você pode dar uma olhada nos recursos disponíveis para ver se é útil ou não:
Seria bom incluir essa função no próximo lançamento. Entre em contato com a lista de discussão do desenvolvedor para coordenar o trabalho necessário, caso você esteja interessado: http://pgrouting.org/support.html
fonte