library(sf)
library(osrm)
library(maptiles)
<- st_read("data/lot.gpkg", layer = "communes", quiet = TRUE)
com_raw <- st_transform(com_raw, 3857)
com
# Itinéraire entre les centroïdes de Cahors et de Puybrun
<- st_centroid(com[com$INSEE_COM == "46042", ])
cahors <- st_centroid(com[com$INSEE_COM == "46229", ])
puybrun
<- osrmRoute(src = cahors,
route dst = puybrun)
# Récupération d'un fond de carte OSM
<- get_tiles(st_buffer(route, 2000), crop = TRUE)
osm
# Affichage
mf_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)
19 Matrices de temps et itinéraires
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.
19.1 Calcul d’un itinéraire
La fonction osrmRoute()
permet de calculer des itinéraires.
19.2 Calcul d’une matrice de temps
La fonction osrmTable()
permet de calculer des matrices de distances ou de temps par la route.
Dans cet exemple nous calculons une matrice de temps entre 2 adresses et les restaurants de Cahors à pied.
library(sf)
library(tidygeocoder)
<- st_read("data/lot.gpkg", layer = "restaurants", quiet = TRUE)
restaurant
# Sélection des restaurants de Cahors
<- st_filter(restaurant, com_raw[com_raw$INSEE_COM == "46042", ])
restaurant_cahors
# Construction d'un data.frame contenant deux adresses
<- data.frame(ad = c("3 rue Montaudié, Cahors, France",
adresses "5 rue Albert Camus, Cahors, France"))
# Geocodage de 2 adresses à Cahors
<- geocode(.tbl = adresses,address = ad, quiet = TRUE)
places <- as.data.frame(places)
places row.names(places) <- c("Rue Montaudié", "Rue Albert Camus")
# Calcul de la matrice de distance entre les 2 adresses et les restaurants de Cahors
<- osrmTable(src = places[c(3, 2)],
mat dst = restaurant_cahors,
osrm.profile = "foot")
$durations[, 1:5] mat
#> 1 2 3 4 5
#> Rue Montaudié 17.8 21.3 22.1 22.6 14.4
#> Rue Albert Camus 33.0 64.4 37.0 24.6 34.2
# Quelle adresse possède une meilleure accessibilité aux restaurants ?
boxplot(t(mat$durations), cex.axis = .7, horizontal = TRUE)