API Google géocodage avec angulaire 4

voix
0

Nous avons une clé API Google Map achetée. Dans notre code angulaire, nous essayons d'utiliser « google.maps.Geocode (). Géocodage » qui utilise la bibliothèque angulaire agm / de base pour faire un géocodage inverse pour une liste de latitude / longitude. Dans une seconde, nous voulions envoyer environ 20-30 demandes afin que nous puissions obtenir la réponse valide et afficher l'adresse dans notre portail web. Mais nous obtenons l'erreur suivante: « OVER_QUERY_LIMIT » pour l'appel géocodage api.

Voici l'extrait de code pour le même:

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

Nous avons essayé la même chose en utilisant le script java et d'obtenir la même erreur. Je ne sais pas si nous avons besoin d'envoyer des paramètres supplémentaires pour éviter cette erreur. Je vous remercie si vous pouvez nous guider dans la résolution du problème.

Merci d'avance.

Créé 27/02/2018 à 22:01
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Merci de donner à la communauté une chance de vous aider. Maintenant, vous pouvez aborder ce problème de deux manières différentes. J'utilise les deux approches que l'on est destiné à vous empêcher d'atteindre votre limite QPS, et l'autre est de vous aider à gérer la situation lorsque vous êtes à « ce pont et vous êtes prêt à traverser », pour ainsi parler .

1) Vous pouvez potentiellement mettre en cache tous vos résultats comme permise par la norme ToS de Google.

Google Maps API Conditions d'utilisation indique que vous pouvez mettre en cache temporairement les données Google Maps, pour une période allant jusqu'à 30 jours, pour améliorer les performances de votre application. La mise en cache des réponses de service Web, votre application peut éviter d'envoyer des demandes en double sur de courtes périodes de temps. En fait, les réponses de service Web incluent toujours l'en-tête HTTP Cache-Control, qui indique la période pour laquelle vous pouvez mettre en cache l'exemple de résultat pour-, Cache-Control: public, max-age = 86400. Pour plus d'efficacité, assurez-vous de votre application met en cache toujours les résultats d'au moins la quantité de temps spécifié dans cet en-tête, mais pas plus que la durée maximale spécifiée dans les API Google Maps Conditions d'utilisation.

2) Vous pouvez accélérer votre demande en utilisant un délai d' attente et / ou demandes de gigue à des intervalles aléatoires entre les réponses comme décrit dans Google Docs , et un délai d' attente JS avec le code complet exemple ci - dessous, fourni par @ 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();
Créé 28/02/2018 à 00:36
source utilisateur

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