0 r igraph openstreetmap osmar
我正在尝试在R中运行osmar导航演示.这个演示将使用osmar和igraph绘制慕尼黑市中心周围的交通路线,基于openstreetmap数据.
我在Lubuntu上使用R版本3.1.1
演示和osmar库在这里详细介绍http://journal.r-project.org/archive/2013-1/eugster-schlesinger.pdf
要运行我输入的演示,
library("osmar")
library("igraph") # The demo tries to call igraph0, but this is
# no-longer available in my version of R, so I
# have changed it to "igraph"
demo("navigator")
Run Code Online (Sandbox Code Playgroud)
演示完美运行,直到它到达igraph部分.
gr_muc<-as_igraph(hways_muc) # make a graph of the highways from openstreetmap
summary(gr_muc)
Run Code Online (Sandbox Code Playgroud)
这应该回来了
Vertices: 2381
Edges: 2888
Directed: TRUE
No graph attributes.
Vertex attributes: name.
Edge attributes: weight, name.
Run Code Online (Sandbox Code Playgroud)
但对我来说它会回归
IGRAPH DNW-2385 2894 --
attr: name (v/c), weight (e/n), name (e/n)
Run Code Online (Sandbox Code Playgroud)
我知道这gr_muc是一个图形,因为边和顶点的命令E(gr_muc)和V(gr_muc)返回列表.
然后演示运行
route <- get.shortest.paths(gr_muc,from = as.character(hway_start_node),to = as.character(hway_end_node))[[1]]
Run Code Online (Sandbox Code Playgroud)
并返回错误
At structural_properties.c:4482 :Couldn't reach some vertices
Run Code Online (Sandbox Code Playgroud)
这意味着它无法链接起始顶点和结束顶点.然后脚本失败了.
我将如何更改以使演示脚本运行,为什么它不起作用?
有一些单向街道阻止开始和结束节点连接.这是一些简洁的代码,用于绘制从节点可到达的hway_start节点:
plot(hways_muc)
hway_start # osmar object
plot_nodes(hway_start, add = TRUE, col = "red", pch = 19, cex = 2)
# get reachable nodes, return graph Vertex indexes
n1 = neighborhood(gr_muc,200,V(gr_muc)[as.character(hway_start_node)], mode="out")
# get graph subset
allpts = V(gr_muc)[n1[[1]]]
# use names to subset OSM nodes:
nds = subset(muc, node(allpts$name))
plot_nodes(nds, add=TRUE,col="green",pch=19,cex=1)
Run Code Online (Sandbox Code Playgroud)

请注意,您无法到达右上角,这是终端节点在演示中的位置.
如果您不介意通过使图表无向驱动错误的单向街道,您可以解决这个问题:
gru_muc=as.undirected(gr_muc)
route <- get.shortest.paths(gru_muc,
from = as.character(hway_start_node),
to = as.character(hway_end_node))[[1]]
Run Code Online (Sandbox Code Playgroud)
现在你有一条路线:
> route
[[1]]
[2] 1444 491 2055 334 331 481 478 479 [etc]
Run Code Online (Sandbox Code Playgroud)
但是返回来自get_shortest_paths列表列表,因此您需要获取第一个组件route来继续演示代码:
route=route[[1]]
route_nodes <- as.numeric(V(gr_muc)[route]$name)
Run Code Online (Sandbox Code Playgroud)
然后绘图:

所以我认为首先,开始和结束节点没有按照定向方式连接,其次,演示代码中存在一个错误,因此无法获得返回的正确元素get_shortest_paths.它与此毫无关系igraph0.
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |