与 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()
),这可能会导致相当大的速度查询更多地址时获得收益。
我正在尝试对地址列表进行地理编码,但遇到了一些 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()
),这可能会导致相当大的速度查询更多地址时获得收益。