You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用sfnetworks R包筛选指定节点上游的河网?

用sfnetworks提取指定节点的完整上游河网

针对你提到的有向无环河网(DAG)场景,要提取指定节点的完整上游河网(包含所有分支节点与边),可以通过以下步骤实现:

核心思路

河网的有向边通常是上游→下游的方向,上游节点是所有能通过有向路径到达目标节点的节点(包括目标节点本身)。igraph::subcomponent函数可以一次性获取这类节点集合(而非仅最短路径节点),再通过sfnetworks的子图提取工具生成上游河网。

具体实现代码

假设你的sfnetwork对象名为river_net,目标节点的ID为target_node_id(可替换为节点索引或属性值):

1. 加载依赖包

library(sfnetworks)
library(igraph)
library(sf)

2. 获取所有上游节点

# 定位目标节点的索引(如果用节点名称匹配,替换为你的属性字段)
target_idx <- V(river_net)[name == target_node_id]

# 提取所有能到达目标节点的上游节点(mode="in"表示入边方向,即所有指向目标的节点)
upstream_nodes <- subcomponent(river_net, target_idx, mode = "in")

3. 提取上游河网子图

# 基于上游节点集合生成子图,自动保留节点间的连接边
upstream_river_net <- st_network_subgraph(river_net, upstream_nodes)

关键说明

  • 为什么shortest_paths不行?该函数仅返回从单个起点到目标的最短路径,无法覆盖河网的分支节点,而subcomponent会获取所有能通过任意路径到达目标的节点,确保包含完整上游分支。
  • 边方向验证:如果你的河网边方向是下游→上游,需将mode参数改为"out"。可通过E(river_net)$from/E(river_net)$to查看边的起点终点,或绘图观察箭头方向确认。

结果验证

可以通过绘图对比原河网与上游子图:

plot(river_net, col = "gray", main = "完整河网与上游子图")
plot(upstream_river_net, col = "#ff4d4d", add = TRUE)

内容的提问来源于stack exchange,提问作者mbcaradima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:30:43