【问题标题】:Get edge lenghts as spatial distances in a network in R将边缘长度作为 R 中网络中的空间距离
【发布时间】:2021-06-17 06:13:29
【问题描述】:

我有一个空间坐标为nodes_geo 的节点列表。第一列是节点的标识符,其他 2 列是 x 和 y 坐标:

nodes_geo <- structure(list(grid_grid.g9.nodes = c(27, 28, 29, 40, 41, 42, 
43, 55, 56, 58, 69, 81, 94, 98, 108, 110, 113, 114, 123, 124, 
128, 138, 139, 141), grid_grid.coords.x1 = c(15.504078, 15.704078, 
15.904078, 15.104078, 15.304078, 15.504078, 15.704078, 15.104078, 
15.304078, 15.704078, 14.904078, 14.304078, 13.904078, 14.704078, 
13.704078, 14.104078, 14.704078, 14.904078, 13.704078, 13.904078, 
14.704078, 13.704078, 13.904078, 14.304078), grid_grid.coords.x2 = c(43.835623, 
43.835623, 43.835623, 44.035623, 44.035623, 44.035623, 44.035623, 
44.235623, 44.235623, 44.235623, 44.435623, 44.635623, 44.835623, 
44.835623, 45.035623, 45.035623, 45.035623, 45.035623, 45.235623, 
45.235623, 45.235623, 45.435623, 45.435623, 45.435623)), class = "data.frame", row.names = c(NA, 
-24L))

我有这些节点的邻接矩阵adjacency_matrix

adjacency_matrix <- structure(c(0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 
1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 
1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 
0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 
1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 
1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 
0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 
1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 
1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 
1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim = c(24L, 24L), .Dimnames = list(
    c("27", "28", "29", "40", "41", "42", "43", "55", "56", "58", 
    "69", "81", "94", "98", "108", "110", "113", "114", "123", 
    "124", "128", "138", "139", "141"), c("27", "28", "29", "40", 
    "41", "42", "43", "55", "56", "58", "69", "81", "94", "98", 
    "108", "110", "113", "114", "123", "124", "128", "138", "139", 
    "141")))

我想根据上述邻接矩阵获得网络中边缘的空间长度。我还希望能够从具有相同边数的真实网络生成的随机网络中执行相同的操作。目标是比较真实网络和随机网络的平均边长,以进行假设检验。

【问题讨论】:

  • 您的坐标是地理经度、纬度还是平面 x,y?如果你有平面坐标,我认为你可以使用 spatstat 包做一些非常简单的事情。
  • 感谢您的评论。它们属于 sfc 类,据我了解,这意味着它们是地理坐标。
  • 一个 sfc 可以有任何类型的坐标,但如果你从地理开始并且没有进行任何变换,那么它们就是地理坐标。它们似乎跨越了一个很大的区域,但如果你能找到一个可接受的平面投影,那么你可以使用 spatstat 来做你想做的事。投影到平面空间可以吗?
  • 嗯,是的,它们覆盖了亚得里亚海东北部海岸。我认为平面投影没有任何问题。
  • 您可能对 sfnetworks 软件包感兴趣。它结合了 sf 和 tidygraph,一个 igraph 的 API。我不确定您所说的基于网络是什么意思,可能是 OpenStreetMap 吗?然后您可以查看 osmextract 或 osmdata 来获取网络并将其转换为 sfnetwork ;)

标签: r networking spatial


【解决方案1】:

这是使用上述数据的起点(请注意,我们假设这些 坐标与欧几里得距离是平面的,所以你应该真正投影 第一):

library(spatstat)
nodes_ppp <- as.ppp(nodes_geo[,c(2:3,1)], W = bounding.box.xy(nodes_geo[,-1]))
head(as.data.frame(nodes_ppp))
#>          x        y marks
#> 1 15.50408 43.83562    27
#> 2 15.70408 43.83562    28
#> 3 15.90408 43.83562    29
#> 4 15.10408 44.03562    40
#> 5 15.30408 44.03562    41
#> 6 15.50408 44.03562    42
a_mat <- adjacency_matrix > 0 # Logical matrix required
typeof(adjacency_matrix)
#> [1] "double"
typeof(a_mat)
#> [1] "logical"
network <- linnet(nodes_ppp, a_mat) # Linear network
#> Warning: Network is not connected
plot(network)

segs <- as.psp(network) # Segments of linear network
rslt <- lengths_psp(segs) # Segment lengths
hist(rslt)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2020-12-07
    • 2021-12-28
    相关资源
    最近更新 更多