如何在不收到OVER_QUERY_LIMIT响应的情况下对20个地址进行地理编码?

Mic*_*out 88 javascript google-maps geocoding

使用谷歌地理编码V3,如果我尝试地理编码20个地址,除非我次地为〜间隔1秒,我得到一个OVER_QUERY_LIMIT,但随后它需要20秒全部放在我的标记之前.

除了预先存储坐标之外,还有其他方法吗?

Pas*_*TIN 84

不,没有其他任何方式:如果您有许多位置并希望在地图上显示它们,最佳解决方案是:

  • 创建位置时,使用地理编码器获取纬度+经度
  • 将数据存储在数据库中,并与地址一起存储
  • 当您想要显示地图时,使用那些存储的纬度+经度.

当然,考虑到您创建/修改位置的次数比您对位置的咨询要少得多.


是的,这意味着在保存位置时你将不得不做更多的工作 - 但它也意味着:

  • 您将能够按地理坐标进行搜索
    • 即" 我想要一个靠近我现在所在位置的点列表 "
  • 显示地图会快得多
    • 即使有超过20个位置
  • 哦,而且,(最后但并非最不重要):这将工作;-)
    • 您将不太可能在N秒内达到X地理编码器调用的限制.
    • 并且您不太可能达到每天Y地理编码器呼叫的限制.

  • 如果地址*(您已在数据库中已经拥有 - 否则您将无法进行地理编码)*不会发生变化,那么纬度/经度可能会发生变化的可能性非常小.当然,每次修改地址时,都应该重新查询地理编码器,以获得与新地址对应的纬度+经度. (2认同)

gab*_*ess 20

实际上,您不必为每个请求等待一整秒.我发现如果我在每个请求之间等待200毫秒,我就可以避免OVER_QUERY_LIMIT响应并且用户体验可以通过.使用此解决方案,您可以在4秒内加载20个项目.

$(items).each(function(i, item){

  setTimeout(function(){

    geoLocate("my address", function(myLatlng){
      ...
    });

  }, 200 * i);

}
Run Code Online (Sandbox Code Playgroud)

  • setTimeout将执行一次.所以,如果我是正确的,(...,200*i)将安排每个呼叫分开200ms(如oyatek评论),这是gabeodess想要实现的.当前(...,200)将在200ms后同时执行所有这些操作.或者我错过了什么? (9认同)
  • 但是(200*i)意味着每个请求之间的暂停正在增加.所以在第3次要求它是600,然后是800等. (5认同)
  • @gabeodess我已经尝试了你的解决方案,但仍然得到OVER_QUERY_LIMIT [小提琴](http://jsfiddle.net/6476m9r0/) (3认同)

Zac*_*ght 6

不幸的是,这是Google地图服务的限制.

我目前正在使用地理编码功能处理应用程序,并且我将基于每个用户保存每个唯一地址.我根据谷歌地图返回的信息生成地址信息(城市,街道,州等),然后将纬度/经度信息保存在数据库中.这可以防止您不得不重新编码,并为您提供格式良好的地址.

您想要这样做的另一个原因是因为可以从特定IP地址进行地理编码的地址数量每日限制.出于这个原因,您不希望您的应用程序因某个人而失败.