2016-10-04 7 views
-1

Я пытаюсь геокодировать около 100 почтовых индексов из json-файла, перебирая почтовый индекс, однако меня ограничивает ошибка OVERY_QUERY_LIMIT после 11 почтовых индексов. Кажется, я использую геокодер слишком быстро в секунду. Я попытался включить setTimeout в него, но не могу заставить его работать. Как я могу замедлить процесс?Как задержать геокодирование google?

код

<head> 
    <meta charset="UTF-8"> 
    <title>heatmap test</title> 

    <style> 
     html { 
      height: 100% 
     } 

     body { 
      height: 100%; 
      margin: 0; 
      padding: 0; 
      font-family: sans-serif; 
     } 

     #map-canvas { 
      height: 100% 
     } 
    </style> 
</head> 

<body> 
    <div id="map-canvas"></div> 

    <script src="https://maps.googleapis.com/maps/api/js"></script> 
    <script src="assets/gmaps.js"></script> 
    <script> 
     document.addEventListener("DOMContentLoaded", function (event) { 

       var getPostcodes = function() { 

        //json link 
        var json = "http://localhost/addresses.json/"; 

        var request = new XMLHttpRequest(); 
        request.open('GET', json, true); 

        request.onload = function() { 
         if (request.status >= 200 && request.status < 400) { 
          // Success! 
          var data = JSON.parse(request.responseText); 

          //GET POSTCODES IN ARRAY 
          var postcodesArray = []; 
          for (var i = 0; i < data.length; i++) { 
           postcodesArray.push(data[i].from_postcode); 
          } 

          //filter all falsey values from array 
          var postcodes = postcodesArray.filter(Boolean); 

          //creating object for inserting data 
          var testData = { 
           data: [] 
          }; 

          //GET LAT/LONG POSITIONS 
          //for loop to create geocode object for each postcode 
          for (var n = 0; n < postcodes.length; n++) { 

           setTimeout(function(){ 

           GMaps.geocode({ 
            address: postcodes[n], 
            callback: function (results, status) { 
             if (status == google.maps.GeocoderStatus.OK) { 
              var location = results[0].geometry.location; 

              var latitude = parseFloat(location.lat().toFixed(8)), 
               longitude = parseFloat(location.lng().toFixed(8)); 

//           pushing lat and long data to object 
              testData.data.push({ 
               lat: latitude, 
               lng: longitude 
              }); 
             } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) { 
              console.log("error"); 
             } 

            } 

           }); 

           }, 500); 
          } 

          console.log(testData); 
         } 
         else { 
          console.log("failed"); 
         } 
        }; 
        request.onerror = function() { 
         // There was a connection error of some sort 
        }; 
        request.send(); 
       } 

       getPostcodes(); 

      }); 
    </script> 
</body> 
+0

Limis - 50 запросов в секунду, но ваша проблема заключается в том, что если это что-то предназначено для Интернета, несколько пользователей могут одновременно запускать этот код из своего браузера, и даже если вы ограничите это число на стороне клиента, никоим образом не ограничивать его для разных пользователей, поэтому большинство из них будут делать этот серверный сервер с очередью вместо этого. – adeneo

+0

ummm ... геокодировать их один раз и хранить данные? Не имеет смысла делать их каждый раз, когда загружается страница. – charlietfl

+0

Я делаю это, чтобы использовать lat/lng в тепловой карте, рекомендуется ли это делать на сервере? также где вы будете хранить данные? – Sai

ответ

1

SetTimeout просто задерживает код, и вы дали тайм-аут задержки набора.

Что происходит, все ваши функции ждут 500ms, а затем все сразу запускаются.

Что вы можете сделать, это иметь динамическую задержку примерно так:

... 

for (var n = postcodes.length; n--;) { 
    setTimeout(function(){ 
     GMaps.geocode({ 
      ... 
     }) 
    }, 500 * n); 
} 

.... 

или использовать setInterval, но приведенный выше код будет работать лучше. SetInterval будет иметь меньшее значение.

+0

На самом деле, поскольку геокодирование является асинхронным, рекурсивная функция имеет наибольший смысл. – adeneo

+1

Его проблема состоит в том, чтобы просто инициировать слишком много запросов в секунду, асинхронность в этом не играет никакой роли. –

+0

Он не заявил, что он хочет отправить запрос только после получения ответа –