Where is cycle infrastructure most needed in UK cities? Clear answers can fundamentally change our built environment and support national initiatives to build a more sustainable future. With the aim of enabling cycling uptake, the PCT project provides transport planners, policy-makers and academics with free tools to prioritise investments and interventions.

Evidence-based interventions can make streets safer for future generations. This article demonstrates how to retrieve cycling potential data for any UK city, down to the route network level (see the cycling-potential-uk here or by running vignette("cycling-potential-uk") in R for a tutorial showing how the package can provide cycling uptake estimates at the area level), and how to use the results to see which streets will have high potential. These results can help prioritise investment in new cycleways and other interventions.


The following packages must be installed and loaded to run the code in this vignette.

Picking a study area

Part A) Choosing a region

Exploring study areas with PCT can be achieved by running view(pct_regions) in the R console. pct_regions are based on ‘regions’ from the geographic structure for England (ONS). Formerly known as Government offices for the regions or GOR’s (established in 1994), regions reflect a number of government departments who work with their local community to maximise prosperity and the quality of life within their area. Northern Ireland, Scotland and Wales were not subdivided into GOR’s but are listed with them for UK wide statistics.

Based on data from the most recent census (2011), PCT provides spatial and travel data for all 45 regions across England and Wales. To begin with, this example will demonstrate the PCT method for the city of Cardiff which belongs to the region of Wales.

region_name = "wales"
zones_all = get_pct_zones(region_name)

Part A) Picking a Local Authority

Each region in England and Wales is composed of multiple local authorities. Among other things, each local authority takes the lead for local planning, housing and environmental health.

How do you find all the local authorities part of your region?

#>  [1] "Cardiff"               "Wrexham"               "Conwy"                
#>  [4] "Newport"               "Caerphilly"            "Rhondda Cynon Taf"    
#>  [7] "Carmarthenshire"       "Swansea"               "The Vale of Glamorgan"
#> [10] "Bridgend"              "Neath Port Talbot"     "Pembrokeshire"        
#> [13] "Denbighshire"          "Flintshire"            "Monmouthshire"        
#> [16] "Powys"                 "Torfaen"               "Blaenau Gwent"        
#> [19] "Ceredigion"            "Gwynedd"               "Merthyr Tydfil"       
#> [22] "Isle of Anglesey"

Aha! As we can see Wales is composed of 42 local authorities. As we are looking at Cardiff in this example, we should declare that as our la_name.

la_name = "Cardiff"

Plotting Current Cycle Uptake

Now we have chosen our region and city, we can easily plot the total number of cyclists based on the 2011 census.

zones = zones_all %>% 
  filter(lad_name == la_name)

TaDa! The plot shows us that cycling is most prominent within the centre of Cardiff. While this is a first step in understanding where new cycle infrastructure is needed, it doesn’t outline the road network where new demand is likely to occur.

Plotting New Demand Based On PCT Models

PCT provides an easy way to get road network data for any pct_region. The road network data can then be filtered to the zones within our local authority.

rnet_all = pct::get_pct_rnet(region_name)
rnet = rnet_all[zones, ]

With our road network data fitted to our study area, we are now ready to plot where investment should be prioritised based on a demand model. PCT is built with numerous demand models based on varying situations (e.g. govtarget_slc,gendereq_slc and ebike_slc. In this example, we use the go dutch demand model; where demand is modelled on a cycle uptake equivalent to that in the Netherlands.

plot(rnet["dutch_slc"], add = TRUE)

Voila! The blue lines represent the road network with colour proportional to estimated potential based on the go dutch model. This plot helps us understand where to prioritise cycle infrastructure and what a new demand may look like.

Comparing Two Cities

Now we have seen the ease and versatility the PCT package provides, we can now use the method to explore more cities. Take Devon for example, the region has two major cities Exeter and Plymouth. Both cities obtain major universities, growing industries and have a relatively low cycle uptake. The latter should change, and the PCT package can provide the tools to help that.

We can now wrap the method we used for Cardiff into a function in order to compare the differences between the two cities.

pct_zones_rnet = function(la_name, region_name = "devon") {
  zones_all = pct::get_pct_zones(region_name)
  zones = zones_all %>% 
  filter(lad_name == la_name)
  rnet_all = pct::get_pct_rnet(region_name)
  rnet = rnet_all[zones, ]
  plot(rnet["dutch_slc"], add = TRUE)
  list(zones = zones, rnet = rnet)

plymouth_results = pct_zones_rnet(la_name = "Plymouth")

exeter_results = pct_zones_rnet(la_name = "Exeter")

Nice! The plots indicate a spatial spread for cycling in Plymouth, with investment necessary not only in the centre of the city. While for Exeter the distribution remains monocentric, with investment necessary mostly in the centre.

We can create side-by-side interactive maps of the route network potential for of same cities for a more detailed comparison as follow:

#> tmap mode set to interactive viewing
b = c(0, 100, 200, 500, 1000)
m1 = tm_shape(plymouth_results$rnet) +
  tm_lines("dutch_slc", breaks = b, palette = "viridis", lwd = 2) +
m2 = tm_shape(exeter_results$rnet) +
  tm_lines("dutch_slc", breaks = b, palette = "viridis", lwd = 2) +
tmap_arrange(m1, m2, ncol = 2)
#> Warning: Values have found that are higher than the highest break

#> Warning: Values have found that are higher than the highest break