Невозможно запустить демонстрацию OSMAR навигации в R. Возможно, потому что демо ожидает igraph0, который устарел

Я пытаюсь запустить демонстрацию osmar navigation в R. Эта демонстрация будет использовать osmar и igraph построить маршрут движения вокруг центра Мюнхена на основе данных openstreetmap.

Я использую R версии 3.1.1 на Lubuntu

Демонстрация и библиотека 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")

Демонстрация работает отлично, пока не достигнет секции с игрой.

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

Это означает, что он не может связать начальную и конечную вершины. Тогда сценарий не работает.

Что я могу изменить, чтобы запустить демонстрационный скрипт, и почему он не работает?

1 ответ

Решение

Есть несколько улиц с односторонним движением, которые препятствуют подключению начального и конечного узла. Вот некоторый фрагмент кода, который отображает узлы, доступные из 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,

Другие вопросы по тегам