Google Geocoder API met hoekige 4

stemmen
0

We hebben een gekochte Google Map API-sleutel. In onze Angular code, proberen we gebruik google.maps.Geocode (). Geocoderen dat gebruik maakt van AGM / kern hoekige bibliotheek om een ​​reverse geocoding doen voor een lijst van lengte / breedte. In een tweede, wilden we sturen ongeveer 20-30 verzoeken, zodat we de geldig antwoord kan krijgen en het adres in onze web portal weer te geven. Maar we krijgen de volgende foutmelding: OVER_QUERY_LIMIT voor geocode api call.

Hier is de code snippet voor hetzelfde:

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);
       }
    });
}});

We hebben geprobeerd hetzelfde met behulp van de java script en het krijgen van de zelfde fout. Ik ben niet zeker of we behoefte aan een extra parameters te sturen om deze fout te vermijden. Ik waardeer het als u ons kan begeleiden bij het oplossen van het probleem.

Bij voorbaat dank.

De vraag is gesteld op 27/02/2018 om 22:01
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Bedankt voor het geven van de gemeenschap een kans om u te helpen hier. Nu, kun je dit probleem aan te pakken op twee verschillende manieren. Ik zou beide benaderingen te gebruiken als één is bedoeld om u te houden van het bereiken van uw QPS te beperken, en de andere is om u te helpen de situatie te beheren wanneer u bij "die brug en u bent klaar om het over te steken zijn", zo-to-spreken .

1) Je kan mogelijk de cache al uw resultaten als toegestaan door Google standaard ToS.

Google Maps API's Dienst geeft aan dat u tijdelijk kunt de cache van Google Maps-gegevens, voor een periode van maximaal 30 dagen, om de prestaties van uw aanvraag verbeteren. Door caching webservice reacties, kan uw aanvraag te voorkomen verzenden dubbele verzoeken over korte perioden. In feite, webservice reacties omvatten altijd de Cache-Control HTTP-header, die de periode waarvoor kunt u het resultaat, bijvoorbeeld Cache-Control cachen aangeeft: openbaar, max-age = 86400. Voor efficiency, zorgen ervoor dat uw aanvraag altijd caches resultaten voor ten minste de hoeveelheid tijd die in deze header, maar niet meer dan de maximale tijd die in de Google Maps API's Terms of Service.

2) Je zou kunnen wurgen uw verzoek met behulp van een time-out en / of jitter verzoeken op willekeurige tijdstippen tussen de reacties, zoals beschreven in Google Docs , en een JS Timeout met de volledige steekproef onderstaande code, die door @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();
antwoordde op 28/02/2018 om 00:36
bron van user

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