我试图对地址列表进行地理编码,并且我收到了一些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?
答案 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()
),这可能会在查询大量地址时产生相当大的速度提升。