Git Product home page Git Product logo

cruzalinhas's Introduction

cruzalinhas

Aplicativo e API de acesso a rotas de transporte público de São Paulo, disponível em cruzalinhas.chester.me

Motivação

Os itinerários das linhas de transporte público administradas pela SPTrans são referentes a um serviço PÚBLICO, e sempre defendi que estes deveriam estar disponíveis de uma forma mais acessível do que o site (ainda mais sabendo que algumas empresas privadas tinham acesso), permitindo a criação de ferramentas que facilitem a vida do usuário.

Foi criado um programa que capturava os dados diretamente do site da SPTrans (scraper) e para demonstrar seu uso, o site cruzalinhas.

O cruzalinhas permite buscar um endereço ou clicar no mapa e rapidamente ver o traçado de linhas (rotas) que passem perto dele. Ao marcar pontos sucessivos, o sistema "cruza" as linhas que passam entre eles - daí o nome.

Com a Lei de Acesso à Informação e uma mudança de postura da SPTrans (que criou um site para desenvolvedores no qual é possível baixar os itinerários(*) no formato GTFS), o scraper se tornou obsoleto, e o cruzalinhas foi atualizado para importar os dados diretamente no formato acima.

(*) embora ainda irregular perante a lei por não "possibilitar o acesso automatizado por sistemas externos" (Art. 8º, §3º, III). Mas isso é outro assunto.

Funcionamento

O sistema de importação e a API (originalmente baseados em Python/Google App Engine) foram refeitos com Ruby on Rails, preservando a compatibilidade com o site (um aplicativo web de página única feito com HTML e JavaScript) e com aplicativos de terceiros.

Serviços Utilizados

Os mapas são gerados pela comunidade OpenStreetMap, e os tiles são servidos pela Mapbox através da biblioteca Leaflet, com busca de endereços via Nominatim, nos termos de uso de cada um destes serviços.

Informações para Desenvolvedores

Baixando e inicializando

A inicialização é a tradicional de qualquer aplicativo Rails:

git clone [email protected]:chesterbr/cruzalinhas.git # (ou seu fork)
cd cruzalinhas
# Se você não tem rbenv/ruby-build, vide: https://github.com/rbenv/ruby-build.
# (para GitHub Codespaces: rvm install $(cat .ruby-version) - isso se ele já não fizer isso automaticamente)
# Alternativamente, substitua a linha abaixo por qualuer coisa que instale
# a versão do Ruby em .ruby-version
rbenv install
gem install bundler
bundle
bin/rake db:create db:migrate

Atualizando com dados da SPTrans

Embora a SPTrans tenha disponibilizado os dados GTFS, eles exigem o cadastro para baixar o arquivo, tornando a automação de projetos como este difícil. Felizmente, o OpenMobilityData mantém a última versão dos dados, então basta chamar o comando abaixo para baixar os dados mais recentes e atualizar o banco de dados local:

bin/rake sptrans:import

(é preciso ter o wget instalado - você provavelmente já tem, mas senão, algo como brew install wget ou sudo apt-get install wget resolve).

Para abrir a página da linha na SPTrans, é preciso saber o código interno ("CdPjOID") atribuído à versão atual dela , o que não consta na base GTFS. Como o site da SPTrans carrega uma lista com todas as linhas ("letreiros") e códigos atuais, o importador baixa essa lista e gera as URLs no banco de dados.

Rodando o servidor

Novamente, o esquema padrão Rails: bin/rails server e abra http://localhost:3000.

API

A referência da API está no próprio site (são apenas duas chamadas), basta clicar no link "API".

Contribuindo

Existe uma lista de issues, e você pode acrescentar suas sugestões a ela. Caso resolva trabalhar em algum deles (ou em um novo que você criar), deixe um comentário no issue (para evitar que duas pessoas trabalhem na mesma coisa ao mesmo tempo), faça um fork e no final submeta um pull request.

Licença

O código-fonte está disponível sob a licença MIT. Essencialmente, o uso é livre, devendo apenas a nota de copyright ser reproduzida em cópias/trabalhos derivados.

O serviço é prestado na melhor intenção de ajudar as pessoas a se localizar, sem qualquer garantia, explícita ou implícita de funcionamento, atualização, precisão ou veracidade das informações prestadas. A fonte original são os dados disponibilizados pela SPTrans, cujo site deve ser sempre consultado para validação da informação.

cruzalinhas's People

Contributors

chesterbr avatar dependabot[bot] avatar vinicius834 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

cruzalinhas's Issues

Upload com user/senha no sptscraper

Hoje: sptscraper recebe chave de autenticação no google para upload
Esperado: sptscraper receber senha para isso (perguntando no prompt se não for passada)
Objetivo deixar o processo em alguma crontab da vida.

Mudar design dos pins do mapa

Os pins atuais vieram do Google Maps. Muito provavelmente não existe uma restrição de uso, mas seria melhor usar pins explicitamente de domínio público, creative commons ou licenciados para o software.

Aproveitando: não sei ao certo se o ponto onde o pin é colocado no mapa (por uma busa de endereço ou pelo click/drag-and-drop) corresponde de fato à "ponta da agulha" (ponto inferior central da imagem). Suspeito que um ou ambos esses mecanismos estejam usando outro sistema de referência (ponto central da imagem, ou ponto superior esquerdo).

Vale a pena acertar isso quando for mudar esse layout.

Corrigir layout/html

Quando #12 foi implementado, a página toda foi copiada para a view, mas o layout default do Rails foi mantido, gerando um "html dentro de html".

Solução rápida é deixar só o yield no layout. Um pouco mais limpinho seria deixar o conteúdo do body na view e o esqueleto no layout (aproveitando pra ver se o que está no layout default faz sentido - provavelmente não).

Test suite

"Low hanging fruit":

  • Integração nos 2 endpoints da "API python"
  • Model que customiza o gtfs_engine para SPTrans

Modernizar o cliente

É bem difícil manter e melhorar a single-page app como ela foi desenvolvida originalmente.

Idéias:

  • Separar os assets e scripts apropriadamente
  • Considerar o uso de um framework (ex.: AngularJS, React), ou ao menos separar melhor a parte dinâmica.
  • Considerar o uso de CoffeeScript

"Bootstrap" para desenvolvedores

É preciso facilitar a vida de quem quer mexer no sistema. Alguns itens que faltam:

  • Um passo-a-passo para não-iniciados em GAE rodarem a app localmente (sugestão do Shiota)
  • Um esquema para popular com um pequeno dataset (ex.: um comando no sptscraper que popule localmente com umas poucas linhas rapidamente em local conhecido, ou mesmo um dataset de linhas pronto para upload)

verificar se carga foi bem sucedida

Uma carga mal-sucedida foi reportada outro dia por um usuário de forma inteligente: ele notou que na paulista x consolação tavam voltando coisa de 7 linhas (o normal é umas 30 ou mais); de repente o processo de carga poderia, ao final, verificar dois ou três pontos estratégicos como este e notificar falha se vierem poucas linhas.

Colocar pin no local atual (era: cruzalinhas.com mobile)

Versão do site viável para acesso em celulares. A idéia mais simples seria auto-detectar a posição do usuário (batendo para uma caixa de busca/geocoding se não detectar), listando as linhas e, ao clicar, link para Google Maps com link para URL do KML da linha (para abrir o aplicativo de Google Maps local ou, se não houver, deixar o Google se virar).

Possibilidades (se não entrarem, podem virar novos issues):

  • Gerar o KML x Linkar para KML do ToApe (dá pra relacionar?) x Linkar para Google Transit apontando para a linha (é possível?)
  • Guardar um ou mais "pontos default" (ex.: "casa", "escritório") e oferecer em um ou dois toques a possibilidade de já buscar por linhas próximas que passam pelo ponto default.
  • Aplicativo nativo (isso certamente é um novo issue)

Link retornado pela API esta quebrado

O link que esta retornando na chamada da API, como informação da linha, esta retornando o seguinte erro:

Ocorreu um erro no processamento da sua requisi��o. Por favor verifique as informa��es e tente novamente.

Maybe temporary, but tiles 429-ing

When loading cruzalinhas.com, I sometimes get holes in the map, with 429 (Too Many Requests) on the Network console (both Chrome & Firefox):

image

The page output mentions maintenance, but it happened in the past, and it seems odd that it happens only for some tiles.

image

Also, successive reloads (or opening the tile in a new tab) gets it, and when it is loaded, some cache (local or theirs) ensures it always loads.

I can totally understand that my browser/internet may be requesting too many tiles at once, but I'd expect the .js library to throttle that appropriately, so a first thing to try here is to upgrade (I don't even remember what I used there, probably some wrapper so I could switch map providers, as I migrated away from Google Maps)

Selecionar/desselecionar todos os checkbox

Todas as vezes que eu usei o Cruzalinhas, eu senti falta de uma opção pra selecionar ou desselecionar todos os checkbox. Chega uma hora em que o mapa fica muito carregado, e eu vou desselecionando um por um para limpá-lo.

Scraping sem intervenção manual

: Hoje o sptscraper precisa ser chamado na ordem das operações, i.e.: download, parse e upload.

Além disso, se o download dá problema, o programa sai e é preciso chamar o resume, e se o upload dá problema é preciso chamá-lo novamente.

Comportamento Esperado: ./sptscraper.py sync <chave de autenticação> deveria testar a autenticação, efetuar o download (fazendo resume com pausa se houver algum erro), efetuar o parse (esse pode parar se der erro, porque pode significar mudança na sptrans) e fazer o upload (repetindo com pausa se der erro). No final (por sucesso ou erro fatal) enviar um e-mail para

Mostrar dados da linha sem depender da SPTrans

Atualmente o site dá link direto para a SPTrans quando o usuário clica na linha. O problema é que as URLs lá mudam o tempo todo, e rapidamente o link quebra.

Idéia: Mostrar as infos da SPTrans direto na página (é preciso confirmar que o crawler esteja de fato capturando tudo) e o link para sptrans seria um sub-link na "ficha" da linha (poderia ter link para o Tô a Pé também, por exemplo)

Busca de endereços caindo em outras cidades

Isso acontece, por exemplo, com "Praça Almeida Júnior" ou "Rua da Consolação". Incrivelmente, com ruas mais obscuras como "Rua Solidônio Leite", não acontece. Talvez seja preciso forçar a barra um pouco com o novo geocoder para ele "acertar" o município...

Filtro por dia útil / sábado / domingo

Nem todas as linhas circulam todos os dias. Hoje o site mostra a informação da primeira viagem da rota É preciso adaptar a interface e a API, mantendo a compatibilidade retroativa.

Encerrar domínio cruzalinhas.com

O domínio vence em 60 dias, e esse $ pode ser usado em outras coisas.

  • Fazer o site aceitar cruzalinhas.chester.me
  • Incluir cruzalinhas.com nos redirects, e redirecionar para cruzalinhas.chester.me
  • Links relativos onde aplicável (ex.: exemplos da API)
  • mudar links para cruzalinhas.chester.me onde precisar de um link absoluto
  • Avisar no site que o endereço antigo vai sair do ar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.