R:sfnetworks:如何在同一数据集中的多个A和B位置之间查找路由

R:sfnetworks:如何在同一数据集中的多个A和B位置之间查找路由,r,shortest-path,stplanr,sfnetwork,R,Shortest Path,Stplanr,Sfnetwork,这是我的数据集 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

这是我的数据集

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
)

df首先,由于此数据框主要包含商店和客户的X和Y坐标,因此我将它们转换为
sf
对象。每组两个对象

#加载包
图书馆(tidyverse)
图书馆(sf)
图书馆(SF网络)
图书馆(潮汐图)
#加载数据
df从数据源读取图层“道路”
#>包含6915个功能和0个字段的简单功能集合
#>几何图形类型:线条字符串
#>尺寸:XY
#>边界框:xmin:78.0217 ymin:9.832762 xmax:78.22482 ymax:10.04193
#>大地测量CRS:WGS 84
#转换为SF网络
道路\u sfn=as\u sfn网络(道路,定向=假)
#做一些网络清理
道路清洁=道路sfn%>%
转换(到空间细分,.clean=TRUE)%>%
转换(到空间平滑,.clean=TRUE)
为了计算路径,我们可以使用mapply函数到
st\u network\u path()
函数,将from参数传递给商店的位置,将To参数传递给客户的位置。因此,按照每个组合的顺序计算路径

#计算指定的路径。
路径=映射层(
st_网络路径,
from=商店,
to=cust,
MoreArgs=列表(x=道路清洁)
)[“节点路径”,]%>%
未列出(递归=FALSE)
#>虽然坐标是经度/纬度,但st_最近点假定它们是平面的
#>虽然坐标是经度/纬度,但st_最近点假定它们是平面的
#>警告:尽管中的参数长度>1,但仅使用第一个元素
输出是一个包含五个元素的列表,其中包含每个路由的节点索引,这些索引对应于原始网络中的节点

路径[[1]]
#>  [1]  1842  1843 12191 12190   232  7977  7843 12174  8244  8205  7914  8139
#> [13]  8209  7958  7957  8229  8230  8328
如果我们想获得作为网络本身的路径,我们可以将原始网络切片为:

道路清洁%>%
激活(“节点”)%>%
切片(路径[[1]])
#>#具有18个节点和17条边的SF网络
#> #
#>#CRS:EPSG:4326
#> #
#>#具有空间显式边的无根树
#> #
#>#节点数据:18 x 1(活动)
#>#几何体类型:点
#>#尺寸:XY
#>#边界框:xmin:78.09568 ymin:9.943727 xmax:78.10051 ymax:9.955158
#>几何学
#>           
#> 1 (78.10001 9.946228)
#> 2 (78.10051 9.943727)
#> 3 (78.10017 9.945039)
#> 4 (78.09918 9.951894)
#> 5 (78.09895 9.953372)
#> 6 (78.09647 9.955099)
#> # ... 还有12排
#> #
#>#边缘数据:17 x 3
#>#几何体类型:线串
#>#尺寸:XY
#>#边界框:xmin:78.09568 ymin:9.943727 xmax:78.10051 ymax:9.955158
#>从几何到几何
#>                                              
#> 1     2     3 (78.10051 9.943727, 78.10029 9.944423, 78.10017 9.945039)
#> 2     6     7                    (78.09647 9.955099, 78.09877 9.954435)
#> 3    12    13                    (78.09569 9.955158, 78.09568 9.954763)
#> # ... 还有14行

你能展示一下你已经尝试过的路线吗?我刚刚知道上面的代码,它以起点为第1行,目的地为第2行。我不知道如何在列之间执行相同的操作而不是行扫描。请检查输入数据的坐标?第一家和第二家店铺的坐标相同;第三家和第四家商店有相同的合作关系。嗨@Betel,发布你的网络和你尝试过的其他东西可能会有用。我首先要说的是,您可以将数据帧转换为sf对象(一个用于商店,另一个用于客户(omers?),然后可以使用
st\u network\u path()
将其提供给
apply
函数中的to和from参数,如果没有更多的输入,很难找到您需要帮助的确切位置。