Ошибка в пакетном геокодировании с помощью R googleway - PullRequest
0 голосов
/ 06 ноября 2018

Не уверен, почему я продолжаю получать эту ошибку:

Ошибка в значении [3L]: При загрузке результатов произошла ошибка. Пожалуйста, проверьте правильность следующего URL, введя его в браузер. Если он действителен, отправьте отчет об ошибке со ссылкой на этот URL-адрес (примечание: ваш ключ API был удален, поэтому вам необходимо добавить его обратно)

https://maps.googleapis.com/maps/api/geocode/json?&address=#211.+226+park+street,+brockville,+on,+k6v2h5&key=

 #A look at my dataframe called subset:

 ID<- c("XM-7393","XM-7138")
 Address<- c("175 College St #450, Toronto, ON M5T 1P7" ,"250 College St, Toronto, ON M5T 1R8")
 subset<-data.frame(ID,Address)
 subset$Address<- as.character(subset$Address)
  require(googleway) #using google to get coordinates
  gkey<-"INSERT GOOGLE API KEY HERE" #google API Key needed to get lat/lon coordinates

  #a lat and lon vector to store the coordinates from the geocode
  lat = vector("numeric", length = nrow(subset))
  lng = vector("numeric", length = nrow(subset))


  #Function for batch geocoding a list of addresses in a dataframe
  for (i in 1:nrow(subset)) {
  coord = googleway::google_geocode(subset$Address[i], key=gkey)

  if (coord$status == "OK") {
coord = googleway::geocode_coordinates(coord)
lat[i] = coord$lat[1]  # sometimes returns multiple coordinates
lng[i] = coord$lng[1]  # sometimes returns multiple coordinates
} else {
lat[i] = NA
lng[i] = NA
}

}



 #adding the lat and lon coordinates to subset dataset
  subset$lat = lat
  subset$lng = lng

Хорошо, код выше работает! Но только если в наборе данных не так много наблюдений. Исходный набор данных, с которым я работал, имел 1000 наблюдений, и я знаю, что я не близок к своему пределу API. Так что не знаю, почему это не сработает, когда у меня есть набор данных наблюдения 1000.

ОТВЕТ: В некоторых адресных полях было указано «#» для обозначения номера устройства. Это необходимо удалить (см. Комментарий ниже!)

1 Ответ

0 голосов
/ 07 ноября 2018

Вы хотите убедиться, что в ваших адресах нет недопустимых или зарезервированных символов, поскольку любые функции геокодирования будут использовать ваш текст для создания URL-адресов для запроса API геокодирования. google_geocode само по себе не дает очень полезного сообщения об ошибке, но, посмотрев URL-адрес, который вы разместили выше, сообщение об ошибке показывает, что необходимые параметры не были включены.

В этом случае # имеет специальное значение в URL, поэтому вы получите сообщение об ошибке. К вашему сведению, мой ключ Google API сохранен как переменная среды GOOGLE_KEY:

library(googleway)

Address <- c("175 College St #450, Toronto, ON M5T 1P7", "250 College St, Toronto, ON M5T 1R8")
set_key(Sys.getenv("GOOGLE_KEY"))

geocode_results <- lapply(Address, google_geocode)
sapply(geocode_results, function(x) x[["status"]])
#> [1] "OVER_QUERY_LIMIT" "OK"

Первый адрес имеет ошибку; он также имеет символ #. Приведены списки зарезервированных символов, включая этот не зависящий от языка вопрос SO . Используя шаблон регулярных выражений, я удаляю все символы #, ( или ), которые могут быть в адресах, а затем повторяю попытку геокодирования.

clean_addresses <- gsub(pattern = "[#\\(\\)]", replacement = "", Address)
geocode_cleaned <- lapply(clean_addresses, google_geocode)
sapply(geocode_cleaned, function(x) x[["status"]])
#> [1] "OK" "OK"
...