我想使用Bing API来批量地理编码。我在https://github.com/gsk3/taRifx.geo/blob/master/R/Contributed.R的github上找到了一个软件包但是,我似乎无法弄清楚如何在向量上使用它的函数。当我尝试以下一切时,一切正常:
devtools::install_github("gsk3/taRifx.geo")
options(BingMapsKey='my_APIKEY')
geocode("New York,NY", service="bing", returntype="coordinates")
但是如果我用位置向量替换该位置,则只返回一个坐标对,并返回以下警告:
Warning message:
In if (is.na(x) | gsub(" *", "", x) == "") return(c(NA, NA)) :
the condition has length > 1 and only the first element will be used
我还尝试了以下替代功能,但同样只返回一对坐标。使用ggmap的geocode
我能够在向量上运行此过程,但它的API限制为每天2500次查询,因此我不得不尝试使用Bing(Yahoo api太难获取)。
bGeoCode <- function(str, BingMapsKey){
require(RCurl)
require(RJSONIO)
u <- URLencode(paste0("http://dev.virtualearth.net/REST/v1/Locations?q=", str, "&maxResults=1&key=", BingMapsKey))
d <- getURL(u)
j <- fromJSON(d,simplify = FALSE)
if (j$resourceSets[[1]]$estimatedTotal > 0) {
lat <- j$resourceSets[[1]]$resources[[1]]$point$coordinates[[1]]
lng <- j$resourceSets[[1]]$resources[[1]]$point$coordinates[[2]]
}
else {
lat <- lng <- NA
}
c(lat,lng)
}
bGeoCode(data$location, "my_APIKEY")
非常感谢任何帮助。
答案 0 :(得分:2)
如果没有使用相关软件包,看起来geocode
函数不会被矢量化。快速解决方法是将其矢量化:
geocodeVect <- Vectorize(geocode, vectorize.args="x")
geocodeVect(multiple_locations, ...)