Javascript 我如何对20个地址进行地理编码,而不收到超限查询响应?

Javascript 我如何对20个地址进行地理编码,而不收到超限查询响应?,javascript,geocoding,google-maps,Javascript,Geocoding,Google Maps,使用Google Geocoder v3,如果我尝试对20个地址进行地理编码,我会得到一个超过查询限制的地址,除非我将它们的时间间隔定为~1秒,但在我的标记全部放置之前需要20秒 除了提前存储坐标,还有其他方法吗?没有,实际上没有其他方法:如果您有许多位置,并且希望在地图上显示它们,最好的解决方案是: 创建位置时,使用地理编码器获取纬度+经度 将这些存储在数据库中,与地址一起存储 当您想要显示地图时,请使用存储的纬度+经度 当然,这是考虑到您的位置创建/修改要比您的位置咨询少得多 是的,这

使用Google Geocoder v3,如果我尝试对20个地址进行地理编码,我会得到一个超过查询限制的地址,除非我将它们的时间间隔定为~1秒,但在我的标记全部放置之前需要20秒


除了提前存储坐标,还有其他方法吗?

没有,实际上没有其他方法:如果您有许多位置,并且希望在地图上显示它们,最好的解决方案是:

  • 创建位置时,使用地理编码器获取纬度+经度
  • 将这些存储在数据库中,与地址一起存储
  • 当您想要显示地图时,请使用存储的纬度+经度
当然,这是考虑到您的位置创建/修改要比您的位置咨询少得多


是的,这意味着在保存位置时需要做更多的工作,但也意味着:

  • 你可以通过地理坐标进行搜索
    • i、 e.“我想要一份靠近我现在所在位置的点列表”
  • 显示地图会快得多
    • 即使上面有20多个位置
  • 哦,还有(最后但并非最不重要的):这会起作用;-)
    • 您不太可能在N秒内达到X geocoder调用的限制
    • 而且你也不太可能达到Y地理编码器每天通话的上限

    • 不幸的是,这是对谷歌地图服务的限制

      我目前正在使用地理编码功能开发一个应用程序,我正在按每个用户保存每个唯一的地址。我根据谷歌地图返回的信息生成地址信息(城市、街道、州等),然后将lat/long信息也保存在数据库中。这样可以避免重新编码,并提供格式良好的地址


      您希望这样做的另一个原因是,可以从特定IP地址进行地理编码的地址数量每天都有限制。你不希望你的应用程序因为这个原因而失败。

      我在尝试对140个地址进行地理编码时也面临同样的问题

      我的解决方法是为下一个地理编码请求的每个循环添加usleep(100000)。如果请求的状态超过查询限制,则usleep将增加50000,并重复请求,依此类推


      当然,所有接收到的数据(lat/long)都存储在XML文件中,不会在每次加载页面时运行请求。

      我刚刚测试了Google Geocoder,遇到了与您相同的问题。 我注意到每12个请求我只会得到一次OVER_QUERY_LIMIT状态 所以我等待了1秒(这是等待的最小延迟) 它会降低应用程序的速度,但每次请求的等待时间不到1秒

      info = getInfos(getLatLng(code)); //In here I call Google API
      record(code, info);
      generated++; 
      if(generated%interval == 0) {
      holdOn(delay); // Every x requests, I sleep for 1 second
      }
      
      使用基本保持方法:

      private void holdOn(long delay) {
              try {
                  Thread.sleep(delay);
              } catch (InterruptedException ex) {
                  // ignore
              }
          }
      

      希望它能有所帮助

      您实际上不必为每个请求等待整整一秒钟。我发现,如果我在每个请求之间等待200毫秒,我就能够避免超过查询限制的响应,用户体验也可以。使用此解决方案,您可以在4秒内加载20个项目

      $(items).each(function(i, item){
      
        setTimeout(function(){
      
          geoLocate("my address", function(myLatlng){
            ...
          });
      
        }, 200 * i);
      
      }
      
      编辑:

      忘了说这个解决方案是纯js的,你只需要一个支持承诺的浏览器


      对于那些仍然需要完成这些任务的人,我已经编写了自己的解决方案,将承诺与超时结合起来

      代码:

      控制台输出:

      Attempting the resolution of Georgia
      Attempting the resolution of China
      Attempting the resolution of Dragons are thugs...
      Attempting the resolution of California
      ZERO_RESULTS
      could not locate Dragons are thugs...
      Attempting the resolution of Italy
      
      返回的对象:

      整个魔法发生在这里:

      (function loopWithDelay(such, queue, i){
                          console.log("Attempting the resolution of " +queue[i-1]);
                          setTimeout(function(){
                              such.find(queue[i-1], function(res){
                                 such.resolved.push(res); 
                              });
                              if (--i) {
                                  loopWithDelay(such,queue,i);
                          }
                      }, 750);
                  })(that, that.queue, that.queue.length);
      
      基本上,它循环每个项目,每个项目之间的延迟为750毫秒,因此每750毫秒控制一个地址

      我做了一些进一步的测试,发现即使在700毫秒时,我有时也会遇到查询限制错误,而在750毫秒时,我根本没有任何问题

      在任何情况下,如果您觉得处理较低延迟是安全的,请随意编辑上面的750


      希望这在不久的将来对某人有所帮助;)

      我很好奇,经过一段时间(比如说,一个月)后,你如何才能确保结果是正确的。您是否每隔一段时间重新查询一次?如果地址(您在数据库中已有的地址,否则您将无法进行地理编码)没有改变,那么纬度/经度发生变化的可能性非常小。当然,每次修改地址时,您都应该重新查询地理编码器,以获得与新地址相对应的纬度+经度。我已经将lat/long存储到数据库中,并通过AJAX将其作为数组从数据库中检索,但它应该再次传递到java脚本循环,而且我还从数据库中接收到173个位置。现在,它向我显示了相同的超限状态。请告诉我…情况还是这样吗?我在文档中看到的唯一限制是:“每天查询2500个地理位置请求的限制”。这不是每个用户每天的查询总量,而是短时间内的查询数量,就像在循环中查询一样。我们的商店有营业执照,但我们仍然遇到每秒无法处理10个以上请求的问题。营业执照和普通开发人员之间的唯一区别在于,我们每天的通话限制是100000次。@michielvoo你解决了这个问题吗?如果是,那么请帮助我。我快超过极限了。在这样的情况下。但是(200*i)意味着每个请求之间的暂停在增加。所以在第三次请求时,它是600,然后是800等等。只要删除“*i”setTimeout,它就会执行一次。因此,如果我是正确的,(…,200*I)将安排每个通话间隔200ms(正如oyatek所评论的),这正是gabeodess想要实现的。电流(…,200)将在200毫秒后同时执行所有这些操作。还是我遗漏了什么?@gabeodess-您应该对所需请求的数量执行
      setInterval
      ,而不是
      setTimeout
      ,并将其设置为
      10
      
      Attempting the resolution of Georgia
      Attempting the resolution of China
      Attempting the resolution of Dragons are thugs...
      Attempting the resolution of California
      ZERO_RESULTS
      could not locate Dragons are thugs...
      Attempting the resolution of Italy
      
      (function loopWithDelay(such, queue, i){
                          console.log("Attempting the resolution of " +queue[i-1]);
                          setTimeout(function(){
                              such.find(queue[i-1], function(res){
                                 such.resolved.push(res); 
                              });
                              if (--i) {
                                  loopWithDelay(such,queue,i);
                          }
                      }, 750);
                  })(that, that.queue, that.queue.length);