A spatial network specific join function which makes a spatial full join on
the geometries of the nodes data, based on the st_equals
spatial predicate. Edge data are combined using a
bind_rows
semantic, meaning that data are matched by
column name and values are filled with NA
if missing in either of
the networks. The from
and to
columns in the edge data are
updated such that they match the new node indices of the resulting network.
st_network_join(x, y, ...)
An object of class sfnetwork
.
An object of class sfnetwork
, or directly convertible
to it using as_sfnetwork
.
Arguments passed on to graph_join
.
The joined networks as an object of class sfnetwork
.
library(sf, quietly = TRUE)
node1 = st_point(c(0, 0))
node2 = st_point(c(1, 0))
node3 = st_point(c(1,1))
node4 = st_point(c(0,1))
edge1 = st_sfc(st_linestring(c(node1, node2)))
edge2 = st_sfc(st_linestring(c(node2, node3)))
edge3 = st_sfc(st_linestring(c(node3, node4)))
net1 = as_sfnetwork(c(edge1, edge2))
net2 = as_sfnetwork(c(edge2, edge3))
joined = st_network_join(net1, net2)
joined
#> # A sfnetwork with 4 nodes and 4 edges
#> #
#> # CRS: NA
#> #
#> # A directed acyclic multigraph with 1 component with spatially explicit edges
#> #
#> # Node data: 4 × 1 (active)
#> x
#> <POINT>
#> 1 (0 0)
#> 2 (1 0)
#> 3 (1 1)
#> 4 (0 1)
#> #
#> # Edge data: 4 × 3
#> from to x
#> <int> <int> <LINESTRING>
#> 1 1 2 (0 0, 1 0)
#> 2 2 3 (1 0, 1 1)
#> 3 2 3 (1 0, 1 1)
#> # ℹ 1 more row
## Plot results.
oldpar = par(no.readonly = TRUE)
par(mar = c(1,1,1,1), mfrow = c(1,2))
plot(net1, pch = 15, cex = 2, lwd = 4)
plot(net2, col = "red", pch = 18, cex = 2, lty = 3, lwd = 4, add = TRUE)
plot(joined, cex = 2, lwd = 4)
par(oldpar)