Serviço de barramento de alimentação

9

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.

serviço típico de barramento de alimentação

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!

fgcartographix
fonte
Devido a outros casos estranhos, agora considero cortar as rotas onde os passageiros podem descer do ônibus. Portanto, cada "segmento" de rota será independente. Eu ainda preciso descobrir como posso cortar minhas formas no PostGIS quando minhas paradas não são topologicamente corretas (as formas seguem a rua e as paradas estão no poste) ...;)
fgcartographix

Respostas:

3

Na verdade, criar o loop que você deseja é realmente fácil com o 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;

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).

Jakub Kania
fonte
Woot! Funciona ... Ainda há partes que eu não entendo, mas entendi ... Posso ser ousado o suficiente para pedir que você substitua o tempo de espera se uma parada posterior tiver um tempo de espera menor? A teoria é que você pode pular a primeira estação de trem se tiver que esperar na plataforma por 20 minutos e permanecer no ônibus até a estação de trem 2 se a espera for de apenas 4 minutos ...;) Milhões de vezes !!!
fgcartographix
11
Apenas mude a ORDER BYcláusula. As duas primeiras colunas deve permanecer uma vez que está na DISTINCT ONcláusula, mas outra coisa senão que tudo é permitido: sqlfiddle.com/#!1/24fab/2
Jakub Kania
Você é um mago !! :) Obrigado! Eu tenho lutado com isso por muito tempo !!
fgcartographix
Apenas certifique-se que 4 minutos não é um trem que é uma hora mais tarde :)
Jakub Kania
Nah! O tempo máximo de espera permitido é de 30 minutos e, mesmo assim, há um grande símbolo vermelho dizendo que não é realmente bom! ;) Obrigado novamente! Além disso, ganhei meu argumento com meu chefe de que ninguém realmente ficará em um ônibus talvez 20 minutos a mais para ir a uma estação de trem mais distante que a primeira, mesmo que o tempo de espera seja realmente maior. ;)
fgcartographix 17/10
5

No 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

dkastl
fonte