2012-12-23 15 views
20

Używam Google Maps API do wyświetlania około 50 lokalizacji na mapie. Używam geokodowania po stronie klienta. Używam window.setTimeout do kontrolowania liczby żądań geocode, które aplikacja wysyła na sekundę. Jeśli wyślę więcej niż 1 żądanie na sekundę, otrzymuję odpowiedź OVER QUERY LIMIT.Google Maps API O PRZEKRACZA LIMITÓW na sekundę limit

Pytanie: Czy ten limit nie powinien wynosić 10 zapytań na sekundę? Jeśli tak, to co mogę zrobić źle? Jeśli nie, to czy interfejs API firmy ma więcej hojnych zapytań na sekundę?

Uwaga: nasza aplikacja nie trafi do 25 000 zapytań dziennie.

+0

Jak się odpytywanie serwera geokodowania? Pokaż trochę kodu. – keune

+0

Spójrz tutaj: http://stackoverflow.com/questions/16659398/google-maps-over-query-limit – user2403424

+0

Możliwy duplikat [powyżej \ _QUERY \ _LIMIT podczas korzystania z Google Maps] (http: // stackoverflow .com/questions/3529746/over-query-limit-while-using-google-maps) – xomena

Odpowiedz

25

Geokoder ma limity kwot i stawek. Z doświadczenia możesz geokodować ~ 10 lokalizacji bez trafiania w limit zapytań (rzeczywista liczba prawdopodobnie zależy od ładowania serwera). Najlepszym rozwiązaniem jest opóźnienie, gdy uzyskasz błędy OVER_QUERY_LIMIT, a następnie spróbuj ponownie. Zobacz te podobne posty:

+4

Dzięki geocodezip. Próbowałem opóźnić to za pomocą window.setTimeout, ale zadziałało to tylko z opóźnieniem 1 sekundy.Teraz zmieniłem kod, aby wysyłać zapytania geokodowe, dopóki nie otrzymam odpowiedzi OVER_QUERY_LIMIT. Potem zatrzymuję się na 3 sekundy, a następnie powtarzam. Ta strategia wydaje się rozwiązywać 50 żądań w około 26 sekund (zamiast 50 sekund). Jestem uszy, jeśli istnieje lepsza strategia. – user544192

4

Często, gdy trzeba pokazać tak wiele punktów na mapie, byłbyś lepiej używając po stronie serwera W tym artykule wyjaśniono, kiedy należy użyć każdego z nich:

Strategie geokodowania: https://developers.google.com/maps/articles/geocodestrat

Limit po stronie klienta nie jest dokładnie "10 żądań na sekundę", a ponieważ nie jest to wyjaśnione w dokumentach API, nie będę polegał na jego zachowaniu.

1

Takie podejście nie jest poprawne z powodu przeciążenia serwera Google. Aby uzyskać więcej informacji zobacz https://gis.stackexchange.com/questions/15052/how-to-avoid-google-map-geocode-limit#answer-15365


Przy okazji, jeśli chcesz i tak postępować, tutaj można znaleźć kod, który pozwoli Ci załadować wiele markerów ajax pozyskiwane na mapach google unikając OVER_QUERY_LIMIT błąd.

Testowałem na moim serwerze onw i działa!:

var lost_addresses = []; 
    geocode_count = 0; 
    resNumber = 0; 
    map = new GMaps({ 
     div: '#gmap_marker', 
     lat: 43.921493, 
     lng: 12.337646, 
    }); 

function loadMarkerTimeout(timeout) { 
    setTimeout(loadMarker, timeout) 
} 

function loadMarker() { 
    map.setZoom(6);   
    $.ajax({ 
      url: [Insert here your URL] , 
      type:'POST', 
      data: { 
       "action": "loadMarker" 
      }, 
      success:function(result){ 

       /*************************** 
       * Assuming your ajax call 
       * return something like: 
       * array(
       *  'status' => 'success', 
       *  'results'=> $resultsArray 
       * ); 
       **************************/ 

       var res=JSON.parse(result); 
       if(res.status == 'success') { 
        resNumber = res.results.length; 
        //Call the geoCoder function 
        getGeoCodeFor(map, res.results); 
       } 
      }//success 
    });//ajax 
};//loadMarker() 

$().ready(function(e) { 
    loadMarker(); 
}); 

//Geocoder function 
function getGeoCodeFor(maps, addresses) { 
     $.each(addresses, function(i,e){     
       GMaps.geocode({ 
        address: e.address, 
        callback: function(results, status) { 
          geocode_count++;   

          if (status == 'OK') {  

           //if the element is alreay in the array, remove it 
           lost_addresses = jQuery.grep(lost_addresses, function(value) { 
            return value != e; 
           }); 


           latlng = results[0].geometry.location; 
           map.addMarker({ 
             lat: latlng.lat(), 
             lng: latlng.lng(), 
             title: 'MyNewMarker', 
            });//addMarker 
          } else if (status == 'ZERO_RESULTS') { 
           //alert('Sorry, no results found'); 
          } else if(status == 'OVER_QUERY_LIMIT') { 

           //if the element is not in the losts_addresses array, add it! 
           if(jQuery.inArray(e,lost_addresses) == -1) { 
            lost_addresses.push(e); 
           } 

          } 

          if(geocode_count == addresses.length) { 
           //set counter == 0 so it wont's stop next round 
           geocode_count = 0; 

           setTimeout(function() { 
            getGeoCodeFor(maps, lost_addresses); 
           }, 2500); 
          } 
        }//callback 
       });//GeoCode 
     });//each 
};//getGeoCodeFor() 

Przykład:

map = new GMaps({ 
 
    div: '#gmap_marker', 
 
    lat: 43.921493, 
 
    lng: 12.337646, 
 
}); 
 

 
var jsonData = { 
 
    "status":"success", 
 
    "results":[ 
 
    { 
 
    "customerId":1, 
 
    "address":"Via Italia 43, Milano (MI)", 
 
    "customerName":"MyAwesomeCustomer1" 
 
    }, 
 
    { 
 
    "customerId":2, 
 
    "address":"Via Roma 10, Roma (RM)", 
 
    "customerName":"MyAwesomeCustomer2" 
 
    } 
 
    ] 
 
}; 
 
\t \t \t 
 
function loadMarkerTimeout(timeout) { 
 
    setTimeout(loadMarker, timeout) 
 
} 
 

 
function loadMarker() { \t 
 
    map.setZoom(6); 
 
    
 
    $.ajax({ 
 
    url: '/echo/html/', 
 
    type: "POST", 
 
    data: jsonData, 
 
    cache: false, 
 
    success:function(result){ 
 

 
     var res=JSON.parse(result); 
 
     if(res.status == 'success') { 
 
     resNumber = res.results.length; 
 
     //Call the geoCoder function 
 
     getGeoCodeFor(map, res.results); 
 
     } 
 
    }//success 
 
    });//ajax 
 
    
 
};//loadMarker() 
 

 
$().ready(function(e) { 
 
    loadMarker(); 
 
}); 
 

 
//Geocoder function 
 
function getGeoCodeFor(maps, addresses) { 
 
    $.each(addresses, function(i,e){ \t \t \t \t 
 
    GMaps.geocode({ 
 
     address: e.address, 
 
     callback: function(results, status) { 
 
     geocode_count++; \t \t 
 
     
 
     console.log('Id: '+e.customerId+' | Status: '+status); 
 
     
 
     if (status == 'OK') { \t \t 
 

 
      //if the element is alreay in the array, remove it 
 
      lost_addresses = jQuery.grep(lost_addresses, function(value) { 
 
      return value != e; 
 
      }); 
 

 

 
      latlng = results[0].geometry.location; 
 
      map.addMarker({ 
 
      lat: latlng.lat(), 
 
      lng: latlng.lng(), 
 
      title: e.customerName, 
 
      });//addMarker 
 
     } else if (status == 'ZERO_RESULTS') { 
 
      //alert('Sorry, no results found'); 
 
     } else if(status == 'OVER_QUERY_LIMIT') { 
 

 
      //if the element is not in the losts_addresses array, add it! 
 
      if(jQuery.inArray(e,lost_addresses) == -1) { 
 
      lost_addresses.push(e); 
 
      } 
 

 
     } 
 

 
     if(geocode_count == addresses.length) { 
 
      //set counter == 0 so it wont's stop next round 
 
      geocode_count = 0; 
 

 
      setTimeout(function() { 
 
      getGeoCodeFor(maps, lost_addresses); 
 
      }, 2500); 
 
     } 
 
     }//callback 
 
    });//GeoCode 
 
    });//each 
 
};//getGeoCodeFor()
#gmap_marker { 
 
    min-height:250px; 
 
    height:100%; 
 
    width:100%; 
 
    position: relative; 
 
    overflow: hidden; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<script src="http://maps.google.com/maps/api/js" type="text/javascript"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/gmaps.js/0.4.24/gmaps.min.js" type="text/javascript"></script> 
 

 

 
<div id="gmap_marker"></div> <!-- /#gmap_marker -->

0
Here I have loaded 2200 markers. It takes around 1 min to add 2200 locations. 
<https://jsfiddle.net/suchg/qm1pqunz/11/> 


Hope it would help you. 
+0

Hej, masz jakieś pomysły na pominięcie w przypadku INVALID_REQUEST? – hyperfkcb