在 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)
。这样做不会有什么坏处。
我正在使用 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)
。这样做不会有什么坏处。