knitr::opts_chunk$set(eval = FALSE)
A SPTrans nasceu em 1995 e é hoje responsável por quase todo o sistema de transporte no município de São Paulo. Como São Paulo é o município mais populoso do Brasil (e o sétimo do mundo!) , o desafio é bem grande.
A SPTrans também mantém uma das API's mais divertidas de São Paulo, o OlhoVivo. Com essa API é possível extrair informações em tempo real da localização de todos os ônibus, previsões de chegada, etc. Além disso, ela utiliza os padrões GTFS para organizar informações sobre as linhas ativas, os pontos de ônibus e tudo mais.
Hoje em dia, temos diversos aplicativos mobile e sites que usam essa API. Faça uma busca por "sptrans" na Google Play, por exemplo, e verá muitos apps que ajudam a planejar rotas de ônibus.
E por que não brincar com essas informações no R? Bom, pensando nisso fiz esse
pacote, que ajuda a configurar a API, baixar os dados da SPTrans em tempo real
e criar alguns gráficos básicos usando o pacote
leaflet
do RStudio.
O pacote ainda não está disponível no CRAN. Para instalar via GitHub, você
precisará instalar o pacote devtools
e então rodar
devtools::install_github('jtrecenti/spgtfs') # dados GTFS devtools::install_github('jtrecenti/sptrans') # funcoes e API
Carregue o pacote com o comando library
library(spgtfs) library(sptrans)
Para acessar a API OlhoVivo, você precisará primeiro de um token de acesso, que é uma sequência de letras e números geradas aleatoriamente pela SPTrans, por exemplo:
233f343e2ad2a3bf483eae00c316cfdd516c3xxxd21b6a3e916645877e137b6f
Para isso, siga os seguintes passos
normalizePath("~/")
no R.)..Renviron
(isso mesmo, com um ponto na
frente) e coloque o conteúdoOLHOVIVO_PAT=seu_token_aqui
Por exemplo:
OLHOVIVO_PAT=233f343e2ad2a3bf483eae00c316cfdd516c3xxxd21b6a3e916645877e137b6f
OBS: O arquivo .Renviron
deve ter uma linha vazia no final. Por exemplo,
se seu arquivo contém só o token da API OlhoVivo, seu arquivo deve ter duas
linhas com uma linha vazia.
Ctrl + Shift + F10
.Testando se está OK: O token é acessado pela função Sys.getenv()
do R.
Após realizar os passos descritos, experimente rodar
Sys.getenv('OLHOVIVO_PAT')
. Eu adicionei uma função no pacote chamada
check_olhovivo()
que faz exatamente isso. Se tudo estiver certo, a função
imprimirá o seu token e você poderá partir para o próximo passo!
Se encontrar algum problema, acesse essa página , que foi utilizada como base para criar este pacote.
Antes de sair baixando informações usando a API OlhoVivo, vamos ver um pouco mais a fundo o que é essa GTFS, para que serve, e como utilizar esses dados no nosso pacote.
A Especificação Geral sobre Feeds de Transporte Público é uma padronização de arquivos para que qualquer lugar do mundo possa divulgar informações de transporte público num formato único. Isso possibilita empresas como a Google e o aplicativo Moovit a juntar as informações de vários lugares sem muito trabalho. O padrão também ajuda os responsáveis pela obteção dos dados, pois é mais fácil seguir um guia do que planejar a estrutura de dados do zero.
Os dados e a documentação da GTFS estão no pacote spgtfs
. Após carregar os
dados, é possível visualizar os bds disponíveis em data(package = 'spgtfs')
.
Se quiser, por exemplo, verificar a documentação de shapes
, rode ?shapes
.
É recomendável que o pacote dplyr
seja carregado antes de trabalhar com
esses dados, para não correr o risco de imprimir dez mil linhas no console.
Vejamos, por exemplo, as linhas de ônibus contidas em trips
:
head(trips, 10)
As informações do GTFS, por si só, já são bastante úteis.
trips
, sabemos todas as linhas de ônibus. stops
, sabemos todas as paradas. stop_times
, conseguimos descobrir quais linhas passam em quais pontos.shapes
, sabemos todos os trajetos no mapa.Com a ajuda do pacote ggmap
, é possível utilizar a API do google para obter
coordenadas geográficas a partir de endereços.
Vamos às funções do pacote!
A função nearby_stops
procura pontos de ônibus próximos a um endereço
informado. Os pontos próximos são identificados dentro de um raio que por
padrão é de 300 metros.
Veja alguns exemplos:
Utilização básica.
nearby_stops('Avenida Paulista, 1079')
Neste exemplo, não encontramos nenhum ponto de ônibus.
nearby_stops('Avenida Paulista, 1079', radius = 100)
Também é possível informar latitude e longitude.
nearby_stops(lon = -46.6527, lat = -23.5648)
A função draw_stops
desenha o ponto informado, o raio informado, e os pontos
de ônibus próximos.
nearby_stops('Avenida Paulista, 1079', 200) %>% draw_stops()
A função search_path
procura possíveis caminhos de um ponto até outro ponto,
ou seja, procura linhas de ônibus (trips) que passem próximos a duas
localizações informadas. Até o momento, ainda não é possível identificar
caminhos com utilização de duas linhas distintas.
search_path(end1 = 'Avenida 9 de Julho, 2000, São Paulo', end2 = 'Av. Pres. Juscelino Kubitschek, 500, São Paulo')
A função draw_paths
desenha os dois pontos informados, os raios informados,
os pontos de ônibus válidos e os caminhos possíveis (no máximo oito).
search_path(end1 = 'Avenida 9 de Julho, 2000, São Paulo', end2 = 'Av. Pres. Juscelino Kubitschek, 500, São Paulo') %>% draw_paths()
Outro exemplo, aumentando o raio 2.
search_path(end1 = 'Avenida 9 de Julho, 2000, São Paulo', end2 = 'Av. Pres. Juscelino Kubitschek, 500, São Paulo', radius2 = 500) %>% dplyr::filter(!stringr::str_detect(trip_headsign, 'Santana|Luz|Band|Armenia|Pedro Ii')) %>% # Obs: tirei manualmente as linhas que vão para o lado oposto ao que eu # quero, isto é, que vão da JK até a 9 de Julho. # Esse é um problema conhecido do pacote. draw_paths()
Na versão atual do pacote, temos a função colect_bus
, que torna possível
obter as localizações de ônibus a partir de:
trip_ids <- search_path(end1 = 'Avenida 9 de Julho, 2000, São Paulo', end2 = 'Av. Pres. Juscelino Kubitschek, 500, São Paulo') trip_ids %>% collect_bus(trip_id, 'trip')
trip_ids %>% collect_bus(route_id, 'route')
Para desenhar os ônibus no mapa, basta chamar a função draw_bus()
.
trip_ids %>% collect_bus(trip_id, 'trip') %>% draw_bus()
É possível desenhar tanto os ônibus em tempo real quanto os caminhos da
função draw_paths
m <- trip_ids %>% draw_paths() trip_ids %>% collect_bus(trip_id, 'trip') %>% draw_bus(m)
Observe que os ônibus realmente andam!
Sys.sleep(10) trip_ids %>% collect_bus(trip_id, 'trip') %>% draw_bus(m)
ggmap
.Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.