Использование пакета 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 ")[ ]))

и я надеюсь, что вы увидите ссылки вверх по течению, выделенные, как показано ниже:

Другие вопросы по тегам