在R

时间:2018-07-28 08:09:57

标签: r osrm

我正在使用OSRM使用此代码创建驱动器时间等时线

library(osrm)
library(osrmr)

s10.df<-structure(list(id = c(1010000273, 1010001028, 1010003635, 1010006693, 1010013430), 
           long_wgs = c(-1.564636192, -1.56677146, -1.554945908, -1.56773222, -1.564188582),
           lat_wgs = c(53.82838137, 53.82924493, 53.83130225, 53.82848279, 53.82857442)), 
           row.names = c(273L, 1023L, 3357L, 6326L, 12301L), class = "data.frame")

iso.list<-list()
for (i in 1:nrow(s10.df)){
  print(i)
  pt<-c(s10.df[i,]$long_wgs,s10.df[i,]$lat_wgs)
  iso.list[[i]] <- osrmIsochrone(loc = pt, breaks = 30)
}
length(iso.list)
iso<-do.call("rbind", iso.list)

但是,当我运行代码时,它是不一致的。有时它将全部5个点都运行,有时会运行5个以下且有非致命错误(可以计算后续点):

OSRM returned an error:
Error in if (res$code != "Ok") {: argument is of length zero

其他时候它将以致命错误停止(不再处理任何积分)

Error in (function (classes, fdef, mtable)  : 
unable to find an inherited method for function ‘coordinates’ for signature ‘"NULL"’

如果我可以确定OSRM返回的错误没问题,那么我可以“重新提交”要点,直到得到结果。但是,由于(函数(...结果中的错误,无法进行进一步处理。

我在其他地方看到过一些建议,我应该在Windows 10 PC上安装本地OSRM服务器,但这似乎进一步复杂了一个数量级。有人有建议吗?

1 个答案:

答案 0 :(得分:1)

每次运行您的代码时,我都会得到相同的结果。但是,一些技巧可能会有所帮助。

首先,由于您打开了两个类似的程序包,因此可以通过将osrm::放在该程序包的任何函数前面来确保这些程序包之间没有混淆,例如

iso.list[[i]] <- osrm::osrmIsochrone(loc = pt, breaks = 30)

第二,您可以通过在控制台中键入函数来检查函数(不带括号或参数)。在osrm::osrmIsochrone的情况下,似乎没有任何随机性(某些函数具有某种随机性,例如某些机器学习函数)。但是请确保在脚本的开头尝试添加set.seed(1234)。这样做很无伤大雅。