如何在R中为Google Maps API地理编码请求添加210ms延迟?
嘿,这个问题我之前也碰到过!Google Maps Geocoding API的速率限制确实挺严格的——每秒最多5次请求,换算下来就是每次请求间隔至少200ms,你要的210ms刚好留了点缓冲空间,很稳妥。
要实现这个延迟,你不能直接用批量的geocode()调用了,得改成逐行处理,每次请求后加个延迟。下面是具体的实现步骤:
1. 先确保加载需要的包
首先得加载ggmap包(因为geocode()函数一般来自这里):
library(ggmap)
2. 逐行循环处理并添加延迟
我们先初始化结果列,然后用for循环遍历每一行地址,每次调用地理编码后暂停210毫秒:
# 初始化用来存储地理编码结果的列(用list类型存,因为每个结果是包含经纬度的data.frame) mydata$geocode <- vector("list", nrow(mydata)) # 循环处理每一行 for (i in 1:nrow(mydata)) { # 提取当前行的地址,确保是字符类型 current_address <- as.character(mydata$value[i]) # 调用地理编码,同时用tryCatch捕获可能的错误,避免循环中断 geo_result <- tryCatch({ geocode(current_address) }, error = function(e) { # 如果出错,打印提示并返回NA的经纬度 message(paste("处理第", i, "行时出错:", e$message)) return(data.frame(lon = NA, lat = NA)) }) # 把结果存入对应的行 mydata$geocode[[i]] <- geo_result # 添加210ms的延迟 Sys.sleep(0.21) }
额外提示
- 如果你的请求量接近每日2500次的上限,即使加了延迟,当天用完配额后还是会报错。这时候可以考虑申请Google Cloud的API密钥并启用计费(有免费额度,超出后按收费标准来),这样每日上限会提升到更高的量级。
- 要是不想用Google的服务,也可以试试OpenStreetMap的Nominatim服务(免费但也有速率限制),对应的R包比如
osmdata或者直接用httr调用API。
内容的提问来源于stack exchange,提问作者Naim
相关产品推荐
相关产品推荐

