Google Geocoder API с Угловыми 4

голоса
0

Мы купленный Google Map API ключ. В нашей угловой коде, мы пытаемся использовать «google.maps.Geocode (). Геокодировать», который использует AGM / ядро ​​угловой библиотеку, чтобы сделать обратное геокодирование для списка широты / долготы. Во втором, мы хотели бы отправить около 20-30 запросов, так что мы можем получить правильный ответ и отображать адрес в нашем веб-портале. Но мы получаем ошибку ниже: «OVER_QUERY_LIMIT» для геокодирования апи вызова.

Вот фрагмент кода для того же:

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

Мы пытались то же самое с помощью сценария Java и получить ту же ошибку. Я не уверен, что нам нужно послать какие-либо дополнительные параметры, чтобы избежать этой ошибки. Я ценю, если вы можете направлять нам в решении этой проблемы.

Заранее спасибо.

Задан 27/02/2018 в 22:01
источник пользователем
На других языках...                            


1 ответов

голоса
0

Спасибо за предоставление сообщества шанса, чтобы помочь вам здесь. Теперь, вы могли бы подойти к этой проблеме двумя различными способами. Я хотел бы использовать оба подход один предназначен, чтобы держать вас от достижения лимита КООТА, а другой, чтобы помочь вам справиться с ситуацией, когда вы находитесь на «мост и вы готовы пересечь его», так на выступление ,

1) Вы могли бы потенциально кэшировать все ваши результаты , как это разрешено Standard ToS Google.

API Карт Google Условия предоставления услуг определяет, что вы можете временно кэшировать данные Google Maps, на период до 30 дней, чтобы улучшить производительность вашего приложения. Кэшируя ответов веб-служб, ваше приложение может избежать отправки дублирующихся запросов на короткие периоды времени. На самом деле, ответы веб-службы всегда включают заголовок HTTP Cache-Control, который указывает период, в течение которого вы можете кэшировать результат, например, Cache-Control: общественность, макс возраста = 86400. Для повышения эффективности, обеспечить ваше приложение всегда кэширует результаты, по крайней мере, количество времени, указанного в этом заголовке, но не более максимального срока, указанного в Техническом API Карт Google обслуживания.

2) Вы можете душить ваш запрос с помощью тайм - аута и / или запросы джиттера через случайные промежутки между ответами , как описано в Google Docs , и JS таймаута при полном примере кода ниже, предоставленной @ Андрей Лич .

// 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();
Ответил 28/02/2018 в 00:36
источник пользователем

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