Применение 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