2016-05-15 84 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的數據框綁定,列表)' –