Использование пакета R sfnetworks для подмножества речной сети, которая находится вверх по течению от данного узла.
Я экспериментирую с использованием пакета для запроса речных сетей. В частности, я хотел бы разделить части речной сети вверх по течению относительно любого заданного участка.
У меня есть набор данных небольшой речной сети (доступен ), который я могу преобразовать вsfnetwork
, который определяется пакетом как корневое дерево с пространственно явными ребрами. Полученная сеть представляет собой ориентированный ациклический граф (см.ggraph
сюжет ниже).
library(sf)
library(sfnetworks)
library(ggraph)
library(cowplot)
ss <- st_read(file.path("stream_network_subsetS_KNIG.gpkg")) # subset small network (Lull Creek)
#' create sfnetwork object from river network
#' https://github.com/luukvdmeer/sfnetworks/discussions/143
n.ss <- as_sfnetwork(st_cast(ss, "LINESTRING"))
n.ss
plot(n.ss)
#' visualize directness of network
ggraph(n.ss, layout = "tree") +
geom_node_point(size = 1) +
geom_edge_link(arrow = arrow(length = unit(2, 'mm'), ends = "first"),
end_cap = circle(2, 'mm'),
start_cap = circle(2, 'mm')) +
theme_graph()
Что я хотел бы сделать, так это подмножить/отфильтровать сеть, которая находится вверх по течению от любого заданного узла, который я указываю. С момента использования
igraph
для базовой структуры сетевых данных я попытался использоватьigraph::shortest_paths
для получения восходящих узлов:
#' this node is on the lower main stem of the network
node <- 50
#' query the nodes/vertices with a path to the node (warning issued)
x <- unique(unlist(igraph::shortest_paths(n.ss, from = node, to = igraph::V(n.ss), mode = "in")[[1]]))
#' select upstream nodes from spatial network
up.ss <- rep(FALSE, nrow(st_as_sf(n.ss, "nodes")))
up.ss[x] <- TRUE
n.ss.up <- n.ss |>
activate("nodes") |>
filter(up.ss)
#' plot upstream nodes
plot_grid(autoplot(n.ss), autoplot(n.ss.up))
Странно,
shortest_paths
возвращает узлы только вдоль основного ствола речной сети. я в курсеsfnetworks::st_network_paths
, но я не уверен, подходит ли он для того, что я пытаюсь сделать. У меня вопрос: как мне выбрать речную сеть (т. е. вершины/узлы и ребра), которая находится вверх по течению от указанного узла?
Я также знаю, чтоsfnetworks
есть учебник по маршрутизации учебник по маршрутизации ), но в нем явно делается упор на маршрутизацию уличной сети.
С использованиемdput
в примере данные производят громоздкий вывод, поэтому я загрузил набор данных на Google Диск здесьздесь (если кто-нибудь может указать лучшее решение для обмена файлом ~50 МБ, я буду использовать его в интересах воспроизводимости) . Спасибо!
1 ответ
Ты так близко! ваш код ищет все участки реки, до которых можно добраться вниз по течению , а не вверх по течению . Вероятно, это всего лишь артефакт того, как закодированы ссылки в вашем наборе данных о реках.
измените эту строку вашего кода:
- from x <- unique(unlist(igraph::shortest_paths(n.ss, from = node, to =igraph::V(n.ss), mode = " in ")[ ]))
- to x <- уникальный (unlist (igraph::shortest_paths(n.ss, from = node, to = igraph::V(n.ss), mode = " out ")[ ]))
и я надеюсь, что вы увидите ссылки вверх по течению, выделенные, как показано ниже: