From 3a4dd6deae6aad649ded54811c2a62a2708f06ee Mon Sep 17 00:00:00 2001 From: Matthieu Viry Date: Thu, 10 Apr 2025 11:44:53 +0200 Subject: [PATCH] chore: update README with demo section --- README.Rmd | 143 +++++++++++++++++++++++++++++++++++++++-- README.md | 145 ++++++++++++++++++++++++++++++++++++++++-- man/figures/plot1.png | Bin 0 -> 24646 bytes 3 files changed, 276 insertions(+), 12 deletions(-) create mode 100644 man/figures/plot1.png diff --git a/README.Rmd b/README.Rmd index c6fdda4..35668ce 100644 --- a/README.Rmd +++ b/README.Rmd @@ -45,13 +45,141 @@ install.packages("valh", repos = "https://riatelab.r-universe.dev") ``` - +## Demo + +This is a short overview of the main features of `valh`. The dataset +used here is shipped with the package, it is a sample of 100 random +pharmacies in Berlin ([© OpenStreetMap +contributors](https://www.openstreetmap.org/copyright/en)) stored in a +[geopackage](https://www.geopackage.org/) file. + +It demonstrates the use of `vl_matrix`, `vl_route` and `vl_elevation` functions. + +```r +library(valh) +library(sf) +``` +``` +Data: (c) OpenStreetMap contributors, ODbL 1.0 - http://www.openstreetmap.org/copyright +Routing: Valhalla - valhalla.github.io/valhalla +Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.4.0; sf_use_s2() is TRUE +``` + +```r +pharmacy <- st_read(system.file("gpkg/apotheke.gpkg", package = "valh"), + quiet = TRUE) +pharmacy <- pharmacy[1:10, ] +``` + +One of valhalla's strengths is that it allows you to use dynamic costing options at query time. +For example, we can compare the travel time between each pharmacy by bicycle: + +- with the default bicycle parameters (type of bicycle "hybrid" with an average speed + of 18 km/h and a propensity to use roads, alongside other vehicles, of 0.5 out of 1 - the + default value), +- with the road bicycle parameters (type of bicycle "road" with an average speed of + 25 km/h and a propensity to use roads, alongside other vehicles, of 1 out of 1). + +These costing options for each costing model ('auto', 'bicycle', etc.) are documented in +[Valhalla's documentation](https://valhalla.github.io/valhalla/api/turn-by-turn/api-reference/#costing-models). + +```r +default_bike <- vl_matrix(loc = pharmacy, + costing = "bicycle") + +road_bike <- vl_matrix(loc = pharmacy, + costing = "bicycle", + costing_options = list(bicycle_type = "Road", use_roads = "1")) +``` + +The object returned by `vl_matrix` is a list with 4 elements: + +- `sources`: origin point coordinates, +- `destinations`: destination point coordinates, +- `distances` : distance matrix between sources and destinations, +- `durations` : travel time matrix between sources and destinations. + + +```r +head(default_bike$durations) +``` + +``` + 1 2 3 4 5 6 7 8 9 10 +1 0.0 45.7 77.0 36.5 18.0 33.3 53.3 32.1 37.1 5.1 +2 48.9 0.0 98.4 30.8 43.5 77.0 83.4 56.4 75.2 45.5 +3 76.4 96.3 0.0 62.3 61.7 80.3 54.1 47.3 53.6 75.3 +4 33.2 29.7 61.7 0.0 20.4 54.8 63.6 34.6 47.0 31.7 +5 18.6 43.6 62.8 23.8 0.0 34.5 37.6 17.8 27.9 15.2 +6 31.2 75.1 78.2 58.3 33.3 0.0 31.0 30.7 27.9 32.3 +``` + +```r +head(road_bike$durations) +``` + +``` + 1 2 3 4 5 6 7 8 9 10 +1 0.0 32.8 51.2 25.2 13.1 21.5 33.0 22.1 27.7 4.0 +2 34.1 0.0 62.4 22.5 31.2 53.2 56.4 40.8 49.4 31.0 +3 49.7 62.6 0.0 44.0 40.9 52.8 36.2 30.6 35.6 49.5 +4 23.0 21.3 43.4 0.0 14.9 38.1 38.4 22.8 31.4 21.8 +5 12.4 30.3 41.8 15.5 0.0 23.6 28.1 13.2 21.0 11.1 +6 20.5 51.8 51.6 39.2 23.5 0.0 20.6 22.4 19.5 21.4 +``` + +We can see not only that travel times are different (which is to be expected, +given that we've changed the cyclist's default speed), but also that the path +taken are different (as a consequence of the change in preference for using +roads rather than cycle paths). + +```r +default_bike$distances - road_bike$distances +``` + +``` + 1 2 3 4 5 6 7 8 9 10 +1 0.000 0.071 1.052 0.653 0.040 0.026 1.492 -0.003 -0.865 0.014 +2 0.017 0.000 2.376 -0.513 -0.001 0.045 0.865 -0.001 1.114 0.494 +3 1.176 2.107 0.000 0.074 0.759 0.405 0.069 0.750 0.812 1.172 +4 0.238 -0.343 0.042 0.000 0.013 -0.155 1.309 0.097 -0.385 0.238 +5 0.506 0.026 0.440 0.653 0.000 0.016 -0.872 0.000 -0.813 0.019 +6 0.009 0.767 -0.414 -0.123 0.012 0.000 0.132 0.001 -0.072 0.010 +7 0.013 0.111 0.016 0.053 0.047 0.040 0.000 0.054 -0.053 0.005 +8 -0.053 0.035 0.486 0.001 0.018 0.005 0.787 0.000 -0.340 -0.057 +9 -0.386 -0.173 0.557 -0.302 0.190 -0.794 -0.204 -0.221 0.000 -0.390 +10 0.000 0.025 -1.127 0.724 0.089 0.028 1.489 -0.006 -0.868 0.000 +``` + +We now calculate a route between two points, by foot, using the `vl_route` +function and calculate the elevation profile of the returned route, using +the `vl_elevation` function. + +```r +p1 <- pharmacy[3, ] +p2 <- pharmacy[6, ] + +route <- vl_route(p1, p2, costing = "pedestrian") + +# We transform the LineString to Point geometries +pts_route <- sf::st_cast(route, "POINT") + +elev <- vl_elevation(loc = pts_route, sampling_dist = 10) +``` + +The object returned is an sf object with a point for each location where the +altitude has been sampled and with the attributes 'distance' (the cumulative +distance to the first point) and 'height' (the altitude). + + +We can use it to plot the elevation profile of our route. + +```r +plot(as.matrix(st_drop_geometry(elev)), type = "l") +``` + +![Elevation profile](./man/figures/plot1.png) - - - - - @@ -74,7 +202,10 @@ install.packages("valh", repos = "https://riatelab.r-universe.dev") +## Installing your own Valhalla server +We've included a [vignette](./vignettes/install-valhalla.Rmd) showing how to install +your own instance of Valhalla, either locally or on a remote server, using Docker. ## Motivation & Alternatives diff --git a/README.md b/README.md index cb1322e..be1bc99 100644 --- a/README.md +++ b/README.md @@ -47,12 +47,139 @@ install.packages("valh") install.packages("valh", repos = "https://riatelab.r-universe.dev") ``` - - - - - - +## Demo + +This is a short overview of the main features of `valh`. The dataset +used here is shipped with the package, it is a sample of 100 random +pharmacies in Berlin ([© OpenStreetMap +contributors](https://www.openstreetmap.org/copyright/en)) stored in a +[geopackage](https://www.geopackage.org/) file. + +It demonstrates the use of `vl_matrix`, `vl_route` and `vl_elevation` +functions. + +``` r +library(valh) +library(sf) +``` + + Data: (c) OpenStreetMap contributors, ODbL 1.0 - http://www.openstreetmap.org/copyright + Routing: Valhalla - valhalla.github.io/valhalla + Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.4.0; sf_use_s2() is TRUE + +``` r +pharmacy <- st_read(system.file("gpkg/apotheke.gpkg", package = "valh"), + quiet = TRUE) +pharmacy <- pharmacy[1:10, ] +``` + +One of valhalla’s strengths is that it allows you to use dynamic costing +options at query time. For example, we can compare the travel time +between each pharmacy by bicycle: + +- with the default bicycle parameters (type of bicycle “hybrid” with an + average speed of 18 km/h and a propensity to use roads, alongside + other vehicles, of 0.5 out of 1 - the default value), +- with the road bicycle parameters (type of bicycle “road” with an + average speed of 25 km/h and a propensity to use roads, alongside + other vehicles, of 1 out of 1). + +These costing options for each costing model (‘auto’, ‘bicycle’, etc.) +are documented in [Valhalla’s +documentation](https://valhalla.github.io/valhalla/api/turn-by-turn/api-reference/#costing-models). + +``` r +default_bike <- vl_matrix(loc = pharmacy, + costing = "bicycle") + +road_bike <- vl_matrix(loc = pharmacy, + costing = "bicycle", + costing_options = list(bicycle_type = "Road", use_roads = "1")) +``` + +The object returned by `vl_matrix` is a list with 4 elements: + +- `sources`: origin point coordinates, +- `destinations`: destination point coordinates, +- `distances` : distance matrix between sources and destinations, +- `durations` : travel time matrix between sources and destinations. + +``` r +head(default_bike$durations) +``` + + 1 2 3 4 5 6 7 8 9 10 + 1 0.0 45.7 77.0 36.5 18.0 33.3 53.3 32.1 37.1 5.1 + 2 48.9 0.0 98.4 30.8 43.5 77.0 83.4 56.4 75.2 45.5 + 3 76.4 96.3 0.0 62.3 61.7 80.3 54.1 47.3 53.6 75.3 + 4 33.2 29.7 61.7 0.0 20.4 54.8 63.6 34.6 47.0 31.7 + 5 18.6 43.6 62.8 23.8 0.0 34.5 37.6 17.8 27.9 15.2 + 6 31.2 75.1 78.2 58.3 33.3 0.0 31.0 30.7 27.9 32.3 + +``` r +head(road_bike$durations) +``` + + 1 2 3 4 5 6 7 8 9 10 + 1 0.0 32.8 51.2 25.2 13.1 21.5 33.0 22.1 27.7 4.0 + 2 34.1 0.0 62.4 22.5 31.2 53.2 56.4 40.8 49.4 31.0 + 3 49.7 62.6 0.0 44.0 40.9 52.8 36.2 30.6 35.6 49.5 + 4 23.0 21.3 43.4 0.0 14.9 38.1 38.4 22.8 31.4 21.8 + 5 12.4 30.3 41.8 15.5 0.0 23.6 28.1 13.2 21.0 11.1 + 6 20.5 51.8 51.6 39.2 23.5 0.0 20.6 22.4 19.5 21.4 + +We can see not only that travel times are different (which is to be +expected, given that we’ve changed the cyclist’s default speed), but +also that the path taken are different (as a consequence of the change +in preference for using roads rather than cycle paths). + +``` r +default_bike$distances - road_bike$distances +``` + + 1 2 3 4 5 6 7 8 9 10 + 1 0.000 0.071 1.052 0.653 0.040 0.026 1.492 -0.003 -0.865 0.014 + 2 0.017 0.000 2.376 -0.513 -0.001 0.045 0.865 -0.001 1.114 0.494 + 3 1.176 2.107 0.000 0.074 0.759 0.405 0.069 0.750 0.812 1.172 + 4 0.238 -0.343 0.042 0.000 0.013 -0.155 1.309 0.097 -0.385 0.238 + 5 0.506 0.026 0.440 0.653 0.000 0.016 -0.872 0.000 -0.813 0.019 + 6 0.009 0.767 -0.414 -0.123 0.012 0.000 0.132 0.001 -0.072 0.010 + 7 0.013 0.111 0.016 0.053 0.047 0.040 0.000 0.054 -0.053 0.005 + 8 -0.053 0.035 0.486 0.001 0.018 0.005 0.787 0.000 -0.340 -0.057 + 9 -0.386 -0.173 0.557 -0.302 0.190 -0.794 -0.204 -0.221 0.000 -0.390 + 10 0.000 0.025 -1.127 0.724 0.089 0.028 1.489 -0.006 -0.868 0.000 + +We now calculate a route between two points, by foot, using the +`vl_route` function and calculate the elevation profile of the returned +route, using the `vl_elevation` function. + +``` r +p1 <- pharmacy[3, ] +p2 <- pharmacy[6, ] + +route <- vl_route(p1, p2, costing = "pedestrian") + +# We transform the LineString to Point geometries +pts_route <- sf::st_cast(route, "POINT") + +elev <- vl_elevation(loc = pts_route, sampling_dist = 10) +``` + +The object returned is an sf object with a point for each location where +the altitude has been sampled and with the attributes ‘distance’ (the +cumulative distance to the first point) and ‘height’ (the altitude). + +We can use it to plot the elevation profile of our route. + +``` r +plot(as.matrix(st_drop_geometry(elev)), type = "l") +``` + +
+Elevation profile + +
+ @@ -69,6 +196,12 @@ install.packages("valh", repos = "https://riatelab.r-universe.dev") +## Installing your own Valhalla server + +We’ve included a [vignette](./vignettes/install-valhalla.Rmd) showing +how to install your own instance of Valhalla, either locally or on a +remote server, using Docker. + ## Motivation & Alternatives The package is designed to provide an easy-to-use interface to the diff --git a/man/figures/plot1.png b/man/figures/plot1.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd1b3ed4ca9f8007c96a00a84bb462f8d04136f GIT binary patch literal 24646 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 literal 0 HcmV?d00001