{"word_count": 923, "character_count": 7761}
Le package osrm assure le lien entre R et l'API d'OSRM. OSRM est un service de routage basé sur les données OpenStreetMap.Ce package permet d'obtenir le temps de trajet, la distance et le plus court chemin entre deux points via le réseau routier d'OpenStreetMap. Il est également possible d'obtenir des matrices de distances entre deux séries de points.Voici un rapide aperçu des fonctions du package osrm :osrmTable : Matrices de distances entre points.osrmTableOD : Matrices de distances entre points où les origines et les destinations peuvent être différentes.osrmViaRoute : Temps de trajet et distance routière entre deux points.osrmViarouteGeom : Géométrie du plus court chemin entre deux points.Par défaut le package utilise l'API publique d'OSRM (condition d'utilisation de l'API). Il est possible d'utiliser une autre instance du service si l'on veut en faire un usage intensif.Voici un petit exemple de ce que l'on peut faire avec le package. Les cartes sont faites avec le le package cartography que j'ai déjà présenté ici.L'idée dans cet exemple est de comparer l'accessibilité globale des communes de Loire-Atlantique à vol d'oiseau et par la route. Pour cela nous utiliserons l'indice d'accessibilité de Shimbel1 qui rapporte la somme des écarts de tous les sommets à la somme des écarts d'un sommet :où SHi est l'indice de Shimbel pour la commune i et d(i,j) une mesure de distance entre i et j.Chargement des données et des librairies# Chargement des donnéesload("data/LoireAtlantique.RData")# chargement des librairieslibrary(osrm)library(rgeos)library(cartography)# création d'un data frame des communes avec leurs coordonées en WGS84COM44.df &#60;- data.frame(as.character(COM44.spdf$INSEE_COM),                        coordinates(spTransform(COM44.spdf,                                                CRSobj =                                                  "+init=epsg:4326")))# renommer les colonnescolnames(COM44.df) &#60;- c("id", "x", "y")Création de la matrice des distances euclidiennesmateuclid &#60;- rgeos::gDistance(COM44.spdf, byid = T)Les 5 premières lignes et colonnes de mateuclid :4414844139442214409444125441480.0040163.2029042.7143736.8878722.464413940163.200.0016747.4237174.3238623.894422129042.7116747.420.0020492.0260500.214409443736.8837174.3220492.020.0077979.864412578722.4638623.8960500.2177979.860.00Nous venons de créer la matrice des distances euclidiennes (en mètres) entre les communes.Création de la matrice des temps de trajetsPour créer celle des distances routières nous pourrions utiliser la fonction osrmTable mais l'API public d'OSRM n’accepte pas les requêtes dépassant les 100 points. Nous allons donc utiliser la fonction osrmTableOD qui permet de combiner plusieurs requêtes.# création d'une matrice distances routièresmatroute &#60;- osrmTableOD(dfo = COM44.df,                         ido = "id", xo = "x", yo = "y",                         dfd = COM44.df,                        idd = "id", xd = "x", yd = "y")Les 5 premières lignes et colonnes de matroute :4414844139442214409444125441480.0061.6041.6070.20100.204413961.800.0030.1051.4053.704422140.7030.100.0040.1068.704409470.2049.8038.400.0079.3044125101.9056.2070.2080.900.00Les temps de trajet sont en minutes.Calcul et cartographie des indices d'accessibilité de ShimbelNous calculons ensuite les indices de Shimbel à partir de ces deux matrices.# Calcul d'indice d'accessibilité local d'ensembleshimbel &#60;- data.frame(id = COM44.df$id,                       ShimbelRoute = sum(matroute) / colSums(matroute),                       ShimbelEuclid = sum(mateuclid) / colSums(mateuclid))Et nous pouvons ensuite cartographier ces indices, en commençant par l'accessibilité euclidienne.# plot vide pour cadrer la carteplot(COM44.spdf, col = NA, border = NA, bg = "#A6CAE0")# plot du fond franceplot(FRA.spdf, add=T, col = "#E3DEBF", border = "#03779E")# Index de Shimbel avec les distances euvclidienneschoroLayer(spdf = COM44.spdf, spdfid = "INSEE_COM",           df = shimbel,            var = 'ShimbelEuclid', nclass = 6,            legend.pos = "left",           legend.title.txt = "Indice de\nShimbel",           add=T)# Ajout d'un habillagelayoutLayer(title = "Accessibilité euclidienne globale des communes de Loire-Atlantique",             sources = "T. Giraud, 2015",             author = "Fond de carte : GEOFLA 2015, IGN")Plus une commune aura une position centrale dans le département plus son accessibilité sera forte.# plot vide pour cadrer la carteplot(COM44.spdf, col = NA, border = NA, bg = "#A6CAE0")# plot du fond franceplot(FRA.spdf, add=T, col = "#E3DEBF", border = "#03779E")# Index de Shimbel avec les distances euvclidienneschoroLayer(spdf = COM44.spdf, spdfid = "INSEE_COM",           df = shimbel,            var = 'ShimbelRoute', nclass = 6,            legend.pos = "left",           legend.title.txt = "Indice de\nShimbel",           add=T)# Ajout d'un habillagelayoutLayer(title = "Accessibilité routière globale des communes de Loire-Atlantique",            sources = "T. Giraud, 2015",             author = "Fond de carte : GEOFLA 2015, IGN ; Data (c) OpenStreetMap contributors ; Routes: OSRM. http://project-osrm.org/")L'accessibilité des communes via le réseau routier est plus nuancée que la simple accessibilité euclidienne (en cercles concentriques).Calcul de l'efficacité routièrePour mesurer l'efficacité du réseau routier nous pouvons faire le rapport entre les deux indices. Nous utilisons le fond OSM-transport comme fond de carte pour confronter cette efficacité avec le réseau routier qui sous-tend les mesures d'accessibilité routière.# calcul du rapport entre les deux indicesshimbel$eff &#60;-  shimbel$ShimbelRoute/shimbel$ShimbelEuclid# obtension d'une tuile osm-transport sur le departement# avec la fonction getTiles de cartographytiles44 &#60;- getTiles(spdf = COM44.spdf, type = "osm-transport")## affichage de la carte# plot vide pour cadrer la carteplot(COM44.spdf, col = NA, border = NA)# plot du fond de carte osm-transporttilesLayer(tiles44, add=T)# Index de Shimbel avec les distances euvclidienneschoroLayer(spdf = COM44.spdf, spdfid = "INSEE_COM",           df = shimbel,            var = 'eff',            breaks = c(min(shimbel$eff),                      0.8,0.9,0.95, 1/0.95, 1/0.9,                       max(shimbel$eff)),           col = carto.pal(pal1 = "green.pal",3,                            "wine.pal",2,                            transparency = T,                            middle = T),           lwd = 0.2,           legend.pos = "left",           legend.title.txt = "Efficacité",           legend.frame = TRUE,           legend.values.rnd = 2,           add=T)# Ajout d'un habillagelayoutLayer(title = "Efficacité du réseau routier des communes de Loire-Atlantique",             sources = "T. Giraud, 2015",             author = "Fond de carte : OpenStreetMap contributors ; Routes: OSRM. http://project-osrm.org/")Les communes les plus périphériques sont favorisées par le réseau routier, elle sont desservies par des voies rapides qui améliorent leur accessibilité. Certaines communes plus centrales sont au contraire moins accessibles que ce que l'on pourrait imaginer. Cela est sûrement dû, pour certaines, à leur position au bord de la Loire qui implique des détours pour emprunter les quelques ponts qui enjambent le fleuve.Quelques trajets routiersPour illustrer le contournement de la Loire nous pouvons afficher quelques trajets à partir de la commune la moins accessible avec la fonction osrmViarouteGeom.L'ensemble du code et des données utilisées ici est disponible sur GitHub, tout comme la version de développement du package.1. Pumain Denise, Saint-Julien Thérèse (1997), L’analyse spatiale. Localisations dans l’espace. Paris, Armand Colin.(p110) ↩