2015-06-20 2 views
1

Мне нужно извлечь геокодировки на основе имен местоположений, которые у меня есть в векторе в R. Я наткнулся на этот код, который вызывает API Карт Google с указанным адресом и возвращает обратно координаты.Неудачные вызовы API Карт Google в R

library(RCurl) 
library(RJSONIO) 
library(plyr) 

url <- function(address, return.call = "json", sensor = "false") { 
root <- "http://maps.google.com/maps/api/geocode/" 
u <- paste(root, return.call, "?address=", address, "&sensor=", sensor, sep= "") 
return(URLencode(u)) 
} 

geoCode <- function(address,verbose=FALSE) { 
if(verbose) cat(address,"\n") 
u <- url(address) 
doc <- getURL(u) 
x <- fromJSON(doc,simplify = FALSE) 
if(x$status=="OK") { 
    lat <- x$results[[1]]$geometry$location$lat 
    lng <- x$results[[1]]$geometry$location$lng 
    location_type <- x$results[[1]]$geometry$location_type 
    formatted_address <- x$results[[1]]$formatted_address 
    return(c(lat, lng, location_type, formatted_address)) 
    Sys.sleep(0.5) 
    } else { 
    return(c(NA,NA,NA, NA)) 
} 
} 
# address contains around 200 location names 
locations <- ldply(address, function(x) geoCode(x)) 

Когда я бегу этот код, примерно половину записей, я получаю статус, отличный от «OK» и, следовательно, получать координаты как NA. Однако, когда я делаю вызов снова индивидуально, его выход прекращается.

Я могу перезапустить API индивидуально, но есть ли способ, которым это можно сделать эффективно? Образец json response.

+0

Рассматривали ли вы с помощью 'геокода()' в 'ggmap' пакет? – jazzurro

+0

У меня нет большой идеи о пакете ggmap. Вы проверите это. – Vinay

ответ

0

Если у вас есть действующий Google Maps ключ API, вы можете использовать мой пакет googleway, и в частности google_geocode() функции

Например

library(googleway) 

key <- "your_api_key" 

addresses <- c("The White House, Washington DC, USA", 
       "MCG, Melbourne, Australia", 
       "Buckingham Palace, UK") 

lst <- lapply(addresses, function(x){ 
    google_geocode(x, key = key) ## use simplify = F for JSON 
}) 


lst[[1]]$results$formatted_address 
# [1] "The White House, 1600 Pennsylvania Ave NW, Washington, DC 20500, USA" 

lst[[2]]$results$formatted_address 
# [1] "Jolimont Station, Wellington Cres, East Melbourne VIC 3002, Australia" 

lst[[3]]$results$formatted_address 
# [1] "Buckingham Palace, London SW1A 1AA, UK"