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]

ただし、からの戻り値はリストのリストであるため、デモ コードを続行するにはget_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 に答える