我正在尝试使用该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()
Run Code Online (Sandbox Code Playgroud)
我想做的是子集/过滤我指定的任何给定节点上游的网络。由于
sfnetworks
用于igraph
底层网络数据结构,我尝试使用igraph::shortest_paths
获取上游节点:
#' …
Run Code Online (Sandbox Code Playgroud) 这是我的数据集
df<-tribble(
~"shop.x",~"shop.y", ~"cust.x", ~"cust.y",
78.100378, 9.944226, 78.096318, 9.954789,
78.101155, 9.932190, 78.089824, 9.929975,
78.141887, 9.928319, 78.110863, 9.952235,
78.100381, 9.944226, 78.104066, 9.97013,
78.097206, 9.948872, 78.11631, 9.947862
)
Run Code Online (Sandbox Code Playgroud)
df 数据集包含商店和顾客的位置。
我想使用 R 中的 OSM 地图为每一行(每个商店到客户位置)创建最短路径。是否可以使用 sfnetworks?
当地道路网络数据在这里