Le package osrm(Giraud, 2022) sert d’interface entre R et le service de calcul d’itinéraire OSRM(Luxen et Vetter, 2011). Ce package permet de calculer des matrices de temps et de distances, des itinéraires routiers, des isochrones. Le package utilise par défaut le serveur de démo d’OSRM. En cas d’utilisation intensive il est fortement recommandé d’utiliser sa propre instance d’OSRM avec Docker.
23.1 Calcul d’un itinéraire
La fonction osrmRoute() permet de calculer des itinéraires.
library(sf)library(osrm)library(maptiles)com_raw <-st_read("data/lot.gpkg", layer ="communes", quiet =TRUE)com <-st_transform(com_raw, 3857)# Itinéraire entre les centroïdes de Cahors et de Puybruncahors <-st_centroid(com[com$INSEE_COM =="46042", ])puybrun <-st_centroid(com[com$INSEE_COM =="46229", ])route <-osrmRoute(src = cahors,dst = puybrun)# Récupération d'un fond de carte OSMosm <-get_tiles(st_buffer(route, 2000), crop =TRUE)# Affichagemf_theme(mar =c(0,0,0,0))mf_raster(osm)mf_map(route, col ="grey10", lwd =6, add = T)mf_map(route, col ="grey90", lwd =1, add = T)
23.2 Calcul d’une matrice de temps
La fonction osrmTable() permet de calculer des matrices de distances ou de temps par la route.
NoteGéoréférencement d’adresses ?
Voir le point Géoréférencement pour le géocodage d’adresse avec R
Dans cet exemple nous calculons une matrice de temps entre 2 adresses et les restaurants de Cahors à pied.
library(sf)library(tidygeocoder)restaurant <-st_read("data/lot.gpkg", layer ="restaurants", quiet =TRUE)# Sélection des restaurants de Cahorsrestaurant_cahors <-st_filter(restaurant, com_raw[com_raw$INSEE_COM =="46042", ])# Construction d'un data.frame contenant deux adressesadresses <-data.frame(ad =c("3 rue Montaudié, Cahors, France","5 rue Albert Camus, Cahors, France"))# Geocodage de 2 adresses à Cahorsplaces <-geocode(.tbl = adresses,address = ad, quiet =TRUE)places <-as.data.frame(places)row.names(places) <-c("Rue Montaudié", "Rue Albert Camus")# Calcul de la matrice de distance entre les 2 adresses et les restaurants de Cahorsmat <-osrmTable(src = places[c(3, 2)],dst = restaurant_cahors,osrm.profile ="foot")mat$durations[, 1:5]
#> 1 2 3 4 5
#> Rue Montaudié 17.7 21.5 21.9 22.4 14.2
#> Rue Albert Camus 33.8 65.2 37.8 25.4 35.0
# Quelle adresse possède une meilleure accessibilité aux restaurants ?boxplot(t(mat$durations), cex.axis = .7, horizontal =TRUE)
Giraud, T. (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