2012-12-23 4 views
20

Harita üzerinde yaklaşık 50 konum görüntülemek için Google Maps API kullanıyorum. İstemci tarafında coğrafi kodlama kullanıyorum. Uygulamanın saniye başına gönderdiği coğrafi kod istemi sayısını denetlemek için window.setTimeout kullanıyorum. Saniyede 1'den fazla istek gönderirsem, ÜST SINIRLI LIMIT yanıtı alıyorum.Google Maps API İkinci sınırda QUERY LIMIT OLARAK

Soru: Bu sınırın saniyede 10 sorgu olması gerekmez mi? Eğer evet ise, o zaman yanlış ne yapabilirdim? Hayır ise, İş API'sı ikinci sınır başına daha fazla sorgular içeriyor mu?

Uygulamamızın günde 25.000 sorguya çarpmayacağını lütfen unutmayın.

+0

nasıl coğrafi kodlama sunucusunu sorguluyorsunuz? Bazı kodları göster. – keune

+0

Buraya bak: http://stackoverflow.com/questions/16659398/google-maps-over-query-limit ait – user2403424

+0

Olası kopyalar [AŞIRI \ _QUERY \ _LIMIT google haritalar kullanırken] (http: // stackoverflow .com/questions/3529746/over-query-limit-while-using-google-haritalar) – xomena

cevap

25

Coğrafi kod kota ve oran sınırlarına sahiptir. Deneyimden, sorgu sınırına ulaşmadan ~ 10 konumunuzu coğrafi olarak kodlayabilirsiniz (gerçek sayı muhtemelen sunucu yüklemesine bağlıdır). En iyi çözüm, OVER_QUERY_LIMIT hatasını aldığınız zaman ertelemek, ardından tekrar denemektir. bu benzer mesajları bakınız:

+4

Teşekkürler geocodezip. Window.setTimeout kullanarak geciktirmeyi denedim, ancak sadece 1 saniyelik bir gecikmeyle çalıştı.Şimdi kodu değiştirdim, böylece bir OVER_QUERY_LIMIT yanıtı alana kadar geocode isteklerini yayınladım. Bundan sonra 3 saniye bekledikten sonra tekrarla. Bu strateji, 50 isteğin yaklaşık 26 saniyede (50 saniyeden daha uzun) çözülmesini sağlar. Daha iyi bir strateji varsa tüm kulaklarım. – user544192

4

harita üzerinde bu kadar çok noktalarını göstermek için gerektiğinde Genellikle, sunucu taraflı kullanarak daha iyi olurdu yaklaşım, bu makalede, her zaman ne zaman kullanılacağını açıklar:

Coğrafi Kodlama Stratejileri: https://developers.google.com/maps/articles/geocodestrat

İstemci tarafı sınırı tam olarak "saniyede 10 istek" değil ve API belgelerinde açıklanmadığı için davranışlarına güvenmem.

1

Bu yaklaşım, Google Sunucu Aşırı Yüklemesi'nin doğru bir kullanımı değildir. Yine de devam etmek istiyorsanız daha fazla bilgi almak için burada size ajax OVER_QUERY_LIMIT hata önleme google haritalarda kaynaklı çoklu işaretleri yüklemek izin bir kod bulabilirsiniz, arada https://gis.stackexchange.com/questions/15052/how-to-avoid-google-map-geocode-limit#answer-15365


görüyoruz.

Onw sunucumda test yaptım ve işe yarıyor!:

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() 

Örnek:

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

Hey, INVALID_REQUEST durumunda nasıl atlanacağınız konusunda bir fikriniz var mı? – hyperfkcb