{"word_count": 472, "character_count": 3782}
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).NEWSLa 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'utilisationosrmTable : Matrice de distances routières entre pointslibrary(osrm)# Load datadata("com")# Travel time matrixdistCom &#60;- osrmTable(loc = com[1:50, c("name","lon","lat")])# First 5 rows and columnsdistCom$duration[1:5,1:5]BethuneAnnezinDenderleeuwHaaltertLoconBethune0.005.4095.1091.607.50Annezin4.900.0098.3094.707.10Denderleeuw94.2097.300.0010.4093.50Haaltert90.8093.8010.400.0090.00Locon7.006.9093.5090.000.00osrmRoute : Trajet le plus court entre deux pointslibrary(osrm)# Load datadata("com")# Travel path between SpatialPointsDataFrameroute &#60;- osrmRoute(src = src[1,], dst = dst[1,], sp = TRUE)if(require("cartography")){  osm &#60;- 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 pointslibrary(osrm)# Load datadata("com")# Get a trip with a SpatialPointsDataFrametrips &#60;- osrmTrip(loc = src)# Mapif(require("cartography")){  osm &#60;- 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 pointlibrary(osrm)# Load datadata("com")# Get isochones with a SpatialPointsDataFrame, custom breaksiso &#60;- osrmIsochrone(loc = src[6,], breaks = seq(from = 0,to = 30, by = 5))# Mapif(require("cartography")){  osm &#60;- getTiles(spdf = iso, crop = TRUE, type = "osmtransport")  tilesLayer(osm)  breaks &#60;- sort(c(unique(iso$min), max(iso$max)))  pal &#60;- 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)}