我正在尝试运行此代码,该代码获取地址列表并通过Google的Geocode API(使用下面的函数Addr2latlng)运行每个地址以获取纬度/经度,并使用下面的ProcessAddrList将每个地址放入数据框。
问题是Addr2latlng适用于一个地址,ProcessAddrList适用于最多10个地址,但是从11个地址或更多地址我得到以下错误。对于10个地址,这工作正常。
要运行以下代码,需要加载包RCurl和RJSONIO。
Error in geoStruct$results[[1]] : subscript out of bounds
Error in geoStruct$results[[1]] : subscript out of bounds
ProcessAddrList <- function(addrList)
{
resultDF <- data.frame(atext=character(),X=numeric(),Y=numeric(),EID=numeric())
i <- 1
for (addr in addrList)
{
latlng = Addr2latlng(addr)
resultDF <-rbind(resultDF,data.frame(atext=addr,X=latlng[[2]],Y=latlng[[1]],EID=i))
i <- i+1
}
return (resultDF)
}
Addr2latlng <- function(address)
{
url <- MakeGeoURL(address)
apiResult <- getURL(url)
geoStruct <- fromJSON(apiResult, simplify = FALSE)
lat <- NA
lng <- NA
try(lat <- geoStruct$results[[1]]$geometry$location$lat)
try(lng <- geoStruct$results[[1]]$geometry$location$lng)
return(c(lat, lng))
}
答案 0 :(得分:1)
您希望使用Google地图对地理位置进行地理编码。
您应该使用geocde
包中的使用ggmap
。
library(ggmap)
sapply(addrList,geocode) ##google maps api limits to 2500 queries a day.
例如:
library(ggmap)
addrList <- c('Paris','Djerba','London')
sapply(addrList,geocode)
# Paris Djerba London
# lon 2.352222 10.84515 -0.1198244
# lat 48.85661 33.8076 51.51121
答案 1 :(得分:0)
原始问题是Google API的速率限制问题。这段代码片段&#34; apiResult&lt; - getURL(url)&#34;没有返回可用的数据,因此后来的try()调用失败。之前使用ggmap包的建议很好。另一种可能性是,有许多其他地理编码API与Google没有相同的限制。尝试在这里寻找初学者:http://tinyurl.com/freegeocode