Уникати обмеження геокодування Google Maps?


32

Я створюю власну карту google, на якій розміщено 125 маркерів за допомогою cms. Під час завантаження карти я отримую це повідомлення:

Геокод не вдався з наступної причини: OVER_QUERY_LIMIT

Я майже впевнений, що це геокодування маркерів.

Як я можу уникнути цих попереджень і чи існує більш ефективний спосіб геокодування результатів?

ОНОВЛЕННЯ: Це моя спроба відповіді Кейсі, на даний момент я просто отримую порожню сторінку.

<script type="text/javascript"> 
(function() { 

window.onload = function() { 
 var mc;
// Creating an object literal containing the properties we want to pass to the map 
var options = { 
zoom: 10, 
center: new google.maps.LatLng(52.40, -3.61), 
mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 

// Creating the map 
var map = new google.maps.Map(document.getElementById('map'), options); 

// Creating a LatLngBounds object 
var bounds = new google.maps.LatLngBounds(); 

// Creating an array that will contain the addresses 
var places = []; 

// Creating a variable that will hold the InfoWindow object 
var infowindow; 
mc = new MarkerClusterer(map);
<?php
$pages = get_pages(array('child_of' => $post->ID, 'sort_column' => 'menu_order'));
$popup_content = array();
foreach($pages as $post)
    {
    setup_postdata($post);
    $fields = get_fields(); 
    $popup_content[] = '<p>'.$fields->company_name.'</p><img src="'.$fields->company_logo.'" /><br /><br /><a href="'.get_page_link($post->ID).'">View profile</a>';
    $comma = ", ";
    $full_address = "{$fields->address_line_1}{$comma}{$fields->address_line_2}{$comma}{$fields->address_line_3}{$comma}{$fields->post_code}";
    $address[] = $full_address;
    }
wp_reset_query();
echo 'var popup_content = ' . json_encode($popup_content) . ';';
echo 'var address = ' . json_encode($address) . ';';
?>

var geocoder = new google.maps.Geocoder(); 

var markers = [];

// Adding a LatLng object for each city  
for (var i = 0; i < address.length; i++) { 
    (function(i) { 
        geocoder.geocode( {'address': address[i]}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                places[i] = results[0].geometry.location;

                // Adding the markers 
                var marker = new google.maps.Marker({position: places[i], map: map});
                markers.push(marker);
                mc.addMarker(marker);

                // Creating the event listener. It now has access to the values of i and marker as they were during its creation
                google.maps.event.addListener(marker, 'click', function() {
                    // Check to see if we already have an InfoWindow
                    if (!infowindow) {
                        infowindow = new google.maps.InfoWindow();
                    }

                    // Setting the content of the InfoWindow
                    infowindow.setContent(popup_content[i]);

                    // Tying the InfoWindow to the marker 
                    infowindow.open(map, marker);
                });

                // Extending the bounds object with each LatLng 
                bounds.extend(places[i]); 

                // Adjusting the map to new bounding box 
                map.fitBounds(bounds) 
            } else { 
            alert("Geocode was not successful for the following reason: " + status); 
            }

        });

    })(i);

} 
var markerCluster = new MarkerClusterer(map, markers); 
} 
})
(); 
</script> 

Не важливо, яке рішення до тих пір, поки маркери завантажуються миттєво, і це не порушує жодних умов та умов.


Ви не говорите, чому або як часто ви робите ці пошуки. Ви не намагаєтеся геокодувати ті ж самі точки, що кожна сторінка відображається? У такому випадку вам слід поглянути на використання api, щоб зробити ці сторони сервера пошуку лише один раз, коли місце вперше додається до бази даних.
Пітер

Якщо ви хочете спробувати @ поради Петра, є простий інструмент тут , який геокодіровать точки в таблиці Google. Це дозволить вам записати lat / long для міст у CMS, тому вам не потрібно використовувати геокодер під час виконання.
Стівен Ведучий

@Peter Насправді це звучить як чудова ідея. Я трохи розірваний, оскільки це зменшить юзабіліті моїх копійок. Якщо клієнтові доводиться знаходити лат / довго в компанії, а не просто вводити адресу, то це не дуже зручно для користувачів. Я правильно це розумію?
Роб

Дивіться мою нову відповідь внизу вниз щодо функції php.
Петро

2
@rob FWIW Я думаю, що Рагі має правильний підхід. Відповідь Кейсі все-таки вимагає геокодування кожної точки, кожного разу, коли карта малюється, що, здається, не є необхідним для вашого статичного набору даних
Stephen Lead

Відповіді:


57

Як і всі, я міг би дати вам відповідь з кодом, але я не думаю, що хтось вам пояснив, що ви робите щось, що в корені неправильно .

Чому ви стикаєтеся з цією помилкою? Тому що ви телефонуєте геокоду кожного разу, коли хтось переглядає вашу сторінку, і ви не кешуєте свої результати де-небудь в точці!

Причина цього обмеження полягає в тому, щоб запобігти зловживанням ресурсами Google (будь то добровільно чи небажання) - саме це ви робите :)

Хоча геокод google швидкий, якби всі користувалися ним так, він би знищив їхні сервери. Причина існування Google Fusion Tables - це зробити багато важких підйомів на стороні сервера. Геокодування та кешування плиток виконується на їх серверах. Якщо ви не хочете цим користуватися, то слід кешувати їх на своєму сервері.

Якщо все-таки 2500 запитів на день - це занадто мало, тоді ви повинні подивитися на платну ліцензію Google Maps Premier (платну), яка дає вам 100 000 запитів на геокодування в день протягом приблизно 10 к на рік (це багато - з кешування на стороні сервера ви повинні не досягаєте цієї межі, якщо ви не є величезним сайтом або не обробляєте важкі дані). Без кешування на стороні сервера та з використанням поточного підходу ви зможете робити лише 800 переглядів сторінок на день!

Як тільки ви зрозумієте, що інші провайдери стягують плату за геокод , ви зрозумієте, що слід кешувати результати в db. При такому підході це коштуватиме вам приблизно 10 центів США за перегляд сторінки!

Ваше запитання полягає в тому, чи можете ви подолати обмеження, яке надає вам газ? Звичайно. Просто зробіть запит з різних ip-адрес. Чорт забирай, ти можеш проксі-дзвінки проходити через еластичні ips Amazon і завжди матимеш нові свіжі 2500 відведених дзвінків. Але звичайно, окрім незаконного (ви фактично обходите обмеження, надані вам умовами використання Карт Google), ви б робили хакер, щоб покрити притаманний вад дизайну у вашій системі.

То який правильний шлях для цього випадку використання? Перш ніж зателефонувати в геокопію google api, надішліть її на свій сервер і запитайте, чи є він у вашому кеші. Якщо це не так, зателефонуйте в геокод, збережіть його у своєму кеші та поверніть результат.

Є й інші підходи, але це повинно розпочати роботу в правильному напрямку.

Оновлення. З ваших коментарів нижче сказано, що ви використовуєте PHP, тому ось приклад коду про те, як це зробити правильно (рекомендація від самої команди Google) https://developers.google.com/maps/articles/phpsqlsearch_v3


У вас є приклад, за яким я можу наслідувати його надсилання на сервер тощо?
Роб

Яка ваша CMS? (Я припускаю, що ви можете / знаєте, як це змінити, і просто хочете простий приклад, який показує, як це зробити на вашій вибраній мові. Вам не потрібен приклад клієнтської сторони js, чи ви? Ви використовуєте будь-який js фреймворк, як jquery?
Рагі Ясер Бурхум

Також вам потрібно буде дати більше контексту про те, як дані маркера потрапляють у вашу систему в першу чергу
Рагі Ясер Бурхум

1
ДОБРЕ. Php тоді. Цей біт із Документації Google повинен містити mysql та php part code.google.com/apis/maps/articles/phpsqlgeocode.html
Рагі Ясер Бурхум

1
Дивіться 10.1.3 (b) для детальної інформації про те, які види кешування дозволені. developers.google.com/maps/terms#section_10_12
Пол Рамзі

14

Я думаю, що Саса має рацію в обох аспектах.

Що стосується надсилання одразу всіх ваших адрес, одним із варіантів є надсилання запитів з інтервалом. Раніше під час використання JavaScript я вирішив затримати запити на 0,25 секунди (здається, працює!) За допомогою

setTimeout( [FUNCTION CALL] , 250 )

метод.

У .NET я вибрав:

System.Threading.Thread.Sleep(250);

Здається, працює.

EDIT: Cant дійсно перевірить це, але це повинно / може працювати!

Приклад Javascript. AddressArray містить рядки, які є адресами ...

for (var i = 0; i < addressArray.length; i++0 
{

setTimeout('googleGeocodingFunction(' + addressArray[i] + ')' , 250);

}

Редагувати:

for (var i = 0; i < address.length; i++) {
    function(i) {
        setTimeout(geocoder.geocode({ 'address': address[i] }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                places[i] = results[0].geometry.location;

                var marker = new google.maps.Marker({ position: places[i], map: map });
                markers.push(marker);
                mc.addMarker(marker);
                google.maps.event.addListener(marker, 'click', function() {
                    if (!infowindow) {
                        infowindow = new google.maps.InfoWindow();
                    }

                    // Setting the content of the InfoWindow
                    infowindow.setContent(popup_content[i]);

                    // Tying the InfoWindow to the marker 
                    infowindow.open(map, marker);
                });

                // Extending the bounds object with all coordinates 
                bounds.extend(places[i]);

                // Adjusting the map to new bounding box 
                map.fitBounds(bounds)
            } else {
                alert("Geocode was not successful for the following reason: " + status);
            }
        }), 250);// End of setTimeOut Function - 250 being a quarter of a second. 
    } 
}

Дякую за відповідь. Як я можу це ввести в свій код. Це все трохи нове, тому потрібно трохи триматися за руку. Ви повинні мати можливість переглянути мій вихідний код.
Роб

Який шматочок? Якою мовою ви користуєтесь?
CatchingMonkey

Я використовую JavaScript, як я можу встановити інтервал?
Роб

Відредагував мою відповідь.
CatchingMonkey

Також зрозумів, що я мав на увазі setTimeout () ... Дякую Кейсі.
CatchingMonkey

9

Це здається, що ви потрапляєте на одночасний ліміт запитів, накладений Google (хоча я не можу знайти посилання на те, що насправді є лімітом). Вам потрібно буде розмістити свої запити, щоб не надсилати відразу 125 запитів. Зауважте, що також існує 2500 запитів на геокодування на день.

Для отримання додаткової інформації зверніться до документа Стратегії геокодування Google .

Оновлення: Оскільки додане рішення, натхнене завдяки публікації Mapperz, ви можете подумати про створення нової таблиці Fusion Google , зберігання адреси та будь-яких пов'язаних даних у таблиці та геокодування таблиці через їх веб-інтерфейс. Існує обмеження кількості запитів на геокод, який зробить таблиця Fusion, проте ліміт досить великий. Коли ви досягнете ліміту, вам потрібно буде повторно подати запит на геокод, і Fusion Tables підбере там, де він припинився. Бонус до цього підходу - це величезне підвищення швидкості, оскільки вам потрібно буде лише кодувати ONCE, де з вашим поточним рішенням вам потрібно буде геокодувати на кожному навантаженні, швидко досягаючи щоденних лімітів.


Я здогадався, що я б'є межу, я настільки новачок у цьому, що, думаю, мені потрібен приклад коду, щоб допомогти.
Роб

Я розглядав Google Fusion Tables і стикався з кількома проблемами. 1. Ви повинні вручну геокодувати адреси (через файл-> геокод) у таблиці, чи можна це зробити автоматично? 2. Деякі маркери відображаються лише на певних рівнях збільшення, а інші відображають незалежно від рівня збільшення. Це приклад - mediwales.com/mapping/example. Я хочу врешті-решт експортувати свої дані Wordpress (тобто всі адреси компанії) до таблиці злиття, геокодувати їх автоматично, а потім схопити всі ці геокодовані адреси та скласти карту миттєво.
Роб

7

Ось як я заглушую свої запити на геокод у javascript, адреси - це масив, що містить кожну адресу для геокодування:

for (i=0;i<=addresses.length;i++) {
    setTimeout( function () {
            geocoder.geocode( { 'address': addresses[i]}, function(results, status) {

                if (status == google.maps.GeocoderStatus.OK) { 

                    //create and add marker to map based off geocode result
                    var marker = new google.maps.Marker({  
                        map: map,
                        title: results[0].formatted_address,
                        position: results[0].geometry.location
                    });

                 } //EDIT, was missing the closing bracket here
            });

    }, i * 1500);
}

Це по суті додає другу та половину між кожним запитом геокодування.


Дякую за відповідь. Я продовжую отримувати порожню сторінку, коли намагаюся інтегруватись у свій код - mediwales / mapping
Rob

Чи використовуєте ви інструменти налагодження, які могли б вказувати на помилку? Якщо цього немає, спробуйте використовувати плагін FireFox Firebug. Це може бути дуже зручно в таких ситуаціях.
Кейсі

Я не ні. Я не впевнений, що поставив код у потрібне місце, і оновлюю питання зі своєю спробою.
Роб

У моєму зразку коду у мене не було закритої дужки. Я відредагував свою відповідь і додав її, з коментарем. Однак, схоже, це не було проблемою у вашому зразковому коді. Ви отримуєте порожню сторінку або порожню карту? Порожня сторінка вказуватиме на наявність синтаксичної помилки в коді javascript. Порожня карта (без маркерів) вказуватиме на те, що код геокодування має проблеми.
Кейсі

1
Привіт. У мене був ще один підхід до вашої відповіді. Затримка працює зараз, але маркери не зможуть побудувати графік. З мого коду це важливі біти, які будують маркери - (функція (i) {і}) (i); без тих, що не зможуть, навіть не додаючи затримки.
Роб

5

Я спробував сторінку зараз і, здається, працює зараз .

Хоча я думаю, що підхід таймера, який ви зараз використовуєте, є правильним, і наскільки я знаю, єдиний, який буде працювати без необхідності підтримки сервера, я повинен запропонувати наступні зміни (я взяв на себе сміття переписати ваші функції геокодування) скористатися місцевим зберіганням .

LocalStorage - це відносно нова технологія, вбудована в більшість браузерів, що дозволяє веб-сторінці зберігати дані про клієнта. Він дещо схожий на файли cookie, але він набагато потужніший і не завжди обурюється на сервері (на відміну від cookies).

Моя мета - зберегти геокодовану адресу на клієнті, щоб, якщо користувач оновлює сторінку, не потрібно знову запускати на них функції геокодера Google. Нижченаведена реалізація є грубою (ми повинні додати код, щоб перевірити наявність несвіжих записів і, ймовірно, потрібен кращий ключ кешування, ніж індекс), але має бути достатньо для початку роботи. Сподіваюся, це допомагає.

(function() { 

window.onload = function() { 
 var mc;
// Creating an object literal containing the properties we want to pass to the map 
var options = { 
zoom: 0, maxZoom: 0, 
center: new google.maps.LatLng(52.40, -3.61), 
mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 

// Creating the map 
var map = new google.maps.Map(document.getElementById('map'), options); 

// Creating a LatLngBounds object 
var bounds = new google.maps.LatLngBounds(); 

// Creating an array that will contain the addresses 
var places = []; 

// Creating a variable that will hold the InfoWindow object 
var infowindow; 
mc = new MarkerClusterer(map);
var popup_content = [..redacted..];

var geocoder = new google.maps.Geocoder(); 

var markers = [];

// Adding a LatLng object for each city 
function geocodeAddress(i) {
     // check if localStorage is available (it is now available on most modern browsers)
     // http://html5tutorial.net/tutorials/working-with-html5-localstorage.html
     // NB: this *must* be improved to handle quota limits, age/freshness, etc
     if(localStorage && localStorage['address_'+i]) {
        places[i]=JSON.parse(localStorage['address_'+i]);
        addPlace(i);
     } else {
      geocoder.geocode( {'address': address[i]}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            places[i] = results[0].geometry.location;
            if(localStorage) {
               // cache result locally on the browser, this will help reducing the number of requests
               // to the google geocoder in case the user refreshes the page
               // remember: the more he will refresh, the more he's likely to hit the limit
               // (this is one case where refreshing or closing the browser does not work)
               localStorage['address_'+i]=JSON.stringify(results[0].geometry.location);
            }

            addPlace(i);
        } else { 
            console.log("Geocoding of address "+address[i]+" failed");
        }
    })
}

function addPlace(i) {
    // Adding the markers 
    var marker = new google.maps.Marker({position: places[i], map: map});
    markers.push(marker);
    mc.addMarker(marker);

    // Creating the event listener. It now has access to the values of i and marker as they were during its creation
    google.maps.event.addListener(marker, 'click', function() {
        // Check to see if we already have an InfoWindow
        if (!infowindow) {
            infowindow = new google.maps.InfoWindow();
        }

        // Setting the content of the InfoWindow
        infowindow.setContent(popup_content[i]);

        // Tying the InfoWindow to the marker 
        infowindow.open(map, marker);
    });

    // Extending the bounds object with each LatLng 
    bounds.extend(places[i]); 

    // Adjusting the map to new bounding box 
    map.fitBounds(bounds);
}

function geocode() {
    if (geoIndex < address.length) {
        geocodeAddress(geoIndex);
        ++geoIndex;
    }
    else {
        clearInterval(geoTimer);
    }
}
var geoIndex = 0;
var geoTimer = setInterval(geocode, 600);  // 200 milliseconds (to try out)

var markerCluster = new MarkerClusterer(map, markers); 
} 
})
(); 

Велике спасибі, просто дайте щось ще, але спробую це за хвилину. Здається, гарна ідея.
Роб

Щойно спробував це (тепер повернувся до попереднього), він спрацював перший раз, тоді коли я оновив його, просто показав порожню сторінку.
Роб

спробуйте зараз, сталася помилка, також зауважте, що змінна popup_content була змінена для стислості.
unicoletti

3

використовуючи геокодери geopy, я можу геокодувати велику кількість адрес без замикання (я не впевнений у налаштуванні плакатів чи чи він може включити залежність пітона до свого проекту)

ось мій тест:

from geopy import geocoders

g = geocoders.GoogleV3()  #https://geopy.readthedocs.io/en/latest/#geopy.geocoders.GoogleV3

for x in xrange(1,10000):
    print x
    a = g.geocode("AV JOAO NAVES DE AVILA " + str(x) + " UBERLANDIA MG BRASIL")
    print a

фрагмент результату

7595 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7595 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-288, Бразилія ", (-18.9388154, -48.2220562))

7596 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7596 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Бразилія ", (-18.938814, -48.2217423))

7597 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7597 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-288, Бразилія ", (-18.9388128, -48.2220381))

7598 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7598 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Бразилія ", (-18.9388114, -48.2217242))

7599 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7599 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-288, Бразилія ", (-18.9388102, -48.2220201))

7600 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7600 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Бразилія ", (-18.9388088, -48.2217062))

Це все ще працює, і я маю результати 7k.

EDIT: Через деякий час я зачепив кінець вулиці, і Google почав давати мені ті самі бали, але схоже, що він все ще запитує і дає точні відповіді.


Геопія не є магією, обмеження щодо використання все ще діють.
alphabetasoup

1

Ця функція php (я не знаю, на якій мові ви працюєте, але ви можете їх точно виділити) використовує google geolocator api. Якщо вказати адресу, вона поверне нормалізовану адресу та довгий. HTH.

// GEOLOCATEBYADDRESS
// @arg (string)address
// @return (array) ((int)flag,(array)address,array(rawresponse))

function geolocatebyaddress($lookupaddress){

    $lookupaddress=trim("$lookupaddress New Zealand");
    $lookupaddress=urlencode($lookupaddress);

    //send off google api lookup request
    $apiurl="http://maps.google.com/maps/api/geocode/json";
    $apiurl.="?address=$lookupaddress";
    $apiurl.="&region=NZ";
    $apiurl.="&sensor=false";

    if (function_exists("curl_init")) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $apiurl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $json = curl_exec($ch);
        curl_close($ch);
    }
    else     $json= file_get_contents($apiurl);

    //process response
    $response= json_decode($json,true);
    $approxflag=0;
    if ($response['status']=='OK' and count($response['results'])) {

        $aa= array();
        foreach($response['results'] as $cc=>$result) {
            //set keys
            foreach(array('street_number','road','suburb','city','postcode','region','lat','long') as $t){
                $aa[$cc][$t]='';
            }
            if ($result['geometry']){
                $aa[$cc]['lat']= $result['geometry']['location']['lat'];
                $aa[$cc]['long']=$result['geometry']['location']['lng'];
         }

            if (count($result['address_components'])){
                foreach ($result['address_components'] as $acs){
                    if ($acs['types'][0]=='street_number')               $aa[$cc]['street_number']= $acs['long_name']; 
                    if ($acs['types'][0]=='route')                       $aa[$cc]['road']=      $acs['long_name']; 
                    if ($acs['types'][0]=='sublocality')                 $aa[$cc]['suburb']=   $acs['long_name']; 
                    if ($acs['types'][0]=='locality')                    $aa[$cc]['city']=    $acs['long_name']; 
                    if ($acs['types'][0]=='postal_code')                 $aa[$cc]['postcode']= $acs['long_name']; 
                    if ($acs['types'][0]=='administrative_area_level_1') $aa[$cc]['region']=   $acs['long_name']; 
                }    
            }
            //successful?
            if ($result['geometry']['location_type']=='APPROXIMATE') $approxflag++;
            if (isset($result['partial_match']))  $approxflag++;
            if (!$aa[$cc]['street_number'])         $approxflag++;
        }
        if ($approxflag) return (array(1,$aa,$response));
        else return (array(2,$aa,$response));
    }
    else return (array(0,array(),$response));
}    

Дякую за відповідь, як би я включив це до свого коду?
Роб

Вибачте, я припустив, що ви кодували сайт. Ця функція використовується як частина скриптів на стороні сервера, яка, наприклад, приймає адресу введення користувача, використовує Google geocoder api для отримання координат. Потім ви можете помістити ці координати у свій db, а коли вам потрібно скласти карту, просто запитайте координати та складіть карту з маркерами. Таким чином, ви не будете зловживати геокодером для кожної сторінки, що відображається як диксований. (Ви замітили мій коментар? Я намагаюся допомогти, і покарання мене не надто заохочує мене взагалі). Також я зауважу зазначити, що api вимагає, щоб ви використовували його з gmap.
Пітер

1

Щойно побачив ваш запит. Ви можете спробувати наступний код. У частині перевірки стану геокоду в іншому випадку рекурсивно викликайте ту саму функцію з часовим розривом для втрачених адрес.

function spotPosition(address) {
        geocoder.geocode({ 'address': address }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var lat = results[0].geometry.location.lat();
                var lang = results[0].geometry.location.lng();
                setMarker(lat, lang);
            }
            else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                setTimeout(function () {
                    //Recursively calling spotPosition method for lost addresses
                    spotPosition(address);
                }, 1000);
            }
        });
    }

0

Ось моє рішення:

залежності: Gmaps.js, jQuery

var Maps = function($) {
   var lost_addresses = [],
       geocode_count  = 0;

   var addMarker = function() { console.log('Marker Added!') };

   return {
     getGecodeFor: function(addresses) {
        var latlng;
        lost_addresses = [];
        for(i=0;i<addresses.length;i++) {
          GMaps.geocode({
            address: addresses[i],
            callback: function(response, status) {
              if(status == google.maps.GeocoderStatus.OK) {
                addMarker();
              } else if(status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                lost_addresses.push(addresses[i]);
              }

               geocode_count++;
               // notify listeners when the geocode is done
               if(geocode_count == addresses.length) {
                 $.event.trigger({ type: 'done:geocoder' });
               }
            }
          });
        }
     },
     processLostAddresses: function() {
       if(lost_addresses.length > 0) {
         this.getGeocodeFor(lost_addresses);
       }
     }
   };
}(jQuery);

Maps.getGeocodeFor(address);

// listen to done:geocode event and process the lost addresses after 1.5s
$(document).on('done:geocode', function() {
  setTimeout(function() {
    Maps.processLostAddresses();
  }, 1500);
});

0

Ви не можете уникнути обмеження геокодування google map: ви повинні отримати та зберігати інформацію LatLng .

Якщо у вас є кілька міст, і ви не хочете вручну отримувати LatLng, ви можете використовувати тайм-аут, щоб поступово викликати geocoder.geocode і зберігати інформацію всередині об’єкта javascript, а потім використовувати console.log(JSON.stringify(object, null, 4));для отримання в консолі симпатичного надрукованого об’єкта, так, для приклад

            var locationsPosition = {
                    "Johannesburg - ZA": {
                        "lat": -26.2041028,
                        "lng": 28.047305100000017
                    },
                    "Chennai - IN": {
                        "lat": 13.0826802,
                        "lng": 80.27071840000008
                    }
             }

тож тепер ви можете додати маркер за допомогою locationsPosition["Johannesburg - ZA"].latі.lng


-1

Здається, вам потрібно зробити одну з двох речей:

  1. змінити процес кешування результатів, якщо ви не отримаєте стільки унікальних за день; або
  2. оновлення до сервісу, що дозволяє обробляти більше за день

Як люди вже згадували багато разів, але я не маю особистого досвіду, здається, що ліцензія Google на 100 тис. На день становить близько 10 000 доларів США на рік.

Якщо ви хочете того ж рівня точності або краще (і не потрібно платити цю ціну), ви можете спробувати наш сервіс. За набагато менше, ніж Google (майже на 10-ту вартість), ви можете отримати набагато перевищення межі 2500 (наш найнижчий ліміт - 25 тис. / День).

Звичайно, використання нашого API платного геокодування - це не рішення, я б рекомендував бути на 100% чесним, навіть якщо це погано діловим сенсом. Я б замість цього запропонував перейти з варіантом 1, оптимізувати вашу службу для кешування. Якщо вам не потрібно більше 2500 унікальних геокодів на день.

Відмова : Я працюю в Geocode Farm (послуга, яку я рекомендую).


Чому це було знято? Я не бачу, де щось тут є точним чи неправильним?
Geocode.Farm Staff
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.