【问题标题】:How to use Google geocoding API?如何使用谷歌地理编码 API?
【发布时间】:2018-11-24 08:30:20
【问题描述】:

我有一个 Android 应用程序,我正在使用 Google 地理编码 API 来获取地址的 GPS 坐标。目前我正在使用以下正常工作的 URL:

http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=1600+Amphitheatre+Parkway,+Mountain+View,+CA

问题是,在 2018 年 7 月 16 日 Google 的“新定价更改”之后,上述 API 是否会继续工作?根据此处的 Google API 文档https://developers.google.com/maps/documentation/geocoding/intro#GeocodingResponses,执行地理编码的正确方法是使用以下格式:

https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=YOUR_API_KEY

我尝试过使用建议的格式(创建了一个项目,启用了计费,启用了 Places 和 Maps API,创建了一个 API 密钥,增加了密钥的安全性,以便只有我的应用程序可以访问该密钥)但是当我使用建议的格式我得到了错误,

此 IP、站点或移动应用程序无权使用此 API 关键

阅读 StackOverflow 上的其他问题后,我发现了以下建议:

  1. 创建服务器密钥并使用它代替 API 密钥
  2. 不对 API 密钥添加限制
  3. 使用 API 请求的第一种格式(不带 API_KEY)
  4. 等待 10 分钟,直到新 KEY 变为活动状态

我尝试了所有这些,除了 1 并且没有工作。关于解决方案#1,根据文档,API 需要一个 API 密钥,所以我看不出为什么服务器密钥会起作用。

解决方案 2 有风险,解决方案 3 不确定它是否会继续与定价变化一起工作,解决方案 4 也不起作用(我等了几个小时没有成功)。

我什至创建了一个新的 API KEY 并没有对其添加任何限制,但我收到了超出限制的错误。

任何人都可以提供任何帮助吗?

【问题讨论】:

标签: android google-maps geocoding


【解决方案1】:

如果您仅限于使用 google Geocoding API,则可以使用代理服务(解决方案 #1)。

您的应用被拒绝,因为 google 无法仅使用 API 密钥知道是哪个应用发出请求。如果您查看可用的 API,有人说“for Android”和“for iOS”,这些是您可以限制和本地使用的 API。

使用代理会起作用(您的假设不会错),因为您可以将 API 密钥限制为服务的 IP,然后需要您的应用授权才能使用代理端点。这将保护您的 API 密钥不被盗用和滥用。

【讨论】:

  • 感谢您的解释。当您说使用代理时,您的意思是我们设置了一个服务器来接受来自我们应用程序的请求,然后使用我们的服务器密钥将它们“转发”到 Google?在这种情况下,我们的代理方案不能被滥用吗?例如,如果我们调用 www.our_server.com/geocode.php?... 它又使用我们的服务器密钥调用 Google API,那么有人不能使用 www.our_server.com/geocode.php... 吗?关于被拒绝的应用,如果将应用包名和SHA1添加到密钥限制中,为什么Google无法知道谁在使用该API?
  • 而且,我仍然无法理解为什么 Google 文档在常规 API KEY 解决方案不起作用时以 maps.googleapis.com/maps/api/geocode/… 形式提供示例。谁能解释一下?
  • @Athos.P 是的,您不必像我所做的那样设置精确的代理。我只是接受了一些论点,然后向谷歌请求返回他们的确切结果。您的 API 端点肯定会被滥用,保护它的唯一方法是添加授权,然后您可以找出哪个用户在滥用您的服务。关于被拒绝的应用程序,您正在发出 HTTP 请求,但仅提供 API 密钥,无法识别捆绑包。我可以通过我的 PC 发出您的应用程序发出的相同请求。
  • @Athos.P 我不确定我是否理解你的最后一个问题。
  • @Athos.P 我不确定你是否可以使用 HTTP api,我找不到任何信息。这就是问题所在,也是我建议代理的原因。
【解决方案2】:

根据您上面的评论,最快的方法是使用 Geocoder 对地址进行反向地理编码:

    if(Geocoder.isPresentt()){
        Geocoder geocoder = new Geocoder(this, Locale.getDefault());
        List<Address> addresses;


        addresses = geocoder.getFromLocationName(addressName, 3);
        for(Address address : addresses){
            Log.d(TAG,"Lat:" + address.getLatitude() +", Lng: " + address.getLongitude());
        }
    }

【讨论】:

  • 我不知道这一点。我已经接受了答案,即使这不是我的要求,因为现在它可能会做我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
相关资源
最近更新 更多