R中的反向地理编码循环

Ami*_*hak 10 r reverse-geocoding ggmap

我试图反转地理编码一个大型数据集(大约100k).我使用revgeocode了包中的功能ggmap.我得到了一个条目的结果

48 Grand View Terrace, San Francisco, 
CA 94114, USA            
48 Grand View Terrace Eureka Valley San Francisco        
San Francisco County                  California United States
postal_code postal_code_suffix
Run Code Online (Sandbox Code Playgroud)

,但我需要自动化该过程并将其用于整个数据集.

我试过了

r <- lapply(revgeocode(location = (c(z$lon),c(z$lat)),
             output = "more",
            messaging = FALSE, sensor = FALSE, override_limit = FALSE,
            client = "", signature = ""))
Run Code Online (Sandbox Code Playgroud)

并在每一步中得到意外','的错误.

我也尝试编写以下循环

r <- for(i in 1:10){
  revgeocode(location = ("z$lon", "z$lat"),output = "more", messaging =      FALSE, sensor = FALSE, override_limit = FALSE,client = "", signature = "")}
Run Code Online (Sandbox Code Playgroud)

并得到类似的错误

请提供一些材料或有用的链接,帮助我编写反向地理编码循环.如何验证数据的真实性?

Ste*_*pré 7

根据此答案,您可以在data.frame中创建新变量

我们mapply()用来处理您的坐标并将结果返回到列表中res.

res <- mapply(FUN = function(lon, lat) { 
  revgeocode(c(lon, lat), output = "more") 
  }, 
  df$lon, df$lat
  )
Run Code Online (Sandbox Code Playgroud)

然后,我们使用rbindlist()from data.table将列表转换为a data.frame(fill = TRUE因为并非所有元素都res具有相同的长度,即某些结果不返回a street_number和a postal_code)并将cbind()其转换为原始数据

cbind(df, data.table::rbindlist(res, fill = TRUE))
Run Code Online (Sandbox Code Playgroud)

更新

跟进您的评论,如果您要处理超过2500个查询,您可以订阅Google Maps API Premium Plan来解锁更高的配额.然后,您可以将凭据传递给revgeocode()使用signatureclient参数.

正如文档中提到的那样:

购买Google Maps API Premium Plan许可后,您将收到Google发来的欢迎电子邮件,其中包含您的客户ID和私人加密密钥.

您的客户ID用于访问Google Maps API Premium Plan的特殊功能.所有客户端ID都以gme-前缀开头.将您的客户端ID作为客户端参数的值传递.使用您的私人加密密钥生成唯一的数字签名.将此签名作为签名参数的值传递.

通过检查revgeocode() 源代码并查看URL的构造方式,您可以了解它的工作原理:

sensor4url <- paste("&sensor=", sensor, sep = "")
client4url <- paste("&client=", client, sep = "")
signature4url <- paste("&signature=", signature, sep = "")
url_string <- paste("http://maps.googleapis.com/maps/api/geocode/json?latlng=", 
        loc4url, sensor4url, sep = "")
    if (userType == "business") {
        url_string <- paste(url_string, client4url, signature4url, 
            sep = "")
    }
Run Code Online (Sandbox Code Playgroud)

数据

df <- structure(list(lat = c(32.31, 32.19, 34.75, 35.09, 35.35, 34.74 ), lon = 
c(119.827, 119.637, 119.381, 119.364, 119.534, 119.421 )), .Names = 
c("lat", "lon"), row.names = c(21L, 32L, 37L, 48L, 50L, 89L), class = "data.frame") 
Run Code Online (Sandbox Code Playgroud)