Matriz de distâncias rodoviárias e duração de viagens para municípios brasileiros

Introdução

Informações de distância entre lugares são úteis para avaliar a proximidade e a interconexão entre regiões. A distância euclidiana entre dois lugares, embora simples e fácil de calcular, não é realista em termos de custos de deslocamento. Esta base apresenta métricas de distância rodoviária e duração de viagem entre todos os municípios brasileiros.

Métodos

Como referência para o ponto inicial e final das rotas, optei por usar a localização da sede dos municípios, geralmente a prefeitura ou o centro histórico. Esses dados são gerados originalmente pelo Instituto Brasileiro de Geografia e Estatística (IBGE) e estão disponíveis no pacote {geobr}. Os dados mais recentes disponíveis são de 20101 e apresentam 5.565 feições.

Com a lista de municípios e suas respectivas coordenadas geográficas de sede, uma lista de pares de municípios é calculada usando análise combinatória simples. Exemplo:

x <- c("a", "b", "c", "d")

combn(x, m = 2)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a"  "a"  "a"  "b"  "b"  "c" 
[2,] "b"  "c"  "d"  "c"  "d"  "d" 
Note

Com isso, assumo que a distância entre dois municípios é a mesma, independentemente do sentido.

Assim, para os 5.565 municípios, temos o seguinte número total de rotas a calcular:

choose(n = 5565, k = 2)
[1] 15481830

Para calcular a distância rodoviária entre pares de municípios, foi usado o serviço de API OSRM, com o pacote {osrm} (Giraud 2022). Mais especificamente, foi usado o serviço de tabela, considerando o perfil “car”, retornando como resultado a distância em metros e a duração estimada da viagem em minutos para a rota mais rápida encontrada.

Exemplo de rota

Por exemplo, vamos calcular a distância rodoviária entre Rio de Janeiro, RJ, e São Paulo, SP, com o pacote {osrm}.

library(geobr)
library(osrm)
library(leaflet)
library(sf)

seats <- read_municipal_seat(showProgress = FALSE)

rj <- subset(seats, code_muni == 3304557)
sp <- subset(seats, code_muni == 3550308)

route <- osrmRoute(
  src = rj, dst = sp, 
  overview = "full",
  osrm.profile = "car"
)
# Distância da rota, em metros
route$distance
[1] 422.4296
# Duração da rota, em minutos
route$duration
[1] 319.9333
route |>
  st_transform(4326) |>
  leaflet() |>
  addTiles() |>
  addPolylines()
Important

Para alguns pares de municípios, o serviço OSRM não consegue determinar uma rota rodoviária possível. Isso é esperado, já que alguns municípios são acessíveis apenas por avião ou barco.

Os scripts usados para preparar a base estão disponíveis aqui.

Baixar a base de dados

A base com as distâncias rodoviárias e durações de viagem está disponível no Zenodo nos formatos RDS, parquet e CSV compactado.

Clique no link abaixo para acessar e baixar os dados.

Também é possível baixar a base diretamente pelo R usando o pacote {zendown}.

# install.packages("zendown")
library(zendown)

dist_brasil_file <- zen_file(11400243, "dist_brasil.rds")

dist_brasil <- readRDS(dist_brasil_file)

head(dist_brasil)
     orig    dest   dist   dur
1 1100015 1100023 330534 313.6
2 1100015 1100031 397600 380.7
3 1100015 1100049 112805 113.9
4 1100015 1100056 390938 373.2
5 1100015 1100064 353606 333.9
6 1100015 1100072 321636 348.5

Gráficos

library(ggplot2)

ggplot(data = dist_brasil, aes(x = dist/1000)) +
  geom_histogram(bins = 100) +
  labs(
    title = "Distância rodoviária da rota mais rápida entre municípios brasileiros", 
    x = "Distância (km)", y = "contagem"
  ) +
  theme_bw()

ggplot(data = dist_brasil, aes(x = dur/60)) +
  geom_histogram(bins = 100) +
  labs(
    title = "Duração estimada da rota mais rápida entre municípios brasileiros", 
    x = "Duração da viagem (horas)", y = "contagem"
  ) +
  theme_bw()

Planos futuros

  • Calcular rotas usando outros serviços de roteamento disponíveis.

  • Atualizar a base anualmente, já que a infraestrutura rodoviária pode mudar.

Back to top

References

Giraud, Timothée. 2022. osrm: Interface Between R and the OpenStreetMap-Based Routing Service OSRM.” Journal of Open Source Software 7 (78): 4574. https://doi.org/10.21105/joss.04574.

Footnotes

  1. Quando novos dados do Censo Demográfico 2022 estiverem disponíveis, a base provavelmente será atualizada.↩︎