Проблемы с обратными циклами геокодирования с координатами широты и долготы с помощью googleway: r дает одинаковые результаты для разных координат
Вот мой примерный набор данных (он называется origAddress):
lat lng
1.436316 103.8299
1.375093 103.8516
1.369347 103.8398
1.367353 103.8426
У меня есть много строк чисел широты и долготы (330), и я хотел бы найти адрес. Я использовал это для цикла, чтобы сделать это:
for(i in 1:nrow(origAddress))
{
# Print("Working...")
result <- google_reverse_geocode(location = c(origAddress$lat[i],origAddress$lng[i]),
key = key,
location_type = "rooftop")
if(is.null(result) || length(dim(result)) < 2 || !nrow(result)) next
origAddress$venadd <- geocode_address(result)
}
Он работает для первых трех или четырех строк, но затем возвращает тот же адрес, что и первая строка, хотя значения широты и долготы определенно отличаются. Я посмотрел другие вопросы, связанные со стековым потоком ( здесь), и попытался скопировать их подход с похожими плохими результатами.
Пожалуйста помоги!
1 ответ
Похоже, что вызовы google_geocode могут возвращать более одного адреса для каждой пары широта / долгота, поэтому вы можете перезаписывать свои данные во фрейме выходных данных.
Кроме того, я не уверен, что ваше заявление if оценивается правильно.
Вот моя попытка решить вашу проблему:
library(googleway)
origAddress<-read.table(header = TRUE, text = "lat lng
1.436316 103.8299
1.375093 103.8516
1.369347 103.8398
1.367353 103.8426")
#add the output column
origAddress$venadd<-NA
for(i in 1:nrow(origAddress))
{
# Print("Working...")
result <- google_reverse_geocode(location = c(origAddress$lat[i],origAddress$lng[i]),
key=key,
location_type = "rooftop")
#add a slight pause so not to overload the call requests
Sys.sleep(1)
if(result$status =="OK" ){
#multiple address can be returned with in gecode request picks the first one
origAddress$venadd[i] <- result$results$formatted_address[1]
#use this to collect all addresses:
#paste(result$results$formatted_address, collapse = " ")
}
}
Поскольку вызов google_reverse_geocode возвращает адрес, я просто извлекаю первый адрес из результата, сохраняя вызов в Интернет (повышение производительности). Кроме того, так как вызов возвращает статус, я проверяю OK и, если существует, сохраняю первый адрес.
Надеюсь это поможет.