与 R ggmap geocode() 中的 INVALID_REQUEST 不一致的结果

inconsistent result with INVALID_REQUEST in R ggmap geocode()

我正在尝试对地址列表进行地理编码,但遇到了一些 INVALID_REQUEST 错误,但我不知道为什么。看看这个:

# 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?

A similar issue 已报告 RgoogleMaps::getGeoCode(),这与 Google 的速率限制有关。由于 geocode() 也依赖于 Google 地图 API(除非 source = "dsk"),这个限制也可能在这里引起问题。

您可以通过迭代所有感兴趣的位置(例如使用 for*apply)而不是将一个大的地址向量传递给 "stubborn" 轻松解决此问题 geocode一次。在循环内,您可以使用 while 来检测是否成功检索到当前处理位置的坐标,如果没有成功检索,则只需重复地理编码过程,直到成功为止。

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

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

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

例如,在我上次测试 运行 期间,检索失败了 3 次,如以下警告所示(这在您的机器上可能看起来有所不同):

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" 

尽管如此,多亏了外循环结构中包含的 while 条件,最终成功检索了所有感兴趣位置的坐标:

> 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

作为额外的待遇,这种"stubborn"方法可以很容易地运行并行(例如使用parLapply()foreach()),这可能会导致相当大的速度查询更多地址时获得收益。