C-Calculer.Rmd
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.
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
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.
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.
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…
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.
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 :