Skip to contents

This function transforms a spatial network object into an 'sfnetwork', scoring it based on road conditions and classifications. The transformation process includes casting the network to LINESTRING, converting it to 'sfnetwork', and adding attributes like 'arterialness' and 'weight' which are calculated based on the given road scores and the importance of the roads in the network.

Usage

prepare_network(
  network,
  key_attribute = "all_fastest_bicycle_go_dutch",
  road_scores = list(`A Road` = 1, `B Road` = 2, `Minor Road` = 1e+05),
  penalty_value = 1,
  transform_crs = 27700
)

Arguments

network

An 'sf' object representing a spatial network.

key_attribute

The attribute name from the network used for normalization and scoring, default is "all_fastest_bicycle_go_dutch".

road_scores

A list specifying scores for different road types. Example: list("A Road" = 1, "B Road" = 1, "Minor Road" = 10000000).

penalty_value

The penalty value for roads with low values, default is 1.

transform_crs

The numeric CRS code for coordinate transformation, default is 27700.

Value

An 'sfnetwork' object with attributes 'arterialness' and 'weight' that account for road conditions and their relative importance.

Examples

library(sf)
library(sfnetworks)
library(dplyr)
library(purrr)
library(zonebuilder)

# Load demo data 
os_edinburgh_demo_3km = sf::st_set_crs(os_edinburgh_demo_3km, 27700)
NPT_demo_3km = sf::st_set_crs(NPT_demo_3km, 27700)
base_network = sf::st_transform(os_edinburgh_demo_3km, crs = 27700)
influence_network = sf::st_transform(NPT_demo_3km, crs = 27700)
target_zone = zonebuilder::zb_zone("Edinburgh", n_circles = 2) |>
               sf::st_transform(crs = "EPSG:27700")

# Prepare the cohesive network
network = cohesive_network_prep(base_network = base_network, 
                                influence_network = influence_network, 
                                target_zone = target_zone, 
                                key_attribute = "road_function", 
                                attribute_values = c("A Road", "B Road", "Minor Road"))
#> Aggregating attribute: 'all_fastest_bicycle_go_dutch' using function: 'sum'.
#> [1] "Finished preparing the network data"

# Define road scores
road_scores = list("A Road" = 1, "B Road" = 1, "Minor Road" = 100000)

# Prepare the network
prepared_network = prepare_network(network, 
                                    key_attribute = "all_fastest_bicycle_go_dutch",
                                    road_scores = road_scores,
                                    transform_crs = 27700, penalty_value = 1)

# Print the prepared network
print(prepared_network)
#> # A sfnetwork with 1124 nodes and 1237 edges
#> #
#> # CRS:  EPSG:27700 
#> #
#> # An undirected multigraph with 1 component with spatially explicit edges
#> #
#> # Edge data: 1,237 × 12 (active)
#>    from    to road_function    id all_fastest_bicycle_go_dutch
#>   <int> <int> <chr>         <int>                        <int>
#> 1     1     2 A Road            1                         3608
#> 2     3     4 Minor Road        2                         1833
#> 3     5     6 A Road            3                         4900
#> 4     7     8 A Road            4                         4300
#> 5     9    10 A Road            5                         1379
#> 6    11    12 Minor Road        6                          528
#> # ℹ 1,231 more rows
#> # ℹ 7 more variables: geom <LINESTRING [m]>, value <dbl>, max_value <dbl>,
#> #   arterialness <dbl>, road_score <dbl>, weight <dbl>, penalty <dbl>
#> #
#> # Node data: 1,124 × 1
#>                  geom
#>           <POINT [m]>
#> 1 (324910.8 672963.1)
#> 2 (324910.7 672963.3)
#> 3     (327256 672497)
#> # ℹ 1,121 more rows