Применение revgeocode к списку координат долготы-широты

Я пытаюсь получить почтовые индексы (длинного) списка координат долготы и широты, используя функцию revgeodcode в библиотеке ggmap.

Мой вопрос и данные такие же, как здесь: Использование функции revgeocode в цикле FOR. Требуется помощь, но принятый ответ не работает для меня.

Мои данные (.csv):

ID,      Longitude,      Latitude
311175,  41.298437,      -72.929179
292058,  41.936943,      -87.669838
12979,   37.580956,      -77.471439

Я следую тем же шагам:

data <- read.csv(file.choose())
dset <- as.data.frame(data[,2:3])
location = dset
locaddr <- lapply(seq(nrow(location)), function(i){
               revgeocode(location[i,],
               output = c("address"),
               messaging = FALSE,
               sensor = FALSE,
               override_limit = FALSE)
               })

... и получить сообщение об ошибке: "Ошибка: is.numeric(location) && length(location) == 2 не TRUE" В частности, is.numeric(location) имеет значение FALSE, что кажется странным, поскольку я могу умножить на 2 и получите ожидаемый ответ.

Любая помощь будет оценена.

3 ответа

Решение

Здесь много чего не так.

Во-первых, вы изменили широту и долготу. Все местоположения в вашем наборе данных, как указано, находятся в Антарктике.

Во-вторых, revgeocode(...) ожидает числовой вектор длины 2, содержащий долготу и широту в этом порядке. Вы передаете data.frame объект (это причина ошибки), и согласно (1) он находится в неправильном порядке.

В третьих, revgeocode(...) использует API Google Maps, который ограничивает вас до 2500 запросов в день. Так что, если у вас действительно большой набор данных, удачи в этом.

Этот код работает с вашим примером:

data <- read.csv(text="ID,      Longitude,      Latitude
311175,  41.298437,      -72.929179
292058,  41.936943,      -87.669838
12979,   37.580956,      -77.471439")

library(ggmap)
result <- do.call(rbind,
                  lapply(1:nrow(data),
                         function(i)revgeocode(as.numeric(data[i,3:2]))))
data <- cbind(data,result)
data
#       ID Longitude  Latitude                                           result
# 1 311175  41.29844 -72.92918 16 Church Street South, New Haven, CT 06519, USA
# 2 292058  41.93694 -87.66984  1632 West Nelson Street, Chicago, IL 60657, USA
# 3  12979  37.58096 -77.47144    2077-2199 Seddon Way, Richmond, VA 23230, USA

Это извлекает почтовые индексы:

library(stringr)
data$zipcode <- substr(str_extract(data$result," [0-9]{5}, .+"),2,6)
data[,-4]
#       ID Longitude  Latitude zipcode
# 1 311175  41.29844 -72.92918   06519
# 2 292058  41.93694 -87.66984   60657
# 3  12979  37.58096 -77.47144   23230

Я написал пакет googleway для доступа к API карт Google с действующим ключом API. Поэтому, если ваши данные превышают 2500 единиц, вы можете заплатить за ключ API, а затем использовать googleway::google_reverse_geocode()

Например

data <- read.csv(text="ID,      Longitude,      Latitude
311175,  41.298437,      -72.929179
292058,  41.936943,      -87.669838
12979,   37.580956,      -77.471439")

library(googleway)

key <- "your_api_key"

res <- apply(data, 1, function(x){
  google_reverse_geocode(location = c(x["Latitude"], x["Longitude"]),
                         key = key)
})

## Everything contained in 'res' is all the data returnd from Google Maps API
## for example, the geometry section of the first lat/lon coordiantes

res[[1]]$results$geometry
bounds.northeast.lat bounds.northeast.lng bounds.southwest.lat bounds.southwest.lng location.lat location.lng
1            -61.04904                  180                  -90                 -180    -75.25097    -0.071389
location_type viewport.northeast.lat viewport.northeast.lng viewport.southwest.lat viewport.southwest.lng
1   APPROXIMATE              -61.04904                    180                    -90                   -180

Чтобы извлечь почтовый индекс, просто запишите:

>data$postal_code
Другие вопросы по тегам