【问题标题】:Subscript out of bounds for reverse geocoding loop in RR中反向地理编码循环的下标越界
【发布时间】:2016-05-15 22:23:51
【问题描述】:

我正在尝试使用 google api 密钥对数据集进行反向地理编码。我设法运行代码并获得了 10 个小样本的所需结果,但它给出了错误

Error in rgc$results[[1]] : subscript out of bounds

我设法通过使用以下代码集成了 api 密钥:

` revgx <- mapply(function(latlng, api_key){


url= paste("https://maps.googleapis.com/maps/api/geocode/json?","latlng=",latlng,"&key=",sep="")

rgc <- fromJSON(paste(readLines(url), collapse = ''))

rgc <- rgc$results[[1]]


with(rgc,{rgcdf <<- data.frame(
address = formatted_address
)})
for(k in seq_along(rgc$address_components)){
rgcdf <- cbind(rgcdf, rgc$address_components[[k]]$long_name)
}
names(rgcdf) <- c('address', sapply(rgc$address_components, function(l)     l$types[1]))

# return 'more' output
rgcdf
},
y1$latlng)`

我也尝试使用相同的方法来合并 xml,但无济于事。请建议是否需要对代码进行任何更改。

【问题讨论】:

    标签: r google-maps reverse-geocoding


    【解决方案1】:

    我测试了您的代码,它对我有用。但是您不是在测试状态。如果 latlng 不正确,它将返回“零结果”作为状态(并且不存在 rgc$results)。这是我测试的代码。

    rev <- function(latlng, api_key) {
    
    url= url(paste("https://maps.googleapis.com/maps/api/geocode/json?","latlng=",latlng,"&key=",sep=""))
    rgc <- fromJSON(paste(readLines(url), collapse = ''))
    close(url)
    
    if (rgc["status"] == "OK") {
        rgc <- rgc$results[[1]]
        with(rgc, {
            rgcdf <<- data.frame(address = formatted_address)
        })
        for (k in seq_along(rgc$address_components)) {
            rgcdf <- cbind(rgcdf, rgc$address_components[[k]]$long_name)
        }
        names(rgcdf) <- c("address", sapply(rgc$address_components, function(l) l$types[1]))
        rgcdf["valid_latlong"] <- TRUE
        rgcdf
    } else {
        rgcdf <- c(valid_latlong=FALSE)
    }
    }
    

    我对此进行了测试:

    rev("12.9756300,77.6066230")
    

    您是否以这种格式传递 latlng?或 c(9756300,77.6066230) 。然后你需要做

    latlng <-  gsub(' ','%20', paste(latlng, collapse=","))
    

    您还没有在您共享的代码 sn-p 中集成 api 密钥。将 api_key 传递给查询参数。

    【讨论】:

    • 谢谢@khrm!!我运行了代码,它运行得非常准确。但是,当我通过 60 个查询时,它会给我一个包含 60 个的列表。然后,我使用代码df1 &lt;- rbindlist(df, fill= TRUE) 来绑定这个列表。这从 60 个列表中删除了 5 个结果,因此我无法使用原始数据集 cbind 获取 lat、lng 和地址字段的数据库。我收到错误Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 60, 55
    • 我添加了valid_latlong。现在你应该可以使用 cbind 了。如果这有助于接受和投票。
    • 谢谢@khrm。得到的列表可以通过以下方式绑定list = rbindlist(lapply(dflist, as.data.table), fill = TRUE),可以通过df1 &lt;- cbind(df, list)与lat-lng的dataframe绑定
    • 代码在运行更大的查询集(150 个查询)时会出现以下错误Error in fromJSON(paste(readLines(url), collapse = "")) : error in evaluating the argument 'content' in selecting a method for function 'fromJSON': Error in file(con, "r") : cannot open the connection
    • 你应该关闭连接。将修改代码。目前在职。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多