Skip to content

Commit

Permalink
Update routing vignette
Browse files Browse the repository at this point in the history
  • Loading branch information
Robinlovelace committed Jul 8, 2020
1 parent d8fdddf commit 09456a3
Showing 1 changed file with 54 additions and 13 deletions.
67 changes: 54 additions & 13 deletions vignettes/stplanr-routing.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,31 @@ piggyback::pb_upload("roads_iow.geojson")
roads_iow = sf::read_sf("https://github.com/ropensci/stplanr/releases/download/0.3.1/roads_iow.geojson")
```

# osrm
# OSRM

Routing services such as OpenStreetMap Routing Machine (OSRM) require an input network, usually from OSM.

We will use the `osrm` package:

```{r}
library(osrm)
```

To get OSM data for the Isle of Wight, for example, you can run the following commands:

```{r, eval=FALSE}
remotes::install_github("itsleeds/geofabrik")
library(geofabrik)
iow = get_geofabrik(name = "Isle of Wight")
f = gf_filename("Isle of Wight")
file.copy(f, "iow.pbf")
options(osrm.server = "http://0.0.0.0:5000/", osrm.profile = "driving")
```


```{r, echo=FALSE, eval=FALSE}
if(!file.exists("iow.pbf"))
download.file("http://download.geofabrik.de/europe/great-britain/england/isle-of-wight-latest.osm.pbf", "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](https://hub.docker.com/r/osrm/osrm-backend/) work for you.
Expand All @@ -55,27 +74,49 @@ curl "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.49

Now we can do routing in R!

```{r, eval=FALSE}
On a single route:

```{r}
l = pct::wight_lines_30
p = line2points(l)
r = osrm::osrmRoute(src = p[1, ], dst = p[2, ], returnclass = "sf")
r = osrm::osrmRoute(src = p[1, ], dst = p[2, ], returnclass = "sf", overview = "full")
plot(r)
```

And to find many routes via the `route()` function, resulting in something like the figure below.

```{r, eval=FALSE}
routes_osrm = route(l = l, route_fun = osrmRoute, returnclass = "sf", overview = "full")
rnet_osrm = overline(routes_osrm, attrib = "bicycle")
mapview::mapview(rnet_osrm, lwd = rnet_osrm$bicycle / 10)
```

```{r, eval=FALSE, echo=FALSE}
system.time({
routes_osrm = route(l = l, route_fun = osrmRoute, returnclass = "sf", overview = "full")
})
30 / 0.9 # around 30 routes per second
saveRDS(routes_osrm, "routes_osrm.Rds")
piggyback::pb_upload("routes_osrm.Rds")
```


```{r, echo=FALSE}
knitr::include_graphics("https://user-images.githubusercontent.com/1825120/86858225-2970df80-c0b8-11ea-8394-07f98f1c8e8a.png")
```

```{r, eval=FALSE}
route_osrm2 = function(l) {
p = line2points(l)
s = (1:nrow(l)) * 2 - 1
list_out = lapply(s, function(i) osrm::osrmRoute(p[i, ], dst = p[i + 1, ], returnclass = "sf"))
do.call(rbind, list_out)
}
routes_osrm = route_osrm2(l)
plot(routes_osrm)
# tidy up
file.remove("iow.pbf")
f = list.files(pattern = "iow")
unlink(x = f, recursive = TRUE)
```

Shut down the docker container.


```{r, eval=FALSE, engine='zsh'}
docker ps
docker stop stupefied_hopper
```


0 comments on commit 09456a3

Please sign in to comment.