-1

我在使用 googleway 包中的 google_geocode 函数批量地理编码时遇到问题。我想输入一个地址数据框,并为每个地址返回纬度和经度坐标。地址的数量远远超出了谷歌每天 2500 个查询的限制,因此该解决方案需要使用 API 密钥来允许购买更多查询。

## Your Google API key
key<-"<insert key here>"
###  Make Data Frame with two observations
Dt<-as.data.frame(matrix(c(" 4605 Langdon ST , Fernley , NV , 89408", -119.2026,
          " 350 Quivera LN , Sparks , NV , 89441", NA), ncol=2)) 
###Change Column Names
colnames(Dt)<-c("address", "longitude")

### Make address column character
Dt$address<-as.character(Dt$address)

### Make data frame with one observation
dt<-Dt[1,]


### geocode one observation with googleway  This Works!!
google_geocode(address = dt[,"address"],
           key = key)  

### batch geocode 
res <- apply(Dt, 1, function(Dt){

google_geocode(address=list(Dt[,"address"]),
              key = key)
})

##  Error in Dt[, "address"] : incorrect number of dimensions
4

1 回答 1

3

您构建 data.frame 的方式似乎有点复杂,所以我在这里重新做

dt <- data.frame(address = c("4605 Langdon St, Fernley, NV, 89408", 
                             "350 Quivera Ln, Sparks, NV, 89441"),
                 stringsAsFactors = FALSE)

然后您可以使用一种*apply方法对每个进行地理编码

library(googleway)

key <- 'api_key'

res <- apply(dt, 1, function(x){
  google_geocode(address = x[['address']],
                 key = key)
})

str(res)
# List of 2
# $ :List of 2
# ..$ results:'data.frame': 1 obs. of  5 variables:
#   .. ..$ address_components:List of 1
# .. .. ..$ :'data.frame':  8 obs. of  3 variables:
#   .. .. .. ..$ long_name : chr [1:8] "4605" "Langdon Street" "Fernley" "Lyon County" ...
# .. .. .. ..$ short_name: chr [1:8] "4605" "Langdon St" "Fernley" "Lyon County" ...
# .. .. .. ..$ types     :List of 8
# .. .. .. .. ..$ : chr "street_number"
# .. .. .. .. ..$ : chr "route"
# ... etc

然后,您可以提取每个结果的坐标并对其进行任何操作...

coords <- lapply(res, function(x){
  x$results$geometry$location
})

coords <- lapply(seq_along(res), function(x){
  coords <- res[[x]]$results$geometry$location
  address <- dt[x, 'address']
  res_df <- data.frame(lat = coords[, 'lat'],
                       lon = coords[, 'lng'], 
                       address = address
                       )
})

df_coords <- do.call(rbind, coords)
df_coords
#        lat       lon                             address
# 1 39.59275 -119.2026 4605 Langdon St, Fernley, NV, 89408
# 2 39.68911 -119.6345   350 Quivera Ln, Sparks, NV, 89441

mapKey <- symbolix.utils::mapKey()

google_map(key = mapKey) %>%
  add_markers(data = df_coords, lat = "lat", lon = "lon", info_window = "address")

在此处输入图像描述


笔记:

如果您想“确定”坐标与输入地址对齐,您应该在*apply执行地理编码的内部构建结果。

于 2017-08-16T22:11:47.620 回答