Google API z geocoder kątowe 4

głosy
0

Mamy zakupiony klucz API Map Google. W naszej Kątowymi kodu, staramy się wykorzystywać „google.maps.Geocode (). Geokodując”, który wykorzystuje AGM / core kątową bibliotekę zrobić odwrotny geokodowanie do listy szerokości / długości geograficznej. W drugim, chcieliśmy wysłać około 20-30 wniosków, dzięki czemu możemy uzyskać prawidłową odpowiedź i wyświetlić adres w naszym portalu. Ale jesteśmy coraz poniższy błąd: „OVER_QUERY_LIMIT” dla połączenia geocode API.

Oto fragment kodu dla tego samego:

return Observable.create((observer: Observer<object>) => {
if (geocoder) {
       new google.maps.Geocoder().geocode({ 'location': latlng }, function (results, status) {
       console.log(status);
       if (status === 'OK') {
           console.log(results[0].formatted_address);
       }
    });
}});

Próbowaliśmy to samo przy użyciu skryptu java i otrzymuję ten sam błąd. Nie jestem pewien, czy trzeba wysyłać żadnych dodatkowych parametrów, aby uniknąć tego błędu. Doceniam, czy można prowadzić nas w rozwiązaniu tego problemu.

Z góry dziękuję.

Utwórz 27/02/2018 o 22:01
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Dzięki za udzielenie Wspólnocie szansę pomóc tutaj. Teraz, można podejść do tego problemu na dwa różne sposoby. Chciałbym użyć obu podejść jak jeden ma uniemożliwiają osiągnięcie limitu QPS, a drugi jest pomóc Ci zarządzać sytuacji, gdy jesteś na „moście i jesteś gotowy, aby go przekroczyć”, tak aby zabrać głos ,

1) Można potencjalnie buforować wszystkich wyników dozwolonym przez Google standardowa TOS.

Google Maps API Warunki korzystania z usług określa, że ​​można tymczasowo buforować dane Google Maps, na okres do 30 dni, w celu zwiększenia wydajności aplikacji. Poprzez buforowanie odpowiedzi serwis internetowy, aplikacja może uniknąć wysyłania żądań zduplikowanych w krótkich okresach czasu. W rzeczywistości, reakcje usług internetowych zawsze zawierać nagłówek HTTP Cache-Control, który wskazuje okres, w którym można buforować Przykładowy wynik-for, Cache-Control: public, max-age = 86400. Dla zwiększenia efektywności zapewnić aplikacja zawsze buforuje wyniki co najmniej przez czas określony w tym cel, ale nie więcej niż maksymalny czas określony w Google Maps API Warunki korzystania z usługi.

2) Można udusić swoją prośbę używając timeout i / lub żądania jittera w losowych odstępach czasu między odpowiedziami, jak opisano w Dokumentach Google , a także JS Timeout przy pełnym przykładowy kod poniżej, dostarczone przez @Andrew Leach .

// delay between geocode requests - at the time of writing, 100 miliseconds seems to work well
var delay = 100;


  // ====== Create map objects ======
  var infowindow = new google.maps.InfoWindow();
  var latlng = new google.maps.LatLng(-34.397, 150.644);
  var mapOptions = {
    zoom: 8,
    center: latlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var geo = new google.maps.Geocoder(); 
  var map = new google.maps.Map(document.getElementById("map"), mapOptions);
  var bounds = new google.maps.LatLngBounds();

  // ====== Geocoding ======
  function getAddress(search, next) {
    geo.geocode({address:search}, function (results,status)
      { 
        // If that was successful
        if (status == google.maps.GeocoderStatus.OK) {
          // Lets assume that the first marker is the one we want
          var p = results[0].geometry.location;
          var lat=p.lat();
          var lng=p.lng();
          // Output the data
            var msg = 'address="' + search + '" lat=' +lat+ ' lng=' +lng+ '(delay='+delay+'ms)<br>';
            document.getElementById("messages").innerHTML += msg;
          // Create a marker
          createMarker(search,lat,lng);
        }
        // ====== Decode the error status ======
        else {
          // === if we were sending the requests to fast, try this one again and increase the delay
          if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
            nextAddress--;
            delay++;
          } else {
            var reason="Code "+status;
            var msg = 'address="' + search + '" error=' +reason+ '(delay='+delay+'ms)<br>';
            document.getElementById("messages").innerHTML += msg;
          }   
        }
        next();
      }
    );
  }

       // ======= Function to create a marker
 function createMarker(add,lat,lng) {
   var contentString = add;
   var marker = new google.maps.Marker({
     position: new google.maps.LatLng(lat,lng),
     map: map,
     zIndex: Math.round(latlng.lat()*-100000)<<5
   });

  google.maps.event.addListener(marker, 'click', function() {
     infowindow.setContent(contentString); 
     infowindow.open(map,marker);
   });

   bounds.extend(marker.position);

 }

  // ======= An array of locations that we want to Geocode ========
  var addresses = [
           '251 Pantigo Road Hampton Bays NY 11946',
           'Amagensett Quiogue NY 11978',
           '789 Main Street Hampton Bays NY 11946',
           '30 Abrahams Path Hampton Bays NY 11946',
           '3 Winnebogue Ln Westhampton NY 11977',
           '44 White Oak Lane Montauk NY 11954',
           '107 stoney hill road Bridgehampton NY 11932',
           '250 Pantigo Rd Hampton Bays NY 11946',
           '250 Pantigo Rd Hampton Bays NY 11946',
           '44 Woodruff Lane Wainscott NY 11975',
           'Address East Hampton NY 11937',
           'Address Amagansett NY 11930',
           'Address Remsenburg NY 11960 ',
           'Address Westhampton NY 11977',
           'prop address Westhampton Dunes NY 11978',
           'prop address East Hampton NY 11937',
           'Address East Hampton NY 11937',
           'Address Southampton NY 11968',
           'Address Bridgehampton NY 11932',
           'Address Sagaponack NY 11962',
            "A totally bogus address"
  ];

  // ======= Global variable to remind us what to do next
  var nextAddress = 0;

  // ======= Function to call the next Geocode operation when the reply comes back

  function theNext() {
    if (nextAddress < addresses.length) {
      setTimeout('getAddress("'+addresses[nextAddress]+'",theNext)', delay);
      nextAddress++;
    } else {
      // We're done. Show map bounds
      map.fitBounds(bounds);
    }
  }

  // ======= Call that function for the first time =======
  theNext();
Odpowiedział 28/02/2018 o 00:36
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more