library(stplanr)
sf::read_sf("https://github.com/ropensci/stplanr/releases/download/0.3.1/roads_iow.geojson") roads_iow =
Routing services such as OpenStreetMap Routing Machine (OSRM) require an input network, usually from OSM.
We will use the osrm
package:
library(osrm)
#> Data: (c) OpenStreetMap contributors, ODbL 1.0 - http://www.openstreetmap.org/copyright
#> Routing: OSRM - http://project-osrm.org/
To get OSM data for the Isle of Wight, for example, you can run the following commands:
::install_github("itsleeds/geofabrik")
remoteslibrary(geofabrik)
get_geofabrik(name = "Isle of Wight")
iow = gf_filename("Isle of Wight")
f =file.copy(f, "iow.pbf")
options(osrm.server = "http://0.0.0.0:5000/", osrm.profile = "driving")
Then in bash run the following commands to make the OSRM docker image work for you.
docker run -t -v "${PWD}:/data" osrm/osrm-backend osrm-extract -p /opt/car.lua /data/iow.pbf
docker run -t -v "${PWD}:/data" osrm/osrm-backend osrm-partition /data/iow.osrm
docker run -t -v "${PWD}:/data" osrm/osrm-backend osrm-customize /data/iow.osrm
docker run -t -i -p 5000:5000 -v "${PWD}:/data" osrm/osrm-backend osrm-routed --algorithm mld /data/iow.osrm
curl "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true"
Now we can do routing in R!
On a single route:
pct::wight_lines_30
l = line2points(l)
p = osrm::osrmRoute(src = p[1, ], dst = p[2, ], returnclass = "sf", overview = "full")
r =plot(r)
And to find many routes via the route()
function, resulting in something like the figure below.
route(l = l, route_fun = osrmRoute, returnclass = "sf", overview = "full")
routes_osrm = overline(routes_osrm, attrib = "bicycle")
rnet_osrm =::mapview(rnet_osrm, lwd = rnet_osrm$bicycle / 10) mapview
# tidy up
list.files(pattern = "iow")
f =unlink(x = f, recursive = TRUE)
Shut down the docker container.
ps
docker docker stop stupefied_hopper