2013-12-01 7 views
1

Я пытаюсь запустить этот код, который принимает список адресов и запускает каждый из них через API геокодирования Google (используя функцию Addr2latlng ниже), чтобы получить широту/долготу и помещает каждый в данные используя ProcessAddrList ниже.Ошибка R - индекс за пределами

Проблема заключается в том, что 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

Вы уверены, что не достигли предела скорости Google API? – JackeJR

ответ

1

Вы хотите геокодируете местоположение с помощью Google Maps. Вы должны использовать Использовать 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 
0

Оригинальный вопрос является ограничение скорости проблема с Google API. Этот фрагмент кода «apiResult < - getURL (url)» не возвращает полезную часть данных, поэтому последующие вызовы try() не работают. Предыдущее предложение об использовании пакета ggmap является хорошим. Другая возможность заключается в том, что существует множество других API-интерфейсов геокодирования, которые не имеют таких же ограничений, как Google. Попробуйте найти здесь стартеры: http://tinyurl.com/freegeocode

Смежные вопросы