23  Matrices de temps et itinéraires

     

Les packages osrm (Giraud, 2022) et valh (Giraud et Viry, 2025) permettent d’obtenir des matrices de temps et de distances, des itinéraires routiers et des isochrones.

Ces packages servent d’interface entre R et les services de calculs d’itinéraires OSRM (Luxen et Vetter, 2011) et Valhala (Valhalla contributors, 2025) respectivement. Ces deux services utilisent les données de la base de données OpenStreetMap.

Les packages utilisent des serveurs de démonstration par défaut. En cas d’utilisation intensive il est fortement recommandé d’utiliser sa propre instance du service de routage avec Docker (instructions pour OSRM et Valhalla).

23.1 Calcul d’un itinéraire

Les fonction osrmRoute() et vl_route() permettent de calculer des itinéraires.

library(sf)
library(osrm)
library(valh)
library(mapview)

com <- st_read("data/lot.gpkg", layer = "communes", quiet = TRUE)

# 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", ])

# Avec OSRM
route1 <- osrmRoute(src = cahors, dst = puybrun, overview = "full")
# Avec Valhalla
route2 <- vl_route(src = cahors, dst = puybrun)

# Visualisation des routes 
mapview(route1, color = "lightblue4" ) + mapview(route2, color = "red4")

23.2 Calcul d’une matrice de temps

Les fonctions osrmTable() et vl_matrix() permettent 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 spécifiques et tous les restaurants de Cahors à pied.

library(sf)
library(tidygeocoder)

# Import des restaurants 
restaurant <- st_read("data/lot.gpkg", layer = "restaurants", quiet = TRUE)

# Sélection des restaurants de Cahors
restaurant_cahors <- st_filter(restaurant, com[com$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
# Avec OSRM
mat1 <- osrmTable(src = places[c(3, 2)],
                  dst = restaurant_cahors,
                  osrm.profile = "foot")
# Avec Valhalla
mat2 <- vl_matrix(src = places[c(3, 2)],
                  dst = restaurant_cahors,
                  costing = "pedestrian")
mat <- cbind(t(mat1$durations), t(mat2$durations))

colnames(mat) <- c("osrm\nRue Montaudié", "osrm\nRue Albert Camus", 
                   "valh\nRue Montaudié",  "valh\nRue Albert Camus")

# Quelle adresse possède une meilleure accessibilité aux restaurants ?
boxplot(mat, cex.axis = .7, horizontal = TRUE,
        col = c("lightblue4", "lightblue4", "red4", "red4"))