0

我正在尝试在 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")

演示完美运行,直到到达 igraph 部分。

gr_muc<-as_igraph(hways_muc)      # make a graph of the highways from openstreetmap
summary(gr_muc)

这应该返回

Vertices: 2381
Edges: 2888
Directed: TRUE
No graph attributes.
Vertex attributes: name.
Edge attributes: weight, name.

但对我来说它回来了

IGRAPH DNW-2385 2894 --
attr: name (v/c), weight (e/n), name (e/n)

我知道这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]]

并返回错误

At structural_properties.c:4482 :Couldn't reach some vertices

这意味着它无法链接开始和结束顶点。然后脚本失败。

为了使演示脚本运行,我要进行哪些更改,为什么它不起作用?

4

1 回答 1

5

有一些单向街道会阻止开始和结束节点连接。下面是一些杂乱无章的代码,绘制了从节点可到达的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)

可访问节点

请注意,您无法到达演示中端节点所在的右上角。

如果您不介意在单向街道上以错误的方式行驶,则可以通过使图形无向来解决此问题:

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]]

现在你有一条路线:

> route
[[1]]
  [2] 1444  491 2055  334  331  481  478  479  [etc]

但返回 fromget_shortest_paths是一个列表列表,因此您需要获取第一个组件route才能继续演示代码:

route=route[[1]]
route_nodes <- as.numeric(V(gr_muc)[route]$name)

然后绘制:

路线完成

所以我认为首先,开始和结束节点没有按照定向方式连接,其次演示代码中存在一个错误,因此无法从get_shortest_paths. 与它无关igraph0

于 2014-12-23T15:09:50.160 回答