API de Google con Geocoder angular 4

votos
0

Tenemos una clave de API de Google Map comprado. En nuestro código angular, estamos tratando de utilizar google.maps.Geocode (). Geocode que utiliza la biblioteca angular / núcleo agm hacer una geocodificación inversa para obtener una lista de latitud / longitud. En un segundo, queríamos enviar alrededor de 20-30 peticiones para que podamos obtener la respuesta válida y mostrar la dirección en nuestro portal web. Pero nos estamos el siguiente error: OVER_QUERY_LIMIT para la llamada codificación geográfica del API.

Aquí está el fragmento de código para el mismo:

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

Probamos la misma utilizando la escritura de Java y conseguir el mismo error. No estoy seguro de si tenemos que enviar ningún parámetro adicional para evitar este error. Aprecio si nos puede guiar en la solución del problema.

Gracias por adelantado.

Publicado el 27/02/2018 a las 19:01
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Gracias por dar a la comunidad la oportunidad de ayudarle a cabo aquí. Ahora, se puede abordar este problema de dos maneras diferentes. Que haría uso de ambos enfoques como uno está destinado a evitar que lleguen a su límite de QPS, y el otro es para ayudarle a manejar la situación cuando se está en "ese puente y ya está listo para cruzarlo", por lo que a hablar .

1) Usted podría almacenar en caché todos los resultados de lo permitido por la Norma TOS de Google.

API de Google Maps Condiciones del servicio especifica que se puede almacenar en caché temporalmente datos de Google Maps, por un período de hasta 30 días, para mejorar el rendimiento de la aplicación. Al almacenar en caché las respuestas de servicio web, la aplicación puede evitar el envío de peticiones duplicadas en períodos cortos de tiempo. De hecho, las respuestas de servicios web siempre incluyen el encabezado HTTP Cache-Control, que indica el periodo para el que se puede almacenar en caché el resultado ejemplo-para, Cache-Control:, max-age = 86400 pública. Por eficiencia, asegurar su aplicación siempre almacena en caché los resultados de por lo menos la cantidad de tiempo especificado en esta cabecera, pero no más que el tiempo máximo especificado en los mapas de Google APIs Condiciones del servicio.

2) Se podría estrangular a su solicitud utilizando un tiempo de espera y / o solicitudes de fluctuación en intervalos aleatorios entre las respuestas como se describe en Google Docs , y un tiempo de espera de JS con el código de ejemplo completo a continuación, proporcionada por @ 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();
Respondida el 27/02/2018 a las 21:36
fuente por usuario

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