2016-05-15 83 views
1

我正在尝试使用google api密钥将地理编码反转为数据集。我设法运行代码,并得到想要的结果为10小样本,但它给下标越界R中的反向地理编码循环

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相同的方法,但无济于事。请建议是否需要对代码进行任何更改。

回答

2

我测试了你的代码,它为我工作。但是你没有测试状态。如果latlng不正确,则返回“ZERO RESULTS”作为状态(并且不存在rgc $结果)。这是我测试的代码。

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") 

你通过这种格式的经纬度?或c(9756300,77.6066230)。然后你需要做

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

此外,您还没有在您共享的代码段中集成api密钥。传递api_key来查询参数。

+0

谢谢@khrm!我运行代码,它的工作相当准确。但是,当我通过60个查询时,它给了我一个60开头的列表。然后,我使用代码'df1 < - rbindlist(df,fill = TRUE)'来绑定这个列表。这从60列表中删除了5个结果,因此我无法'与'原始数据集'绑定'来获取lat,lng和地址字段的数据库。我得到错误'Data.frame中的错误(...,check.names = FALSE): 参数意味着行数不同:60,55' –

+0

我添加了valid_latlong。现在你应该可以使用cbind了。如果这有助于接受和赞成。 – khrm

+0

谢谢@ khrm。获得的列表可以通过'list = rbindlist(lapply(dflist,as.data.table),fill = TRUE)'绑定,并且可以通过'df1 < - cbind(df)与lat-lng的数据框绑定,列表)' –