如果您在C:/OSRM_API5/
中安装了OSRM API版本5,则下面的可重现示例中的以下循环会产生错误(在randrom时或多或少。上次我运行代码时{{1}我们在3台不同的笔记本电脑上运行代码,并获得以下不同的消息:
viaroute5中出错(locs $ x [i],locs $ y [i],locs $ x [j],locs $ y [j]):
找不到对象'res'另外:警告信息:1:In file(con,“r”):InternetOpenUrl失败:'Die Serververbindung konnte nicht hergestellt werden。' 2:在值[3L]中:达到 已用时间限制[cpu = 1s,elapsed = 1s]
或
options()中的错误:达到已用时间限制另外:警告 消息:在文件中(con,“r”):InternetOpenUrl失败:'死 Serververbindung konnte nicht hergestellt werden。'
或
粘贴错误(“错误输入”,dcall,“:”):达到已用时限
最初我们认为i=17
,但现在错误仍然存在,尽管setWinProgressBar
被注释掉了。
是否有人知道会发生什么或如何追踪此错误?
setWinProgressBar
评论1
如果我用一些微不足道的东西替换viaroute5 <- function(lat1, lng1, lat2, lng2, instructions) {
address <- "http://localhost:5000"
request <- paste(address, "/route/v1/driving/",
lng1, ",", lat1, ";", lng2, ",", lat2,
"?overview=false", sep = "", NULL)
R.utils::withTimeout({
repeat {
res <- try(
route <- rjson::fromJSON(
file = request))
if (class(res) != "try-error") {
if (!is.null(res)) {
break
} else {
stop("???")
}
}
}
}, timeout = 1, onTimeout = "warning")
if (res$code == "Ok") {
return(res$routes[[1]]$duration)
} else {
t_guess <- 16*60
warning("Route not found: ", paste(lat1, lng1, lat2, lng2, collapse = ", "),
". Time set to ", t_guess/60 , " min.")
}
}
n <- 1e3 # ................................... if set to 10, everything is fine!
locs <- data.frame(x = c(47.424536, 47.427061),
y = c(9.365103, 9.365062), stringsAsFactors = FALSE)
# pb <- winProgressBar(title = "Test",
# label = "0% done", min=0, max=100, initial=0)
wd <- getwd()
setwd("C:/OSRM_API5")
shell(paste0("osrm-routed ", "switzerland-latest.osrm", " >nul 2>nul"), wait = F)
Sys.sleep(3) # OSRM needs time
setwd(wd)
for (i in 1:n) {
print(i)
# info <- paste0("done ", round(i/nrow(locs)*100, 1), "%")
# setWinProgressBar(pb, i/nrow(locs)*100, label = info)
for (j in 1:n) {
viaroute5(locs$x[1], locs$y[1], locs$x[2], locs$y[2])
}
}
shell("TaskKill /F /IM osrm-routed.exe >nul 2>nul")
# close(pb)
,例如viaroute5(locs$x[1], locs$y[1], locs$x[2], locs$y[2])
错误消失了(当然)。
评论2 当我从`i = 17开始时,它看起来像
i+j
答案 0 :(得分:2)
我认为这是因为请求比OSRM更快地处理它们。这导致完整的OSRM请求队列,最后导致怪异的错误消息。有关部分说明,请参阅here。
使用github上的最新OSRMR
版本,您不应再出现此类错误。在v0.1.31
我更改了viaroute
包的OSRMR
功能,通过添加新的可选参数timeout
来解决此问题。 timeout
默认情况下将viaroute
调用置于睡眠状态1 ms。 timeout
也可以调整。
您可以使用以下命令从github安装最新的OSRMR
版本。
devtools::install_github("ims-fhs/osrmr")
以下可重现的示例适用于我:
osrmr::run_server("switzerland-latest", "C:/OSRM_API5")
n <- 1e3
locs <- data.frame(x = c(47.424536, 47.427061),
y = c(9.365103, 9.365062), stringsAsFactors = FALSE)
for (i in 1:n) {
print(i)
for (j in 1:n) {
osrmr::viaroute(locs$x[1], locs$y[1], locs$x[2], locs$y[2], instructions = FALSE, api_version = 5, localhost = TRUE, timeout = 0.001)
}
}
osrmr::quit_server()