Геокодирование с адресом - проблема over_query_limit

Я использую API карт Google для создания маркеров на карте. Я создаю обычный маркер на основе широты / долготы. Если этого нет, я полагаюсь на физический адрес и его геокодирование. Если у меня более 50 адресов, я нахожусь в OVER_QUERY_LIMIT во время геокодирования. Я прочитал несколько сообщений, в которых предлагалось использовать таймер. Где я должен ввести таймер или задержку в таком сценарии?

РЕДАКТИРОВАТЬ: добавлен таймер, но он не работает. Через некоторое время браузер отключается.

Вот мой код:

$scope.loadMap = function(){
    $("#map").width(942).height(400);
    google.maps.event.trigger(map, "resize");
    var storeLatLng = new google.maps.LatLng(40.0000, -98.0000);
    var mapOptions = {
        zoom: 4,
        center: new google.maps.LatLng(40.0000, -98.0000),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    var bounds = new google.maps.LatLngBounds();
    if(!map){
        map = new google.maps.Map($('#map')[0], mapOptions);
    }
    else{
        map.setOptions(mapOptions);
    }   
    for (i = 0; i < $scope.addresses.length; i++) {
        var storeItem = $scope.addresses[i];

        if(storeItem.latitudeOrg && storeItem.longitudeOrg){
            $log.info("latlng for store:" + storeItem.city + ":" + storeItem.latitudeOrg +":"+storeItem.longitudeOrg);
            storeLatLng = new google.maps.LatLng(storeItem.latitudeOrg, storeItem.longitudeOrg);
            var marker1 = new google.maps.Marker({
                position: storeLatLng,
                map: map,
                title: storeItem.city
            });
        }
        else{ // Rely on physical address (city, state) if lat/lng is either empty or null
            var address = storeItem.address1 + "," + storeItem.city + "," + storeItem.state;
            $log.info("address for store:" +storeItem.id+":"+ ":" + address);
            var city = storeItem.city;
            var geocoder = new google.maps.Geocoder();
            geocoder.geocode({
                'address' : address
            }, function(results, status) {
                if ( status == google.maps.GeocoderStatus.OK ) {
                    var locality='';
                    var lat = results[0].geometry.location.lat();
                    var lng = results[0].geometry.location.lng();
                    for(var i=0; i<results[0].address_components.length; i++){
                        var component = results[0].address_components[i];
                        if(component.types[0] == 'locality'){
                            locality = component.long_name; 
                        }
                    }
                    storeLatLng = new google.maps.LatLng(lat, lng);
                    var marker2 = new google.maps.Marker({
                        position: storeLatLng,
                        map: map,
                        title: locality.toUpperCase()
                    });

                } else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                    $log.info("OVER_QUERY_LIMIT");
                    setTimeout(function() {
                        $scope.loadMarkers();
                    }, 100);
                } else {
                    $log.info("Geocode was not successful for the following reason:" + status);
                }
            });
        }
    }
}       

person Mustang    schedule 10.03.2016    source источник
comment
Геокодируйте их один раз и сохраняйте результаты   -  person charlietfl    schedule 10.03.2016
comment
Ознакомьтесь с условиями использования API геокодирования Карт Google можно использовать только вместе с картой Google; геокодирование результатов без отображения на карте запрещено.   -  person William Walseth    schedule 10.03.2016
comment
Ни кеширования, ни хранилища. Вы не будете выполнять предварительную выборку, кэшировать, индексировать или хранить какой-либо Контент для использования вне Сервиса, за исключением того, что вы можете хранить ограниченное количество Контента исключительно с целью повышения производительности вашей Реализации API Карт из-за задержки в сети (и не с целью помешать Google точно отслеживать использование), и только если такое хранилище:   -  person William Walseth    schedule 10.03.2016
comment
developers.google.com/maps/terms#10-license-restrictions   -  person William Walseth    schedule 10.03.2016
comment
@ Уильям - я не понимаю, о чем вы говорите? Я показываю геокодированный адрес на карте.   -  person Mustang    schedule 10.03.2016
comment
Платная лицензия необходима, если вы достигли предела бесплатного API, и любая попытка помешать Google отслеживать использование является нарушением их условий.   -  person William Walseth    schedule 10.03.2016
comment
@WilliamWalseth есть много ресурсов для геокодирования. Кроме того, хранение геокодов вряд ли будет выходить за рамки условий, и, конечно же, никто не сможет узнать, как вы их геокодировали в первую очередь.   -  person charlietfl    schedule 10.03.2016
comment
@charlietfl - хранение геокодов вряд ли будет выходить за рамки условий ... так почему в их Условиях есть целый раздел о том, что результаты геокодирования не сохраняются. Я предлагаю вам и вашему адвокату перечитать условия. В частности, раздел 10.5 D ..   -  person William Walseth    schedule 10.03.2016
comment
Если это связано с тем, что вы используете другой сервис, то для первоначального геокодирования   -  person charlietfl    schedule 10.03.2016
comment
@charlietfl - точно, многие другие сервисы гораздо менее строгие. Я рекомендую MapQuest, поскольку у них наименее строгие условия (я не связан с MapQuest или Google)   -  person William Walseth    schedule 10.03.2016


Ответы (1)


geocoder.geocode () работает асинхронно.

Это означает, что вы запрашиваете geocoder.geocode () 50 раз одновременно. Что происходит в вашем коде:

geocoder.geocode()  ---> Send a geocode request to Google (#1)
geocoder.geocode()  ---> Send a geocode request to Google (#2)
geocoder.geocode()  ---> Send a geocode request to Google (#3)
geocoder.geocode()  ---> Send a geocode request to Google (#4)
geocoder.geocode()  ---> Send a geocode request to Google (#5)

<--- response from Google for #1
geocoder.geocode()  ---> Send a geocode request to Google (#6)
geocoder.geocode()  ---> Send a geocode request to Google (#7)
<--- response from Google for #2
geocoder.geocode()  ---> Send a geocode request to Google (#8)
geocoder.geocode()  ---> Send a geocode request to Google (#9)
<--- response from Google for #3
geocoder.geocode()  ---> Send a geocode request to Google (#10)
geocoder.geocode()  ---> Send a geocode request to Google (#11)
<--- response from Google for #4 "OVER_QUERY_LIMIT"  
<--- response from Google for #5 "OVER_QUERY_LIMIT"  
<--- response from Google for #6 "OVER_QUERY_LIMIT"  
<--- response from Google for #7 "OVER_QUERY_LIMIT"  
<--- response from Google for #8 "OVER_QUERY_LIMIT"  
<--- response from Google for #9 "OVER_QUERY_LIMIT"  
<--- response from Google for #10 "OVER_QUERY_LIMIT"  
<--- response from Google for #11 "OVER_QUERY_LIMIT"  

Проблема в вашем коде здесь:

for (i = 0; i < $scope.addresses.length; i++) {
  ...
  var geocoder = new google.maps.Geocoder();
  geocoder.geocode({
    'address' : address
  }, function(results, status) {
    ...
  });
}

Вам следует подождать до запроса до.

var geocoder = new google.maps.Geocoder();
$scope.addresses
var looping = function(index) {

  var storeItem = $scope.addresses[index];
  var address = ...
  myGeocode(address, function(results, status) {
    ..
    index++;

    if (index < $scope.addresses.length) {
      looping(index, arguments.callee);
    }
  });
}
looping(0);

function myGeocode(address, callback) {
  var geocoder = new google.maps.Geocoder();
  geocoder.geocode({
    'address' : address
  }, callback);
}
person wf9a5m75    schedule 10.03.2016