Build and register a spatial relation connecting planning units whose Euclidean distance is less than or equal to a user-defined threshold.
This constructor does not require polygon geometry and instead uses planning-unit coordinates.
Usage
add_spatial_distance(
x,
coords = NULL,
max_distance,
name = "distance",
weight_mode = c("constant", "inverse", "inverse_sq"),
distance_eps = 1e-09
)Arguments
- x
A
Problemobject created withcreate_problem.- coords
Optional coordinates specification, following the same rules as in
add_spatial_knn.- max_distance
Positive numeric scalar giving the maximum distance for an edge.
- name
Character string giving the key under which the relation is stored.
- weight_mode
Character string indicating how distance is converted to weight. Must be one of
"constant","inverse", or"inverse_sq".- distance_eps
Small positive numeric constant used to avoid division by zero in inverse-distance weighting.
Details
Use this function when neighbourhood should be defined by a fixed distance radius rather than by polygon topology or a fixed number of neighbours.
Let \(s_i = (x_i, y_i)\) denote the coordinates of planning unit \(i\). Let \(d_{ij}\) be the Euclidean distance between planning units \(i\) and \(j\).
For a user-supplied threshold \(d_{\max}\), this constructor creates an edge between \(i\) and \(j\) whenever: $$ d_{ij} \le d_{\max}. $$
Edge weights are assigned according to weight_mode:
"constant": $$\omega_{ij} = 1,$$"inverse": $$\omega_{ij} = \frac{1}{\max(d_{ij}, \varepsilon)},$$"inverse_sq": $$\omega_{ij} = \frac{1}{\max(d_{ij}, \varepsilon)^2},$$
where \(\varepsilon\) = distance_eps is a small constant.
The implementation computes an \(O(n^2)\) distance matrix and is therefore
best suited to small or moderate numbers of planning units. For large
problems, add_spatial_knn is often more scalable.
The resulting relation is registered as undirected.
Examples
# Load a complete simulated planning problem.
example_data <- load_sim_multiaction()
p <- create_problem(
pu = example_data$planning_units,
features = example_data$features,
dist_features = example_data$dist_features,
cost = "cost"
)
p <- add_spatial_distance(
x = p,
max_distance = 1.01,
name = "within_1",
weight_mode = "constant"
)
p$data$spatial_relations$within_1
#> internal_pu1 internal_pu2 weight pu1 pu2 distance source
#> 1 1 2 1 1 2 1 distance_constant
#> 2 2 3 1 2 3 1 distance_constant
#> 3 3 4 1 3 4 1 distance_constant
#> 4 4 5 1 4 5 1 distance_constant
#> 5 5 6 1 5 6 1 distance_constant
#> 6 6 7 1 6 7 1 distance_constant
#> 7 7 8 1 7 8 1 distance_constant
#> 8 1 9 1 1 9 1 distance_constant
#> 9 2 10 1 2 10 1 distance_constant
#> 10 9 10 1 9 10 1 distance_constant
#> 11 3 11 1 3 11 1 distance_constant
#> 12 10 11 1 10 11 1 distance_constant
#> 13 4 12 1 4 12 1 distance_constant
#> 14 11 12 1 11 12 1 distance_constant
#> 15 5 13 1 5 13 1 distance_constant
#> 16 12 13 1 12 13 1 distance_constant
#> 17 6 14 1 6 14 1 distance_constant
#> 18 13 14 1 13 14 1 distance_constant
#> 19 7 15 1 7 15 1 distance_constant
#> 20 14 15 1 14 15 1 distance_constant
#> 21 8 16 1 8 16 1 distance_constant
#> 22 15 16 1 15 16 1 distance_constant
#> 23 9 17 1 9 17 1 distance_constant
#> 24 10 18 1 10 18 1 distance_constant
#> 25 17 18 1 17 18 1 distance_constant
#> 26 11 19 1 11 19 1 distance_constant
#> 27 18 19 1 18 19 1 distance_constant
#> 28 12 20 1 12 20 1 distance_constant
#> 29 19 20 1 19 20 1 distance_constant
#> 30 13 21 1 13 21 1 distance_constant
#> 31 20 21 1 20 21 1 distance_constant
#> 32 14 22 1 14 22 1 distance_constant
#> 33 21 22 1 21 22 1 distance_constant
#> 34 15 23 1 15 23 1 distance_constant
#> 35 22 23 1 22 23 1 distance_constant
#> 36 16 24 1 16 24 1 distance_constant
#> 37 23 24 1 23 24 1 distance_constant
#> 38 17 25 1 17 25 1 distance_constant
#> 39 18 26 1 18 26 1 distance_constant
#> 40 25 26 1 25 26 1 distance_constant
#> 41 19 27 1 19 27 1 distance_constant
#> 42 26 27 1 26 27 1 distance_constant
#> 43 20 28 1 20 28 1 distance_constant
#> 44 27 28 1 27 28 1 distance_constant
#> 45 21 29 1 21 29 1 distance_constant
#> 46 28 29 1 28 29 1 distance_constant
#> 47 22 30 1 22 30 1 distance_constant
#> 48 29 30 1 29 30 1 distance_constant
#> 49 23 31 1 23 31 1 distance_constant
#> 50 30 31 1 30 31 1 distance_constant
#> 51 24 32 1 24 32 1 distance_constant
#> 52 31 32 1 31 32 1 distance_constant
#> 53 25 33 1 25 33 1 distance_constant
#> 54 26 34 1 26 34 1 distance_constant
#> 55 33 34 1 33 34 1 distance_constant
#> 56 27 35 1 27 35 1 distance_constant
#> 57 34 35 1 34 35 1 distance_constant
#> 58 28 36 1 28 36 1 distance_constant
#> 59 35 36 1 35 36 1 distance_constant
#> 60 29 37 1 29 37 1 distance_constant
#> 61 36 37 1 36 37 1 distance_constant
#> 62 30 38 1 30 38 1 distance_constant
#> 63 37 38 1 37 38 1 distance_constant
#> 64 31 39 1 31 39 1 distance_constant
#> 65 38 39 1 38 39 1 distance_constant
#> 66 32 40 1 32 40 1 distance_constant
#> 67 39 40 1 39 40 1 distance_constant
#> 68 33 41 1 33 41 1 distance_constant
#> 69 34 42 1 34 42 1 distance_constant
#> 70 41 42 1 41 42 1 distance_constant
#> 71 35 43 1 35 43 1 distance_constant
#> 72 42 43 1 42 43 1 distance_constant
#> 73 36 44 1 36 44 1 distance_constant
#> 74 43 44 1 43 44 1 distance_constant
#> 75 37 45 1 37 45 1 distance_constant
#> 76 44 45 1 44 45 1 distance_constant
#> 77 38 46 1 38 46 1 distance_constant
#> 78 45 46 1 45 46 1 distance_constant
#> 79 39 47 1 39 47 1 distance_constant
#> 80 46 47 1 46 47 1 distance_constant
#> 81 40 48 1 40 48 1 distance_constant
#> 82 47 48 1 47 48 1 distance_constant
#> 83 41 49 1 41 49 1 distance_constant
#> 84 42 50 1 42 50 1 distance_constant
#> 85 49 50 1 49 50 1 distance_constant
#> 86 43 51 1 43 51 1 distance_constant
#> 87 50 51 1 50 51 1 distance_constant
#> 88 44 52 1 44 52 1 distance_constant
#> 89 51 52 1 51 52 1 distance_constant
#> 90 45 53 1 45 53 1 distance_constant
#> 91 52 53 1 52 53 1 distance_constant
#> 92 46 54 1 46 54 1 distance_constant
#> 93 53 54 1 53 54 1 distance_constant
#> 94 47 55 1 47 55 1 distance_constant
#> 95 54 55 1 54 55 1 distance_constant
#> 96 48 56 1 48 56 1 distance_constant
#> 97 55 56 1 55 56 1 distance_constant
#> 98 49 57 1 49 57 1 distance_constant
#> 99 50 58 1 50 58 1 distance_constant
#> 100 57 58 1 57 58 1 distance_constant
#> 101 51 59 1 51 59 1 distance_constant
#> 102 58 59 1 58 59 1 distance_constant
#> 103 52 60 1 52 60 1 distance_constant
#> 104 59 60 1 59 60 1 distance_constant
#> 105 53 61 1 53 61 1 distance_constant
#> 106 60 61 1 60 61 1 distance_constant
#> 107 54 62 1 54 62 1 distance_constant
#> 108 61 62 1 61 62 1 distance_constant
#> 109 55 63 1 55 63 1 distance_constant
#> 110 62 63 1 62 63 1 distance_constant
#> 111 56 64 1 56 64 1 distance_constant
#> 112 63 64 1 63 64 1 distance_constant
#> relation_name directed
#> 1 within_1 FALSE
#> 2 within_1 FALSE
#> 3 within_1 FALSE
#> 4 within_1 FALSE
#> 5 within_1 FALSE
#> 6 within_1 FALSE
#> 7 within_1 FALSE
#> 8 within_1 FALSE
#> 9 within_1 FALSE
#> 10 within_1 FALSE
#> 11 within_1 FALSE
#> 12 within_1 FALSE
#> 13 within_1 FALSE
#> 14 within_1 FALSE
#> 15 within_1 FALSE
#> 16 within_1 FALSE
#> 17 within_1 FALSE
#> 18 within_1 FALSE
#> 19 within_1 FALSE
#> 20 within_1 FALSE
#> 21 within_1 FALSE
#> 22 within_1 FALSE
#> 23 within_1 FALSE
#> 24 within_1 FALSE
#> 25 within_1 FALSE
#> 26 within_1 FALSE
#> 27 within_1 FALSE
#> 28 within_1 FALSE
#> 29 within_1 FALSE
#> 30 within_1 FALSE
#> 31 within_1 FALSE
#> 32 within_1 FALSE
#> 33 within_1 FALSE
#> 34 within_1 FALSE
#> 35 within_1 FALSE
#> 36 within_1 FALSE
#> 37 within_1 FALSE
#> 38 within_1 FALSE
#> 39 within_1 FALSE
#> 40 within_1 FALSE
#> 41 within_1 FALSE
#> 42 within_1 FALSE
#> 43 within_1 FALSE
#> 44 within_1 FALSE
#> 45 within_1 FALSE
#> 46 within_1 FALSE
#> 47 within_1 FALSE
#> 48 within_1 FALSE
#> 49 within_1 FALSE
#> 50 within_1 FALSE
#> 51 within_1 FALSE
#> 52 within_1 FALSE
#> 53 within_1 FALSE
#> 54 within_1 FALSE
#> 55 within_1 FALSE
#> 56 within_1 FALSE
#> 57 within_1 FALSE
#> 58 within_1 FALSE
#> 59 within_1 FALSE
#> 60 within_1 FALSE
#> 61 within_1 FALSE
#> 62 within_1 FALSE
#> 63 within_1 FALSE
#> 64 within_1 FALSE
#> 65 within_1 FALSE
#> 66 within_1 FALSE
#> 67 within_1 FALSE
#> 68 within_1 FALSE
#> 69 within_1 FALSE
#> 70 within_1 FALSE
#> 71 within_1 FALSE
#> 72 within_1 FALSE
#> 73 within_1 FALSE
#> 74 within_1 FALSE
#> 75 within_1 FALSE
#> 76 within_1 FALSE
#> 77 within_1 FALSE
#> 78 within_1 FALSE
#> 79 within_1 FALSE
#> 80 within_1 FALSE
#> 81 within_1 FALSE
#> 82 within_1 FALSE
#> 83 within_1 FALSE
#> 84 within_1 FALSE
#> 85 within_1 FALSE
#> 86 within_1 FALSE
#> 87 within_1 FALSE
#> 88 within_1 FALSE
#> 89 within_1 FALSE
#> 90 within_1 FALSE
#> 91 within_1 FALSE
#> 92 within_1 FALSE
#> 93 within_1 FALSE
#> 94 within_1 FALSE
#> 95 within_1 FALSE
#> 96 within_1 FALSE
#> 97 within_1 FALSE
#> 98 within_1 FALSE
#> 99 within_1 FALSE
#> 100 within_1 FALSE
#> 101 within_1 FALSE
#> 102 within_1 FALSE
#> 103 within_1 FALSE
#> 104 within_1 FALSE
#> 105 within_1 FALSE
#> 106 within_1 FALSE
#> 107 within_1 FALSE
#> 108 within_1 FALSE
#> 109 within_1 FALSE
#> 110 within_1 FALSE
#> 111 within_1 FALSE
#> 112 within_1 FALSE
