在 R 中创建行驶时间等时线

Create drive time isochrones in R

我正在使用 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 返回的错误,那没关系,我可以 "re-submit" 点,直到我得到结果。但是,由于 (function( ... 结果中的错误,无法进行进一步处理。

我在其他地方看到建议我应该设置一个本地 OSRM 服务器(在 Windows 10 PC 上?)但这似乎是进一步复杂化的一个数量级。有人有什么建议吗?

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

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

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

其次,您可以通过将函数键入控制台(不带括号或参数)来检查函数。在 osrm::osrmIsochrone 的情况下,似乎没有任何随机性(某些函数具有一些随机性,例如某些机器学习函数)。但为了保险起见,请尝试在脚本开头添加 set.seed(1234)。这样做不会有什么坏处。