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

时间:2015-05-20 12:47:14

标签: r geocode ggmap

我试图对地址列表进行地理编码,并且我收到了一些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?

1 个答案:

答案 0 :(得分:2)

已报告RgoogleMaps::getGeoCode()的{​​p> A similar issue与谷歌的速率限制有关。由于geocode()也依赖于Google Maps API(除非source = "dsk"),因此此限制可能也会导致问题。

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

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

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

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

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

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

作为一种额外的享受,这个&#34;顽固的&#34;方法可以很容易地并行运行(例如,使用parLapply()foreach()),这可能会在查询大量地址时产生相当大的速度提升。