问题描述
我在使用googleway软件包中的google_geocode函数来批处理地理编码时遇到了麻烦.我想输入一个地址数据框,并为每个地址返回纬度和经度坐标.地址数量远远超出了Google的每日2500个查询限制,因此该解决方案需要使用API密钥来允许购买更多查询.
I'm having trouble using the google_geocode function in the googleway package to batch geocode. I'd like to input a data frame of addresses and have the latitude and longitude coordinates returned for each. The number of addresses is far beyond Google's 2,500 daily query limit, so the solution needs to use an API key to allow the purchase of more queries.
## 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
推荐答案
构建data.frame的方式似乎有些令人费解,所以我在这里重新做
The way you've constructed your data.frame seems a bit convoluted, so I'm re-doing it here
dt <- data.frame(address = c("4605 Langdon St, Fernley, NV, 89408",
"350 Quivera Ln, Sparks, NV, 89441"),
stringsAsFactors = FALSE)
然后,您可以使用*apply
方法对每个地址进行地理编码
Then you can use an *apply
method to geocode each one
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
然后您可以提取每个结果的坐标,并用它做任何您想做的事...
You can then extract the coordinates for each result and do whatever you want with it...
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
内部构造结果.
If you wanted to be 'sure' that the coordinates lined up with the input addresses, you should construct your results inside the *apply
that does the geocoding.
这篇关于使用googleway R进行批量地理编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!