Mise à jour du package osrm (version 3.0.0)

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 fonction osrmRoute avec le paramètre overview = FALSE à la place.
  • La fonction osrmViarouteGeom est remplacée par la fonction osrmRoute.
  • La fonction osrmRoute propose désormais une route à la géométrie simplifiée ou complète (overview = "simplified" ou overview = "full")
  • L’ensemble des fonctions acceptent des objets sp (SpatialPointsDataFrame et SpatialPolygonsDataFrame) 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 service trip 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

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)
}

osrmTrip

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)
}

osrmIsochrone


17 réflexions au sujet de « Mise à jour du package osrm (version 3.0.0) »

  1. 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

    1. 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

  2. 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

    1. Bonjour,
      OSRM donne, notamment, accès à deux services :
      * le service table (interfacé par osrmTable dans le package R) qui donne des matrices de distances temps (minutes) entre de multiple points,
      * le service route (interfacé par osrmRoute 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é…).

      1. 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

          1. 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

  3. 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?

    1. 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.

      1. 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

  4. 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

    1. 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,

      1. 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

        1. 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 :

          Please note the API Usage Policy. Especially note that there are no guarantees regarding availability, stability or correctness of results. It’s server to demonstrate OSRM, not a production-ready API.

          (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…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *