These functions allow to interpret spatial relations between nodes and
other geospatial features directly inside filter
and mutate
calls. All functions return a logical
vector of the same length as the number of nodes in the network. Element i
in that vector is TRUE
whenever the chosen spatial predicate applies
to the spatial relation between the i-th node and any of the features in
y
.
Usage
node_intersects(y, ...)
node_is_disjoint(y, ...)
node_touches(y, ...)
node_is_within(y, ...)
node_equals(y, ...)
node_is_covered_by(y, ...)
node_is_within_distance(y, ...)
node_is_nearest(y)
Arguments
- y
The geospatial features to test the nodes against, either as an object of class
sf
orsfc
.- ...
Arguments passed on to the corresponding spatial predicate function of sf. See
geos_binary_pred
. The argumentsparse
should not be set.
Details
See geos_binary_pred
for details on each spatial
predicate. The function node_is_nearest
instead wraps around
st_nearest_feature
and returns TRUE
for element i
if the i-th node is the nearest node to any of the features in y
.
Just as with all query functions in tidygraph, these functions are meant to
be called inside tidygraph verbs such as mutate
or
filter
, where the network that is currently being
worked on is known and thus not needed as an argument to the function. If
you want to use an algorithm outside of the tidygraph framework you can use
with_graph
to set the context temporarily while the
algorithm is being evaluated.
Note
Note that node_is_within_distance
is a wrapper around the
st_is_within_distance
predicate from sf. Hence, it is based on
'as-the-crow-flies' distance, and not on distances over the network. For
distances over the network, use node_distance_to
with edge lengths as weights argument.
Examples
library(sf, quietly = TRUE)
library(tidygraph, quietly = TRUE)
# Create a network.
net = as_sfnetwork(roxel) |>
st_transform(3035)
# Create a geometry to test against.
p1 = st_point(c(4151358, 3208045))
p2 = st_point(c(4151340, 3207520))
p3 = st_point(c(4151756, 3207506))
p4 = st_point(c(4151774, 3208031))
poly = st_multipoint(c(p1, p2, p3, p4)) |>
st_cast('POLYGON') |>
st_sfc(crs = 3035)
# Use predicate query function in a filter call.
within = net |>
activate(nodes) |>
filter(node_is_within(poly))
disjoint = net |>
activate(nodes) |>
filter(node_is_disjoint(poly))
oldpar = par(no.readonly = TRUE)
par(mar = c(1,1,1,1))
plot(net)
plot(within, col = "red", add = TRUE)
plot(disjoint, col = "blue", add = TRUE)
par(oldpar)
# Use predicate query function in a mutate call.
net |>
activate(nodes) |>
mutate(within = node_is_within(poly)) |>
select(within)
#> # A sfnetwork: 987 nodes and 1215 edges
#> #
#> # A directed multigraph with 9 components and spatially explicit edges
#> #
#> # Dimension: XY
#> # Bounding box: xmin: 4150707 ymin: 3206375 xmax: 4152366 ymax: 3208564
#> # Projected CRS: ETRS89-extended / LAEA Europe
#> #
#> # Node data: 987 × 2 (active)
#> within geometry
#> <lgl> <POINT [m]>
#> 1 FALSE (4151782 3207612)
#> 2 FALSE (4151765 3207609)
#> 3 FALSE (4151784 3208259)
#> 4 FALSE (4151728 3208240)
#> 5 TRUE (4151472 3207948)
#> 6 TRUE (4151470 3207929)
#> # ℹ 981 more rows
#> #
#> # Edge data: 1,215 × 5
#> from to name type geometry
#> <int> <int> <chr> <chr> <LINESTRING [m]>
#> 1 1 2 Hagemanns Kämpken residential (4151782 3207612, 4151765 3207609)
#> 2 3 4 Stiegkamp residential (4151784 3208259, 4151728 3208240)
#> 3 5 6 Havixbecker Straße residential (4151472 3207948, 4151474 3207941,…
#> # ℹ 1,212 more rows
# Use predicate query function directly.
within = with_graph(net, node_is_within(poly))
head(within)
#> [1] FALSE FALSE FALSE FALSE TRUE TRUE