La fonction metricOsrmTable permet de calculer des temps de trajet et des distances entre plusieurs couples de points. Elle vous fournira une table où chaque couple, défini par une source et une destination, sera associé à un temps et/ou une distance.

En entrée de la fonction, vous devez disposer d’un data.frame de coordonnées ou d’un objet spatial sf (points ou polygones). S’il s’agit d’un data.frame, il doit être dans le système géodésique mondial WGS84 (EPSG 4326). Les objets spatiaux peuvent être dans n’importe quelle projection ; la fonction les convertira en WGS84 (EPSG 4326). Si les objets spatiaux sont des polygones, les centroïdes seront utilisés pour le calcul.

Les fonctions adresseToCoord, codeComToCoord, codeLauToCoord et convertTo vous permettent de transformer vos données brutes (adresses, codes communes, data.frame, objets spatiaux sf) dans un format accepté par la fonction metricOsrmTable (cf Article : Préparer ses données avec le package {metric.osrm}).

Un identifiant par source et par destination est obligatoire.

sources <- data.frame(ID = c("src1","src2"),
                      LON = c(5.44553,5.48212),
                      LAT = c(43.52772,43.33602),
                      stringsAsFactors = FALSE)

destinations <- data.frame(ID = c("dst1","dst2"),
                           LON = c(5.16171,5.44553),
                           LAT = c(43.70377,43.52772),
                           stringsAsFactors = FALSE)

options(osrm.server = "https://metric-osrm-backend.lab.sspcloud.fr/") # toujours spécifier l'adresse d'un serveur avant d'utiliser le distancier
options(osrm.profile = "driving") # toujours spécifier un profil avant d'utiliser le distancier

metric.osrm::metricOsrmTable(src = sources,
                dst = destinations, 
                exclude ="ferry")
#>   ID idSrc  lonSrc   latSrc idDst  lonDst   latDst duree distance
#> 1  1  src1 5.44552 43.52765  dst1 5.16171 43.70377 40.65   34.143
#> 2  2  src2 5.48226 43.33597  dst2 5.44552 43.52765 37.90   35.979

Si le serveur ne répond pas trois fois alors que vous avez spécifié l’adresse d’un serveur et un profil, consultez la section “le serveur ne répond pas” de la vignette G-Pb-installation

La table en sortie est un data.frame composée de 9 colonnes “ID”, “idSrc”, “lonSrc”, “latSrc”, “idDst”, “lonDst”, “latDst”, “duree” et “distance”. Les durées sont en minutes et les distances en kilomètres. “ID” est l’identifiant du couple (de 1 à n).

Les coordonnées “lonSrc”, “latSrc”, “lonDst”, “latDst” de la table en sortie ne correspondent pas précisément à celles de la table en entrée. Les coordonnées d’origine sont rapprochées sur le noeud le plus proche appartenant au réseau routier. Cette translation de points peut être d’autant plus conséquent dans les zones où le réseau routier est peu dense.

Arguments duree et distance

Par défaut, la fonction metricOsrmTable prend les arguments duree et distance à TRUE. Il est possible de spécifier duree ou distance à FALSE. Cela n’a aucune influence sur les temps de réponse.

metricOsrmTable(src = sources,
                dst = destinations,
                duree = TRUE,
                distance = FALSE, 
                exclude ="ferry")
#>   ID idSrc  lonSrc   latSrc idDst  lonDst   latDst duree
#> 1  1  src1 5.44552 43.52765  dst1 5.16171 43.70377 40.65
#> 2  2  src2 5.48226 43.33597  dst2 5.44552 43.52765 37.90

Argument exclude

Il est recommandé d’ajouter l’argument exclude= "ferry". L’argument exclude permet d’éviter les autoroutes (“motorway”), les péages (“toll”), les ferries (“ferry”), ou vous pouvez tout autoriser avec exclude =NULL . Par exemple, si vous souhaitez effectuer les calculs en évitant les autoroutes, vous pouvez spécifier exclude = "motorway". Le serveur OSRM expérimental, déployé sur le SSPCloud, n’accepte qu’une exclusion à la fois.

options(osrm.server = "https://metric-osrm-backend.lab.sspcloud.fr/") # toujours spécifier l'adresse d'un serveur avant d'utiliser le distancier
options(osrm.profile = "driving") # toujours spécifier un profil avant d'utiliser le distancier
metricOsrmTable(src = sources,
                dst = destinations,
                exclude = "motorway")
#>   ID idSrc  lonSrc   latSrc idDst  lonDst   latDst duree distance
#> 1  1  src1 5.44552 43.52765  dst1 5.16171 43.70377 40.65   34.143
#> 2  2  src2 5.48226 43.33597  dst2 5.44552 43.52765 46.43   35.304

Dans cet exemple, le 2ème résultat est différent de l’exemple précédent.

Argument stable

L’argument stable permet de retourner ou non les stables dans la table de résultats, c’est à dire lorsque les sources sont identiques aux destinations. Par défaut, stable = FALSE, les stables sont supprimés de la table de résultats. Si TRUE, les valeurs de durée et de distance sont à 0.

Arguments faceAFace et allerRetour

faceAFace = TRUE

Par défaut, l’argument faceAFace vaut TRUE, ce qui veut dire que les couples sont constitués ainsi : src1 vers dst1 et scr2 vers dst2.

L’utilisation de faceAFace = TRUE peut être utile si vos données en entrée correspondent à des couples déjà constitués. Par exemple, vous disposez d’une table avec des lieux de résidence (COMR) vers des lieux de travail (COMT) :

deplacements <- data.frame(COMR = c("13001","13002","13127"),
                           COMT = c("13205","13206","13206"),
                           stringsAsFactors = FALSE)

sources <- codeComToCoord(codeInsee = deplacements$COMR,
                          geo = "2020",
                          type = "chx")
#> [WARNING] Il y a 1 commune non géolocalisée.
#> Veuillez vérifier que le millésime de la géographie des codes communes
#> correspond bien à l'argument geo.
#> Liste des codes communes non géolocalisées :
#> 13127

destinations <- codeComToCoord(codeInsee = deplacements$COMT,
                               geo = "2020",
                               type = "chx")

options(osrm.server = "https://metric-osrm-backend.lab.sspcloud.fr/") # toujours spécifier l'adresse d'un serveur avant d'utiliser le distancier
options(osrm.profile = "driving") # toujours spécifier un profil avant d'utiliser le distancier
metricOsrmTable(src = sources,
                dst = destinations,
                faceAFace = TRUE, 
                exclude ="ferry")
#>   ID idSrc  lonSrc   latSrc idDst  lonDst   latDst duree distance
#> 1  1 13001 5.44604 43.53001 13205 5.39911 43.29790 33.67   32.605
#> 2  2 13002 5.48161 43.33623 13206 5.38254 43.27018 20.44   14.791

Si le nombre de sources est différent du nombre de destinations, les lignes n’ayant pas de vis à vis seront ignorées. La table sources devrait avoir le même nombre d’observations que la table destinations.

faceAFace = FALSE et allerRetour = TRUE

Si vous spécifier faceAFace = FALSE et allerRetour = TRUE, les couples seront constitués par le produit cartésien de sources et de destination. Ce choix est utile lorsque vous avez une liste de points et que vous voulez connaître les temps d’accès et les distances entre chacun d’eux. Par exemple, vous disposez du fond communal des arrondissements de Marseille. La fonction metricOsrmTable calculera les durées et les distances à partir des centroïdes si src et dst sont de polygones.

# import du fond des arrondissements de Marseille en objet sf
arm13 <- sf::read_sf(dsn = system.file("extdata",
                                       "armf_dep_13_2020.shp",
                                       package = "metric.osrm"),
                     stringsAsFactors = FALSE)

options(osrm.server = "https://metric-osrm-backend.lab.sspcloud.fr/") # toujours spécifier l'adresse d'un serveur avant d'utiliser le distancier
options(osrm.profile = "driving") # toujours spécifier un profil avant d'utiliser le distancier
res <- metricOsrmTable(src = arm13,
                       dst = arm13,
                       faceAFace = FALSE,
                       allerRetour = TRUE, 
                       exclude ="ferry")

rmarkdown::paged_table(res)

Le tableau contient 16 x 16 - 16 = 240 observations. Les stables ne sont pas retournés.

Le nombre de sources peut être différents du nombre de destinations. Le nombre d’observations de la table en sortie sera (nb src x nb dst - nb stables).

Attention au nombre de sources et de destinations sous peine d’avoir des temps de traitement élevés ! A titre d’exemple, le croisement de 1 000 sources entre elles nécessite le calcul de près d’un million de couples ; un calcul nécessitant une dizaine de minutes de temps de traitement environ selon la qualité du réseau et l’éloignement des points entre les sources et les destinations.

faceAFace = FALSE et allerRetour = FALSE

OSRM distingue les trajets allers des trajets retours car les durées et les distances peuvent être différentes. Dans certains cas, il est peut être préférable de ne calculer que les trajets allers. Si les sources et les destinations contiennent les couples src_Pau vers dst_Agen et src_Agen vers dst_Pau, alors si allerRetour = FALSE, seul le couple src_Pau vers dst_Agen sera retourné (src_Agen vers dst_Pau ne sera pas calculé). Ce choix peut être judicieux si vous avez un grand nombre de sources et de destinations identiques afin de gagner en temps de traitement, comme par exemple pour le calcul des temps de trajet entre toutes les communes d’une même région.


options(osrm.server = "https://metric-osrm-backend.lab.sspcloud.fr/") # toujours spécifier l'adresse d'un serveur avant d'utiliser le distancier
options(osrm.profile = "driving") # toujours spécifier un profil avant d'utiliser le distancier
res <- metricOsrmTable(src = arm13,
                       dst = arm13,
                       faceAFace = FALSE,
                       allerRetour = FALSE, 
                       exclude ="ferry")

rmarkdown::paged_table(res)

Pour des sources et des destinations identiques, deux fois moins de couples sont calculés avec allerRetour = FALSE.

Dans tous les cas, avant de vous lancer tête baissée dans le requêtage OSRM, réfléchissez bien aux couples que vous voulez calculer. Sont-ils pertinents pour l’étude que je réalise ? Pour aller plus loin, l’article “Calculer l’accès aux équipements les plus proches avec le package {metric.osrm}” vous aidera notamment à filtrer les résultats selon d’autres critères.

Enfin, n’oubliez pas si vous le souhaitez, de sauvegarder le résultat dans un format de votre choix : en base R (RDS ou RData), en fichier csv, dbf, etc…

Calculs d’indicateurs

La fonction statTable permet de calculer des indicateurs statistiques sur les résultats de la fonction metricOsrmTable. Elle renvoie le nombre de couples calculés, le nombre de sources distinctes, le nombre de destinations distinctes et, pour la durée et la distance, les valeurs min et max, la moyenne et la médiane.


options(osrm.server = "https://metric-osrm-backend.lab.sspcloud.fr/") # toujours spécifier l'adresse d'un serveur avant d'utiliser le distancier
options(osrm.profile = "driving") # toujours spécifier un profil avant d'utiliser le distancier
resultats <- metricOsrmTable(src = arm13,
                             dst = arm13,
                             faceAFace = FALSE,
                             allerRetour = TRUE, 
                             exclude ="ferry")

statTable(resultats)
#> $nbCouples
#> [1] 240
#> 
#> $nbIdDep
#> [1] 16
#> 
#> $nbIdArr
#> [1] 16
#> 
#> $tempsMax
#> [1] 34.9
#> 
#> $tempsMin
#> [1] 3.24
#> 
#> $tempsMoyenne
#> [1] 13.9
#> 
#> $tempsMediane
#> [1] 13.14
#> 
#> $distanceMax
#> [1] 25.523
#> 
#> $distanceMin
#> [1] 1.79
#> 
#> $distanceMoyenne
#> [1] 9.688
#> 
#> $distanceMediane
#> [1] 9.427

Le résultat est sous forme de liste.

Avec l’argument allerRetour = FALSE :


options(osrm.server = "https://metric-osrm-backend.lab.sspcloud.fr/") # toujours spécifier l'adresse d'un serveur avant d'utiliser le distancier
options(osrm.profile = "driving") # toujours spécifier un profil avant d'utiliser le distancier
resultats <- metricOsrmTable(src = arm13,
                             dst = arm13,
                             faceAFace = FALSE,
                             allerRetour = FALSE, 
                             exclude ="ferry")

statTable(resultats)
#> $nbCouples
#> [1] 120
#> 
#> $nbIdDep
#> [1] 15
#> 
#> $nbIdArr
#> [1] 15
#> 
#> $tempsMax
#> [1] 34.9
#> 
#> $tempsMin
#> [1] 3.24
#> 
#> $tempsMoyenne
#> [1] 13.55
#> 
#> $tempsMediane
#> [1] 12.61
#> 
#> $distanceMax
#> [1] 24.802
#> 
#> $distanceMin
#> [1] 1.851
#> 
#> $distanceMoyenne
#> [1] 9.368
#> 
#> $distanceMediane
#> [1] 8.986

Ou encore avec l’argument stable = TRUE


options(osrm.server = "https://metric-osrm-backend.lab.sspcloud.fr/") # toujours spécifier l'adresse d'un serveur avant d'utiliser le distancier
options(osrm.profile = "driving") # toujours spécifier un profil avant d'utiliser le distancier
resultats <- metricOsrmTable(src = arm13,
                             dst = arm13,
                             faceAFace = FALSE,
                             allerRetour = TRUE,
                             stable = TRUE, 
                             exclude ="ferry")

statTable(resultats)
#> [INFO] Il y a 16 couples de stables dans la table de résultats (duree = 0).
#> Ils ont été pris en compte pour le calcul des indicateurs stats.
#> $nbCouples
#> [1] 256
#> 
#> $nbStables
#> [1] 16
#> 
#> $nbIdDep
#> [1] 16
#> 
#> $nbIdArr
#> [1] 16
#> 
#> $tempsMax
#> [1] 34.9
#> 
#> $tempsMin
#> [1] 0
#> 
#> $tempsMoyenne
#> [1] 13.03
#> 
#> $tempsMediane
#> [1] 12.58
#> 
#> $distanceMax
#> [1] 25.523
#> 
#> $distanceMin
#> [1] 0
#> 
#> $distanceMoyenne
#> [1] 9.082
#> 
#> $distanceMediane
#> [1] 8.814

Aussi, il est possible que des couples ne puissent pas être calculés, par exemple entre un DOM et la métropole. Dans ce cas, la fonction metricOsrmTable retournera des valeurs -999999.00 pour la durée et la distance. Des messages d’avertissement viendront prévenir l’utilisateur si il existe de tels couples. Ces derniers seront supprimés automatiquement de la table si la fonction statTable est exécutée.

Argument interactive

Cet argument, par défaut à FALSE, peut être mis à TRUE si vous utilisez les fonctions du package metric.osrm dans une application R-Shiny.

Lorsque les traitements sont longs, un barre de progression vous indique le pourcentage de calculs réalisés. Cette barre est différente selon le contexte.

Dans un contexte classique (interactive = FALSE), affichage dans la console :

Calcul en cours - 1/3 : [==================] 100%  124s
Calcul en cours - 2/3 : [==================] 100%  452s
Calcul en cours - 3/3 : [=========         ] 50%  56s

Dans un contexte R-Shiny (interactive = TRUE), affichage en bas à droite de l’application :

Arguments rayonMax, nbDstVolOiseau, nbDstMeasure, optiMeasure et emprise

L’article “Calculer l’accès aux équipements les plus proches avec le package {metric.osrm}” traite l’utilisation de ces arguments.