增加 ggmap 的地理编码功能中的 api 限制(在 R 中)

Posted

技术标签:

【中文标题】增加 ggmap 的地理编码功能中的 api 限制(在 R 中)【英文标题】:Increase the api limit in ggmap's geocode function (in R) 【发布时间】:2016-03-27 23:00:01 【问题描述】:

我正在尝试使用Rggmaps 库中的geocode 函数来获取特定位置的坐标。到目前为止,我可以很好地使用该功能。

我遇到的问题是我想将每日限额从2,500 提高到100,000。谷歌官方documentation 说如果您对项目启用计费,这很容易实现,我很乐意这样做。当您继续此过程时,Google Developers Console 会为您提供个性化的 API 密钥。

但是,geocode 函数没有用于输入此个性化 API 密钥的选项。相反,它要求 client(业务用户的客户端 ID)和 signature(业务用户的签名),这是 Google Maps API for Work 客户可以访问 API 的方式。我知道这也是一种选择,但这似乎是一个非常用例,因为 Google Maps API for Work 似乎是为大型企业帐户设计的:

每日配额从每 24 小时 100,000 个请求开始,基于年度合同采购。

所以我的问题归结为:我可以使用Rggmapslibrary 中的geocode 函数来ping Google Maps Geocoding API 吗?

【问题讨论】:

【参考方案1】:

使用 ggmap 2.7 或更高版本(截至 12 月 13 日,Cran 尚不可用,但您可以使用 devtools::install_github("dkahle/ggmap") 安装,您只需运行 register_google(key = 'LONG KEY STRING'),然后您就可以调用任何 ggmap 函数例如 geocodemutate_geocode 并使用您的 API 密钥。

【讨论】:

2018 年 3 月,2.7 仍然不在 CRAN 中。 ;( @yuk 2018 年 10 月,仍然不在 CRAN 中,现在 geocode 在没有 API 密钥的情况下根本无法工作:Keyless access to Google Maps Platform is deprecated. Please use an API key with all your API calls to avoid service interruption. For further details please refer to http://g.co/dev/maps-no-account【参考方案2】:

我已经编写了包 googleway 来访问谷歌地图 API,您可以在其中指定您的 api 密钥。

例如

library(googleway)

key <- "your_api_key"

google_geocode(address = "San Francisco",
               key = key)

# $results
# address_components
# 1 San Francisco, San Francisco County, California, United States, SF, San Francisco County, CA, US, locality, political, administrative_area_level_2, political, administrative_area_level_1, political, country, political
# formatted_address geometry.bounds.northeast.lat geometry.bounds.northeast.lng geometry.bounds.southwest.lat
# 1 San Francisco, CA, USA                      37.92977                     -122.3279                      37.69313
# geometry.bounds.southwest.lng geometry.location.lat geometry.location.lng geometry.location_type
# 1                     -123.1661              37.77493             -122.4194            APPROXIMATE
# geometry.viewport.northeast.lat geometry.viewport.northeast.lng geometry.viewport.southwest.lat
# 1                          37.812                       -122.3482                         37.7034
# geometry.viewport.southwest.lng                    place_id               types
# 1                        -122.527 ChIJIQBpAG2ahYAR_6128GcTUEo locality, political
# 
# $status
# [1] "OK"

【讨论】:

【参考方案3】:

谢谢!它极大地帮助了我。 您的解决方案非常具体,所以我想包括我对您的功能所做的修改。它抛出了错误,因为 raw_datageo_data_list 未定义。我猜这些是特定于您的本地环境的。

对我来说,输入位置并返回 lat, lon 是这样处理的:

 getGeoData <- function(location, api_key)
  location <- gsub(' ','+',location)
  geo_data <- getURL(paste("https://maps.googleapis.com/maps/api/geocode/json?address=",location,sprintf("&key=%s",api_key), sep=""))
  geo_data <- fromJSON(geo_data)
  return(geo_data$results[[1]]$geometry$location)

您可以修改 return 语句以索引到 geo_data 以获得除 lat lon 之外的其他属性。

希望这对某人有所帮助。

R

【讨论】:

【参考方案4】:

我没有找到使用现有geocode 函数(来自ggmap 库)来回答这个问题的方法,所以我只是创建了一个新函数来自己使用现有的getURL 函数来解决这个问题(来自RCurl 库)和fromJSON 函数(来自RJSONIO 库)。

编写新函数:

library(RJSONIO)
library(RCurl)

getGeoData <- function(location)
  location <- gsub(' ','+',location)
  geo_data <- getURL(paste("https://maps.googleapis.com/maps/api/geocode/json?address=",location,"&key=**[YOUR GOOGLE API KEY HERE]**", sep=""))
  raw_data_2 <- fromJSON(geo_data)
  return(raw_data_2)

测试: getGeoData("San Francisco")

这为您提供了一个列表,其中的数据几乎(但不完全)与geocode("San Francisco") 生成的列表格式完全相同。

【讨论】:

以上是关于增加 ggmap 的地理编码功能中的 api 限制(在 R 中)的主要内容,如果未能解决你的问题,请参考以下文章

地理编码地址到 R 中的县

Google Javascript API 地理编码限制

如何正确限制对 Android 和 iOS 应用程序(用 Flutter 编写)的 Google 地图(地点、地理编码)API 调用?

谷歌地图地理编码api免费每日限制在一次点击中结束,它发生由于我没有启用计费?

Google 地理编码 API 安全性

我可以按城镇限制谷歌地理编码器结果吗?