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.

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 Puybrun
cahors  <- 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 OSM
osm <- get_tiles(st_buffer(route, 2000), crop = TRUE)

# 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.2 Calcul d’une matrice de temps

La fonction osrmTable() permet de calculer des matrices de distances ou de temps par la route.

Gé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 Cahors
restaurant_cahors <- st_filter(restaurant, com_raw[com_raw$INSEE_COM == "46042", ])

# Construction d'un data.frame contenant deux adresses
adresses <- data.frame(ad = c("3 rue Montaudié, Cahors, France",
                              "5 rue Albert Camus, Cahors, France"))

# Geocodage de 2 adresses à Cahors
places <- 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 Cahors
mat <- osrmTable(src = places[c(3, 2)],
                 dst = restaurant_cahors,
                 osrm.profile = "foot")

mat$durations[, 1:5]
#>                     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)