Calculating route distance in R

Calculando distancia de uma rota usando o pacote OSRM

OSRM é um serviço de roteamento baseado em dados do OpenStreetMap. O pacote permite calcular distâncias (tempo de viagem e distância em KM) entre pontos e matrizes de tempo de viagem. O pacote depende do uso de um serviço OSRM em execução.

Carregando os pacotes

library(osrm)
## Data: (c) OpenStreetMap contributors, ODbL 1.0 - http://www.openstreetmap.org/copyright
## Routing: OSRM - http://project-osrm.org/
library(sf)
## Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(cartography)

Usando um banco de dados como exemplo

Ao carregar o banco de dados abaixo, 3 objetos são carregados, porém o nosso interesse é o objeto apotheke.sf. Esse objeto contem apenas duas colunas, sendo a primeira com o ID do ponto e a segunda coluna com as coordenadas.

data("berlin")

A função osrmRoute cria e envia uma consulta da API OSRM para obter a geometria da viagem entre dois pontos. Esta função faz interface com o serviço OSRM de rota. Essa função apresenta como principais argumentos o src que refere-se a “source”, ou seja, inicio da rota e o argumento dst que refere-se a “destiny”, ou seja, o destino.

route <- osrmRoute(src = apotheke.sf[74,], dst = apotheke.sf[55,],
                   overview = "full", returnclass = "sf")

Para obter apenas a duração da rota e a distancia, basta usar o argumento overview igual a FALSE. Cuidado ao atribuir o resultado da função osrmRoute à um objeto e usar esse mesmo objeto para tentar baixar o mapa, pois não será possivel. Para obter o mapa da rota é necessário que o argumento overview seja igual a “full”. A duração (tempo gasto do inicio da rota até o destino) é dado em minutos e a distancia em quilometros.

OBS: Não esta claro como é calculado o tempo do deslocamento entre o ponto de partida e destino da rota, visto que esse calculo utiliza-se de diversas fontes de informação para o calculo da estimativa, bem como o Google Maps faz.

# Return only duration and distance
osrmRoute(src = apotheke.sf[1, ], dst = apotheke.df[16, ], 
                    overview = F, returnclass = "sf")
## duration distance 
##    17.62    12.56

A função abaixo, getTiles permite obter pedaços de mapa com base na extensão de um objeto espacial (objeto no R com a class sf). Os mapas podem ser buscados em vários servidores de mapas abertos. Para visualizar o mapa, use a função tilesLayer.

osm <- getTiles(x = route, crop = TRUE, type = "osm", zoom = 13)
## Loading required namespace: raster
## Data and map tiles sources:
## © OpenStreetMap contributors. Tiles style under CC BY-SA, www.openstreetmap.org/copyright.
tilesLayer(osm)

Para adicionar as rotas no mapa obtido atraves da função tilesLayer, basta apenas usar a funçao plot do objeto route e com o argumento add igual a TRUE.

tilesLayer(osm)
plot(st_geometry(route), lwd = 4, add = TRUE)
plot(st_geometry(route), lwd = 1, col = "white", add = TRUE)
plot(st_geometry(apotheke.sf[c(74,55),]), pch = 20, col = "red", add = TRUE)

Avatar
Lucas Bianchi
PhD Student

My research interests include statistics models applied to arbovirus epidemics.

comments powered by Disqus