Executando verificação de segurança...
32

Fiz um Mapa com Localizações dos Ônibus de Curitiba durante uma Tarde

Como dev, eu adoro deixar meu projeto principal de lado e me concentrar em alguma coisa aleatória de vez em quando. Então, vou contar para vocês o que fiz essa semana. :)

Descobri há alguns dias que Curitiba tem um servidor socket.io ""público"" que oferece acesso a várias informações da URBS (Urbanização de Curitiba). Ele também disponibiliza a localização em tempo real de todos os ônibus, mas o problema é que essas informações são atualizadas apenas a cada 60 segundos.

Mesmo assim, tive a ideia de salvar todas as localizações dos ônibus durante uma tarde inteira (das 12h até às 22h, mais ou menos), e foi exatamente isso que fiz.

No final, coletei 82MB de dados com 873.670 localizações diferentes. Registrei o horário de cada atualização, além de informações como latitude, longitude, ID do veículo, etc.

Consegui uma imagem da área de Curitiba e com esses dados criei três tipos de mapas:

  • O primeiro mostra todos os 873.670 pontos como pequenas bolinhas. É bem simples, mas já dá para ver os caminhos: imagem1

  • O segundo é parecido, mas com uma cor diferente para cada veículo. É possível identificar alguns trajetos comuns e outros que apenas veículos específicos seguem: imagem2

  • O terceiro, e o que foi mais difícil de criar, é um mapa onde tentei calcular a velocidade (em km/h) em cada ponto usando Vincenty's inverse formula. Com a posição atual, a anterior e o tempo entre elas, tentei estimar a velocidade. O azul representa a velocidade normal, e quanto mais avermelhado, mais rápido (em teoria). Apesar de ficar um pouco difícil de enxergar, o resultado é bem interessante. imagem3

Com esses dados e provavelmente mais tempo, seria possível fazer coisas como prever a localização exata dos ônibus em "tempo real", baseado no histórico, já que os trajetos são fixos. Eu pessoalmente não vou seguir com essa ideia, mas é possível.

Obrigado por lerem!

Carregando publicação patrocinada...
3

Que legal sua iniciativa e da cidade também, tornando públicas as informações para que a própria população possa consumir esses dados em tempo real.

Você pretende disponibilizar sua lista de coordenadas num repositório no Github? Para calcular as velocidades também seria possível usar as coordenadas lat,long convertidas para o sistema de projeção UTM (coordenadas planas EPSG 31983 – SIRGAS2000 – UTM-23S) para a cidade de Curitiba, segundo notei em um mapa da cidade. Talvez as distâncias planas devam ser reduzidas para a altura média do local, já que a distância na projeção será ligeiramente menor que aquela medida na altitude.

1

Obrigado!

Sobre as coordenadas, nesse prazo de 10 horas um json só com a latitude e longitude pesou 30mb, e ainda tem outras informações como o horário, etc. Eu planejava sim colocar os dados em algum lugar, mas o plano era ser de um prazo maior, tipo uma semana. Se somente 10 horas de dados "incompletos" pesou tudo isso, eu não tenho certeza se daria para usar o GitHub para hospedar essas informações.

Para diminuir o tamanho, tem a possibilidade de remover completamente os veículos imóveis do dia e os pontos iguais do mesmo veículo. Se você tem alguma ideia para isso, ajudaria demais!

Gostei da sua ideia das velocidades e nem sabia que esse mapa da cidade existia, se eu conseguir publicar os dados em algum lugar eu mando por aqui.

3

Muito massa! Moro em CWB e já tive que fazer um trabalho da faculdade envolvendo grafos com o mapa de Curitiba, foi bem trabalhoso, principalmente a parte de lidar com manipulação de arquivo + estrutura de dados em C (sim...).
Lembro de ver uma aplicação da URBS que mostra em tempo real o percurso dos ônibus, mas não sei se funciona ou se realmente alguém usa (https://www.urbs.curitiba.pr.gov.br/mobile/itibus), mas lembrei disso quando vi teu post. Parabéns!

1

Teve que fazer o trabalho inteiro em C? Meus pêsames kk.

Foi com essa exata aplicação da URBS que descobri isso! Esse ItiBus usa o mesmo servidor socket.io que eu usei, descobri ele fazendo uma mini engenharia reversa.

Eu fico meio decepcionado de que Curitiba, uma "cidade inteligente", tem tanta coisa e API pública que não é documentada nem divulgada em lugar nenhum. Nesse servidor socket.io tem como saber quantas pessoas estão conectadas simultaneamente, e é um número consideravelmente alto. Meu chute é que esses aplicativos, tipo o "Moovit" ou "Curitiba 156" usem esse servidor de alguma forma.

O aplicativo do Moovit, por exemplo, coloca um paywall para conseguir ver a "localização em tempo real" e enfia propaganda na sua cara toda hora que abre o app. Tem duas opções:

  • Ou eles usam esse servidor socket.io no backend deles.
  • Ou a URBS disponibilizou um lugar específico que eles conseguem consultar que é realmente em tempo real.
    De qualquer forma, eu não acho legal que uma coisa pública como os ônibus, que milhares de pessoas usam diariamente, tenham informações tão escondidas. E seria pior ainda se fosse a segunda opção, eles privatizarem acesso a uma informação tão útil e necessária para colocarem atrás de um paywall.

Essas são minhas frustrações kkkkk

1

Se tratando de cidade inteligente e referência em urbanização, pecar nessas tecnologias é realmente frustrante. Uso o Moovit, e dá pra ver que tem chucho envolvendo o real time (aquela função de ver realmente em qual ponto o ônibus tá passando). Um modo de reparar e constatar essas hipóteses tuas é pegar uma linha de um ônibus que passa em regiões metropolitanas que não são operadas pela URBS: será que o Moovit se dá o trabalho de monitorar/calcular 2 API's pra mostrar pro usuário? hahahah

1

É um real time que não é real time, achava que era o único que não tinha percebido isso kkkk
Tem um monte de onibus que a Moovit não aparece a opção de realtime, então fica muito suspeito mesmo kkkkk

1

Muito bom!!! Moro em Curitiba, e fiz um trabalho na época da faculdade sobre tecnologia na mobilidade urbana... porém lá em 2008, eram ainda mais precárias as informações que eram existiam, e as poucas não eram disponibilizadas para o público! Creio q houve uma enorme evolução, e nos próximos anos tende a melhorar ainda mais!

1
1
1

O mapa em si é só uma imagem que eu consegui usando o BigMap 2 (que é do OpenStreetMap) e "desenhei por cima" com o meu código.

Consegui a área do mapa (minLat, maxLat, minLon, maxLon) e fiz um cálculo para conseguir a posição do pixel de cada coordenada. :D

PIXEL_X = (POS_LON - LON_MIN) / (LON_MAX - LON_MIN) * IMG_SIZE
PIXEL_Y = (POS_LAT - LAT_MIN) / (LAT_MAX - LAT_MIN) * IMG_SIZE
1
1

Tem como criar várias coisas com isso. Agora o jeito é esperar alguem tentar ir atrás e ficar milionário com a ideia kkkkkk