The aim of this project is to generate evidence to support strategic cycle network planning in Scotland.
To reproduce the basic results in this repository, hosted on GitHub at nptscot/npt, first download and unzip or clone it and then open the ‘npt’ folder in your favourite integrated development environment (IDE) for R, such as RStudio.
-
You can download the repository as a zip file from the GitHub website by clicking on the green ‘Code’ button and selecting ‘Download ZIP’, hosted at this URL: https://www.github.com/nptscot/npt/archive/refs/heads/main.zip
-
You can clone the repo with Git as follows:
git clone https://www.github.com/nptscot/npt.git
-
Or (recommended for future-proof workflows) you can install the GitHub CLI tool and clone the repo as follows:
gh repo clone nptscot/npt
Install the GitHub CLI tools by following instructions here: https://cli.github.com/manual/installation
Note: you can check to see if you have the GitHub CLI tools installed by running the following command from the R console:
gh_version = try({
system("gh --version", intern = TRUE)
})
gh_version
#> [1] "gh version 2.30.0 (2023-05-30)"
#> [2] "https://github.com/cli/cli/releases/tag/v2.30.0"
if(is(gh_version, "try-error")) {
message("You don't have the GitHub CLI tools installed. Please install them by following instructions here: https://cli.github.com/manual/installation")
}
We will use the following packages:
library(tidyverse)
library(tmap)
library(sf)
Read-in the input datasets as follows:
list.files("data-raw")
#> [1] "DATASET.R" "get_wpz.R"
#> [3] "oas.geojson" "od_jittered_demo.R"
#> [5] "od_subset.csv" "routes.geojson"
#> [7] "test-tiles.R" "workplaces_simple_edinburgh.geojson"
#> [9] "zones_edinburgh.geojson"
od_data = read_csv("data-raw/od_subset.csv")
zones = read_sf("data-raw/zones_edinburgh.geojson")
desire_lines = od::od_to_sf(od_data, zones)
plot(desire_lines)
#> Warning: plotting the first 9 out of 13 attributes; use max.plot = 13 to plot
#> all
Generating route networks:
# Create a subset of the desire lines for speed of computation:
desire_lines_subset = desire_lines |>
slice_max(n = 30, order_by = all)
library(stplanr)
routes_subset = desire_lines_subset |>
route(l = _, route_fun = route_osrm)
route_network = overline(routes_subset, attrib = "bicycle")
plot(route_network)
- Read-in the
od_subset.csv
file containing origin-destination data in thedata-raw
folder in this repo with the following command:
od_data = read.csv("https://github.com/nptscot/npt/raw/main/data-raw/od_subset.csv")
-
What’s the average distance of trips according to the
dist_euclidean
column in that dataset? -
The values in the
dist_euclidean
column represent straight line distance between zone centroids. In what way could the values be over or under-estimates of the distances of trips taken between the OD pairs? -
Use the function
od_to_sf()
to convert the OD data into desire lines. Hint: a starting point could be:
zones = sf::read_sf("https://github.com/nptscot/npt/raw/main/data-raw/zones_edinburgh.geojson")
plot(zones$geometry)
Bonus exercises
-
Using interactive geographic data visualisation packages such as
tmap
andleaflet
, visualise the desire lines and route network on a map? Which road links are most important for cycling according to the network results? -
Using the
pct::uptake_pct_godutch_2020()
function estimate the potential uptake of cycling based on the subset of desire lines created above. What is the total level of cycling resulting from thhat uptake? -
Using the
osmextract
orosmdata
packages, or equivalent packages written in another language, identify the OSM ways that lie completely within a 500m buffer of the route network. How can you ensure that the results are reproducible? -
Bonus: think about ways to identify weak links or gaps in the cycle network based on the small datasets analysed. How could you scale this up to the whole of Scotland?
Note: to reproduce the full build process currently depends on data sources and dependencies that are not publicly available. This is a work in progress.
Then run the following command (requires dependencies and data to be present):
Note: you need to have a CYCLESTREETS API key for this, see here for details: https://rpackage.cyclestreets.net/reference/journey.html#details-1
This project uses targets
for data processing pipeline management,
with outputs like this:
Visualise the project as follows:
# targets::tar_visnetwork(targets_only = TRUE)
The zones in the case study region are as follows:
Baseline cycling levels are shown below:
tm_shape(rnet) +
tm_lines(lwd = "bicycle", scale = 9)