L’API du service de routage open source OSRM vient de passer à la version 5. J’ai donc adapté le package osrm
à cette nouvelle version qui devrait rester assez stable pendant quelque temps. Il s’agit à nouveau d’une version majeur (la compatibilité descendante n’est pas assurée).
NEWS
- La fonction
osrmViaroute
est supprimée, utiliser la fonctionosrmRoute
avec le paramètreoverview = FALSE
à la place. - La fonction
osrmViarouteGeom
est remplacée par la fonctionosrmRoute
. - La fonction
osrmRoute
propose désormais une route à la géométrie simplifiée ou complète (overview = "simplified"
ouoverview = "full"
) - L’ensemble des fonctions acceptent des objets
sp
(SpatialPointsDataFrame
etSpatialPolygonsDataFrame
) et des data.frames comme entrées. - Certaines fonctions utilisent l’encodage de polylines de Google grâce au package
gepaf
. - Deux nouvelles fonctions enrichissent le package :
osrmTrip
, qui permet de répondre à la question du parcours optimal entre plusieurs points non ordonnés (problème du voyageur de commerce). Cette fonction (créée par Robin Cura) interface le servicetrip
de l’API d’OSRM.osrmIsochrone
, qui permet de créer des polygones de zones isochrones autour d’un point.
Le package est disponible sur le CRAN ainsi que sur GitHub.
Je rappelle que par défaut le package utilise la version de démonstration du serveur de routage OSRM (dont voici les conditions d’utilisation) et qu’en cas d’utilisation intensive il est plus que recommandé d’utiliser sa propre instance d’OSRM.
Quelques exemples d’utilisation
osrmTable : Matrice de distances routières entre points
library(osrm)
# Load data
data("com")
# Travel time matrix
distCom <- osrmTable(loc = com[1:50, c("name","lon","lat")])
# First 5 rows and columns
distCom$duration[1:5,1:5]
Bethune | Annezin | Denderleeuw | Haaltert | Locon | |
---|---|---|---|---|---|
Bethune | 0.00 | 5.40 | 95.10 | 91.60 | 7.50 |
Annezin | 4.90 | 0.00 | 98.30 | 94.70 | 7.10 |
Denderleeuw | 94.20 | 97.30 | 0.00 | 10.40 | 93.50 |
Haaltert | 90.80 | 93.80 | 10.40 | 0.00 | 90.00 |
Locon | 7.00 | 6.90 | 93.50 | 90.00 | 0.00 |
osrmRoute : Trajet le plus court entre deux points
library(osrm)
# Load data
data("com")
# Travel path between SpatialPointsDataFrame
route <- osrmRoute(src = src[1,], dst = dst[1,], sp = TRUE)
if(require("cartography")){
osm <- getTiles(spdf = route, crop = TRUE, type = "osmtransport")
tilesLayer(osm)
plot(route, lwd = 5, col = "blue", add = TRUE)
plot(src[1,], pch = 20, col = "green", cex = 5, add = TRUE)
plot(dst[1,], pch = 20, col = "red", cex = 5, add = TRUE)
dev.off()
}
osrmRoute : Trajet le plus court entre une série de points
library(osrm)
# Load data
data("com")
# Get a trip with a SpatialPointsDataFrame
trips <- osrmTrip(loc = src)
# Map
if(require("cartography")){
osm <- getTiles(spdf = trips[[1]]$trip, crop = TRUE, type = "osmtransport")
tilesLayer(osm)
plot(trips[[1]]$trip, add = TRUE, col = 1:5, lwd = 5)
plot(src, pch = 21, bg = "red", cex = 2, col = "black", add = TRUE)
}
osrmIsochrone : Isochrones autour d’un point
library(osrm)
# Load data
data("com")
# Get isochones with a SpatialPointsDataFrame, custom breaks
iso <- osrmIsochrone(loc = src[6,], breaks = seq(from = 0,to = 30, by = 5))
# Map
if(require("cartography")){
osm <- getTiles(spdf = iso, crop = TRUE, type = "osmtransport")
tilesLayer(osm)
breaks <- sort(c(unique(iso$min), max(iso$max)))
pal <- paste(carto.pal("taupe.pal", length(breaks)-1), "95", sep="")
cartography::choroLayer(spdf = iso, df = iso@data,
var = "center", breaks = breaks,
border = "grey50", lwd = 0.5, col = pal,
legend.pos = "topleft",legend.frame = TRUE,
legend.title.txt = "Driving Time\nto Renescure\n(min)",
add = TRUE)
plot(src[6,], cex = 2, pch = 20, col ="red", add=T)
text(src[6,], label = "Renescure", pos = 3)
}
OpenEdition vous propose de citer ce billet de la manière suivante :
Timothée Giraud (10 mai 2016). Mise à jour du package osrm (version 3.0.0). R Géomatique. Consulté le 11 octobre 2024 à l’adresse https://doi.org/10.58079/tp3v
Bonjour,
Je vous remercie pour votre travail sur osrm qui est super. J’ai installé un serveur osrm sur mon ordinateur qui semble fonctionner, mais lorsque j’appelle osrm depuis r (avec l’adresse du serveur), j’obtiens des résultats dans la fenêtre DOS mais j’ai l’erreur suivante dans R :
The OSRM server returned an error:
Error: InvalidQuery
Query string malformed close to position 941
Est-ce que vous avez une idée d’où peut provenir cette erreur, je ne trouve pas de solution sur internet ?
Je vous remercie.
Bonjour,
Il m’est un peu difficile de vous répondre sans avoir la fonction, le script et les données (ou au moins un extrait) utilisés.
Cordialement,
T.
Bonjour sous R pouvez-vous me dire comment prendre en compte un serveur OSRM local. Je suis tombé sur cette information :
“To change the OSRM server, change the osrm.server option: options(osrm.server = “http://address.of.the.server/”)”
mais je ne vois pas comment le configurer et comment adapter votre code R avec mes données OSMR.
Merci de votre réponse
Vous devez connaître l’adresse de votre serveur OSRM en local. Dans une installation par défaut sans docker il s’agit souvent de “http://0.0.0.0:5000/”. Je commence donc mes scripts par :
library("osrm")
options(osrm.server = "http://0.0.0.0:5000/")
Bonjour,
Merci pour ce travail assez bluffant.
Comment faire lorsque l’on veut faire un isochrone à partir de plusieurs point (exemple : temps d’accès à un hôpital sans un département avec plusieurs hôpitaux) ?
Merci d’avance
Merci,
Pour l’instant il n’y a pas de solution pour créer ce type d’isochrones dans le package.
Il est possible de faire les isochrones avec les deux points (et les mêmes classe de distance/temps) puis de les intersecter avec des fonctions de rgeos.
Bien à vous,
Timothée
Bonjour Laurent,
Puis je avoir le fichier code source et le projet ?
J’en est besoin pour un projet universitaire.
Cdlt
Bonjour,
Merci pour le partage de votre travail,
Nous souhaitons dans la cadre d’un projet mesurer des distances routières qui correspondent aux déplacements entre des points. Nous souhaitons utilisé ORSM, notamment parce qu’on aurai des trajets entre plusieurs points à mesurer, mais à première vue il semble que les résultats soient tous donné en temps de déplacement, avant d’aller plus loin j’aurai aimé savoir s’il était possible d’avoir les résultats en km ? Merci d’avance de votre réponse
Noé Guiraud
Bonjour,
OSRM donne, notamment, accès à deux services :
* le service
table
(interfacé parosrmTable
dans le package R) qui donne des matrices de distances temps (minutes) entre de multiple points,* le service
route
(interfacé parosrmRoute
dans le package) qui donne le tracé, la longueur (en km) et le temps de trajet (en min) du chemin le plus rapide entre 2 points.Le service
table
ne permet pas d’obtenir de distances kilométriques à moins d’installer une version modifiée d’OSRM (voir : https://github.com/Project-OSRM/osrm-backend/issues/1353).Le service
route
permet d’obtenir des distances kilométriques entre couples de points. Il est interdit d’utiliser ce service, sur l’API public d’OSRM en tout cas (voir : https://github.com/Project-OSRM/osrm-backend/wiki/Api-usage-policy), pour des traitements massifs.Si vous pouvez installer votre propre instance d’OSRM vous avez le choix entre :
* installer la version officielle et utiliser le service
route
(osrmRoute
dans le package) de manière intensive (sur votre serveur tout est permis), ce qui peut s’avérer un peu long en fonction du nombre de trajets à calculer.* installer la version modifiée (et utiliser
table
) qui permet d’obtenir des résultats rapidement, mais qui est peut-être un peu plus difficile à installer (je n’ai pas essayé…).Merci pour votre réponse et votre réactivité,
Nous avons entre 1 900 et 2000 déplacements, mais nous souhaitons mesurer les distances routes pour 70% d’entre eux, soit environ 1 400 mesures.
Nous allons nous orienter vers l’installation de la version officielle et l’utilisation d’osrmRoute.
Cordialement
Salut ! avez vous réussis à avoir les résultats de la méthode table en Km ?!
Cordialement .
Bonjour Armel,
Nous utilisons le service route, donc je ne peux pas vous dire pour l’adaptation du service table (ttps://github.com/Project-OSRM/osrm-backend/issues/1353) suggérée par Timothée Giraud
Bonjour, pour un projet économétrique je souhaiterais effectuer de très nombreuses requêtes(mon code sur R fonctionne grace à votre package), mais je ne sais pas comment installer une instance openstreetmap…
Quelles sont les solutions à ma disposition ? existe t il d’autres serveurs de routage libre?
et encore merci pour tout ce travail!
merci pour vos retours
Bonjour,
Si vous avez besoin de très nombreuses requêtes vous ne pourrez vous passer de l’installation d’une instance d’OSRM (https://github.com/Project-OSRM/osrm-backend/wiki pour créer cette instance). En fonction de la taille de la zone sur laquelle vous travaillez vous n’aurez pas forcément besoin d’une machine très puissante.
Les autres serveurs de routages libres (dont ceux basés sur OSRM : https://github.com/Project-OSRM/osrm-backend/wiki/Websites-and-projects-using-OSRM) vous limiteront également si vous faites de trop nombreuses requêtes. Nous ne pouvons pas solliciter leurs serveurs de manière intensive.
Ok, super merci de votre réponse, du coup je vais me renseigner davantage (et continuer de parcourir votre site) pour créer cette instance.
Merci encore
Bonjour,
Je souhaitais tout d’abord vous remercier pour la réalisation de ce package.
j’aurais aimé savoir s’il était possible avec la nouvelle mise à jour de générer une matrice des distances, comme il était possible dans les versions précédentes du package.
Merci
Bonjour,
Il est toujours possible d’obtenir des matrices de distances entre points(en temps de trajet par la route).
La fonction osrmTable est dédiée à cette tâche.
Bien à vous,
Bonjour,
Je n’arrive plus à utiliser la fonction osrmRoute.
En effet, même en utilisant votre exemple, le logiciel me renvoie cette erreur:
> data(“com”)
> route3 route <- osrmRoute(src = com[1, c("comm_id", "lon","lat")],
+ dst = com[15, c("comm_id", "lon","lat")])
osrmRoute function returns an error:
Error: parse error: premature EOF
(right here) ——^
Merci de votre réponse
Vous n’êtes pas le seul à rencontrer des problèmes ces jours-ci (https://github.com/rCarto/osrm/issues/12).
Ce problème semble lié à une perturbation des serveurs public d’OSRM. Ce qui n’est pas inattendu car comme ils le disent eux-mêmes :
(https://github.com/Project-OSRM/osrm-backend/wiki/Demo-server)
Une solution serait d’installer sa propre instance d’OSRM, ce qui n’est pas complètement trivial…
Merci beaucoup de votre aide