inconsistent result with INVALID_REQUEST in R ggmap geocode()

你离开我真会死。 提交于 2019-12-24 16:33:42

问题


I'm trying to geocode a list of addresses, and I'm getting some INVALID_REQUEST errors, but I have no idea why. Check this out:

# First check if I have permission:
geocodeQueryCheck()
2478 geocoding queries remaining.

# Enter data
d <- c("Via del Tritone 123, 00187 Rome, Italy",
       "Via dei Capocci 4/5, 00184 Rome, Italy")

# Ensure it's a character vector
class(d)
[1] "character"

# Try to geocode
library(ggmap)
geocode(d)
   lon      lat
1       NA       NA
2 12.49324 41.89582
Warning message:
geocode failed with status INVALID_REQUEST, location = "Via del Tritone 123, 00187 Rome, Italy" 

# Obtain an error, but if I try directly:
geocode("Via del Tritone 123, 00187 Rome, Italy")
   lon      lat
1 12.48813 41.90352

# It works. What gives?

回答1:


A similar issue has been reported for RgoogleMaps::getGeoCode(), which was linked to Google's rate limiting. Since geocode() also relies on the Google Maps API (unless source = "dsk"), this limiting is likely causing problems here as well.

You can easily solve this the "stubborn" way by iterating through all locations of interest (eg. using for or *apply) rather than passing one large vector of addresses to geocode at once. Inside the loop, you can then use while to detect whether coordinates were successfully retrieved for the currently processed location and, if not, simply repeat the geocoding procedure until it succeeds.

out = lapply(d, function(i) {
  gcd = geocode(i)

  while (all(is.na(gcd))) {
    gcd = geocode(i)
  }

  data.frame(address = i, gcd)
})

For example, during my last test run, the retrieval failed three times as indicated by the following warnings (this will likely look different on your machine):

Warning messages:
1: geocode failed with status OVER_QUERY_LIMIT, location = "Via del Tritone 123, 00187 Rome, Italy" 
2: geocode failed with status OVER_QUERY_LIMIT, location = "Via del Tritone 123, 00187 Rome, Italy" 
3: geocode failed with status OVER_QUERY_LIMIT, location = "Via dei Capocci 4/5, 00184 Rome, Italy" 

Nonetheless, thanks to the while condition included inside the outer loop structure, coordinates were finally successfully retrieved for all locations of interest:

> do.call(rbind, out)
                                 address      lon      lat
1 Via del Tritone 123, 00187 Rome, Italy 12.48766 41.90328
2 Via dei Capocci 4/5, 00184 Rome, Italy 12.49321 41.89582

As an additional treat, this "stubborn" approach can easily be run in parallel (eg. using parLapply() or foreach()), which might result in considerable speed gains when querying a larger number of addresses.



来源:https://stackoverflow.com/questions/30350122/inconsistent-result-with-invalid-request-in-r-ggmap-geocode

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!