Google maps 超过查询限制的地理编码api

Google maps 超过查询限制的地理编码api,google-maps,geocoding,Google Maps,Geocoding,我在服务器端使用地理编码API来翻译latlng中的地址。 我面临着超限状态,尽管: -服务器没有超过2500个限制(这一天只有几个请求) -它没有同时执行多个请求(一次只执行一个请求) 这怎么可能?第二天,地理编码工作正常,但我担心我的应用程序从长远来看能否正常工作 提前感谢。我们也遇到了这个问题,解决办法是放弃谷歌的API。如果您所需要的只是地理编码,那么有许多替代方案同样有效,没有限制。我们选择了mapquest API。它更快更可靠,没有地理编码调用的上限,而且我真的很喜欢他们的API,

我在服务器端使用地理编码API来翻译latlng中的地址。 我面临着超限状态,尽管: -服务器没有超过2500个限制(这一天只有几个请求) -它没有同时执行多个请求(一次只执行一个请求)

这怎么可能?第二天,地理编码工作正常,但我担心我的应用程序从长远来看能否正常工作


提前感谢。

我们也遇到了这个问题,解决办法是放弃谷歌的API。如果您所需要的只是地理编码,那么有许多替代方案同样有效,没有限制。我们选择了mapquest API。它更快更可靠,没有地理编码调用的上限,而且我真的很喜欢他们的API,它可以将地理编码请求批处理成单个调用

如果您需要其他功能,显然您必须考虑这些功能,但是对于单个功能,使用块上最大的API不一定是最佳选择


developer.mapquest.com

这就是我过去处理这个问题的方式。我检查结果状态,如果我得到并超过极限错误,我会在稍微延迟后重试

function Geocode(address) {
    geocoder.geocode({
        'address': address
    }, function(results, status) {
        if (status === google.maps.GeocoderStatus.OK) {
            var result = results[0].geometry.location;
            var marker = new google.maps.Marker({
                position: result,
                map: map
            });
        } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {    
            setTimeout(function() {
                Geocode(address);
            }, 200);
        } else {
            alert("Geocode was not successful for the following reason:" 
                  + status);
        }
    });
}
更新:哎哟,服务器端部分被意外遮住了。这是一个C版本:


您还可以在客户端进行地理编码。这里比较一下客户端和服务器端的做法。

谷歌、必应、MapQuest和雅虎!地图(这个API还在吗?)是非常强大的工具。他们在解释您提供的地址以及尽一切可能将其转换为正确格式的地址以进行地理编码方面投入了大量精力。在某种程度上,他们是自由的。他们有数量限制和非常严格的服务条款(TOS),如果您开始商业化使用他们的服务,特别是如果您将其集成到其他产品中,这可能是一个因素

请记住,它们都是“地址近似”,而不是地址验证。如果某个地址存在,他们将能够告诉您该地址在某条街上的大致位置。他们不能告诉你你要找的地址存在。验证这一点的一种方法是在谷歌地图中查看您自己的地址。一直放大到街景,你会看到他们说“地址是近似的”,即使他们可能精确地定位了位置。他们只是没有地址的主列表来比较,并且不知道哪些地址是真实的。为此,您需要某种地址验证

地址验证以与免费映射服务大致相同的方式对给定地址进行标准化和清理,但它还将地址与USPS可交付地址数据库进行比较,以确认地址是否确实存在。然后,可以更精确地对确认的地址进行地理编码


有很多很好的地址验证服务。为了充分披露,我是one的创始人。

如果没有找到匹配的地址,Google也会返回相同的响应。这并不一定意味着你已经超过了配额。在任何情况下,您最好捕获异常并对其实施救援。

这里的问题与用户276648相同。通过添加API密钥并将http更改为https解决了这个问题。

读过这篇文章后,我的第一个倾向是放弃谷歌地图,转而使用Mapquest。但是Mapquest还要多久才能实现速率限制呢?转换成本是巨大的。事实上,遗憾的是,mapquest已经实施了费率限制。是谷歌的两倍,但它确实存在。对我的答案的一个更新是分叉我的代码(尽管以一种很好的封装方式),这样在iOS 5上我使用苹果的地理编码API,而对于所有较旧的iOS版本,我使用mapquest。这是非常有效的,因为使用旧iOS版本的设备的百分比每天都在下降,我们很少再达到Mapquests每日限制(尽管它确实发生了,所以我们有一个优雅的回退)。当然,这只对iOS有帮助。其他平台仍然需要一个解决方案:(感谢js代码。通过重试设置延迟效果很好。关于C#解决方案的某些内容我很感兴趣。它会向调用者返回一个XElement。但是,如果
GetGeocodingSearchResults()第二次调用
,忽略结果。如果将行更改为读取,则返回GetGeocodingSearchResults(地址)您可能会使堆栈溢出。另一种解决方案是在循环中运行此代码,直到成功或预定数量的失败。还应该注意,虽然这会限制请求速率,但您仍然需要担心每日限制。我使用了相同的解决方案,但由于错误,警报会不断弹出浏览器接收从API生成警报。设置延迟起作用,但会增加加载映射时间:-(对于3G用户,当他们使用WiFi时,我们得到了相同的OVER_QUERY_LIMIT错误。3G的问题是,据我所知,大部分时间都在使用NAT,因此来自同一提供商的所有用户可能最终拥有相同的公共地址,因此该IP地址很容易超过限制。对于3G用户,情况并非如此你得到了一个有效的回答,结果为零。没有否决票,因为你可能对V2发表了评论,我不知道结果是什么。
public XElement GetGeocodingSearchResults(string address)
{
    var url = String.Format(
         "https://maps.google.com/maps/api/geocode/xml?address={0}&sensor=false",
          Uri.EscapeDataString(address)); 

    var results = XElement.Load(url); 

    // Check the status
    var status = results.Element("status").Value;

    if(status == "OVER_QUERY_LIMIT")
    {
        Thread.Sleep(200);
        GetGeocodingSearchResults(address);
    }else if(status != "OK" && status != "ZERO_RESULTS")
    {
        // Whoops, something else was wrong with the request...     
    }

    return results;
}