Как избежать ограничения геокодирования в Картах Google?

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. Это позволит вам записать широту / длину для городов в CMS, поэтому вам не нужно будет использовать геокодер во время выполнения.
Стивен Лид
@Peter На самом деле это звучит как отличная идея. Я немного разорван, так как это снизит удобство использования моих cms. Если клиенту приходится искать широту / долготу по компании, а не просто вводить адрес, это не очень удобно для пользователя. Я правильно понимаю?
Роб
Смотрите мой новый ответ ниже для функции php.
Питер
2
@rob FWIW Я думаю, у Раги правильный подход. Ответ Кейси все еще требует, чтобы вы геокодировали каждую точку, каждый раз, когда рисует карта, что, по-видимому, не нужно для вашего статического набора данных
Стивен Лид,

Ответы:

57

Как и все остальные, я мог бы дать вам ответ с кодом, но я не думаю, что кто-то объяснил вам, что вы делаете что-то, что в корне неправильно .

Почему вы нажали эту ошибку? Потому что вы вызываете геокод каждый раз, когда кто-то просматривает вашу страницу, и вы нигде не кэшируете свои результаты в БД!

Причина, по которой существует ограничение, состоит в том, чтобы предотвратить злоупотребление ресурсами Google (будь то добровольно или неохотно) - именно это вы и делаете :)

Несмотря на то, что геокод Google работает быстро, если бы все использовали его таким образом, его серверы были бы отключены. Причина, по которой существуют Google Fusion Tables, заключается в том, чтобы сделать большую часть тяжелой работы на стороне сервера для вас. Геокодирование и кэширование тайлов осуществляется на их серверах. Если вы не хотите использовать это, вы должны кэшировать их на своем сервере.

Если 2500 запросов в день - это слишком мало, вам нужно взглянуть на Профессиональную (платную) лицензию Google Maps, которая дает 100 000 запросов геокодирования в день, что обходится примерно в 10 тыс. В год (это много - при кэшировании на стороне сервера вам следует не достигните этого предела, если вы не являетесь каким-то огромным сайтом или занимаетесь интенсивной обработкой данных). Без кеширования на стороне сервера и использования вашего текущего подхода вы сможете делать только 800 просмотров страниц в день!

Как только вы поймете, что другие провайдеры взимают плату за геокод , вы поймете, что вам следует кэшировать результаты в БД. При таком подходе это будет стоить вам около 10 центов США за просмотр страницы!

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

Так каков правильный путь для этого варианта использования? Прежде чем вызывать API геокодирования Google, отправьте его на свой сервер и запросите, находится ли он в вашем кэше. Если это не так, вызовите геокод, сохраните его в кеше и верните результат.

Есть и другие подходы, но это должно привести вас в правильном направлении.

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

Раги Язер Бурхум
источник
У вас есть пример, которым я мог бы следовать, отправив его на сервер и т. Д.?
Роб
Какая у вас бэкэнд CMS? (Я предполагаю, что вы можете / знаете, как это изменить и просто хотите простой пример, который показывает, как это сделать на выбранном вами языке. Вам не нужен пример js на стороне клиента или нет? Вы используете какой-либо js? рамки, как JQuery?
Раги Язер Burhum
Кроме того, вам нужно больше узнать о том, как данные маркера попадают в вашу систему, в первую очередь
Ragi Yaser Burhum
1
ХОРОШО. Php тогда. Этот бит из документации Google должен включать в себя mysql и php part code.google.com/apis/maps/articles/phpsqlgeocode.html
Ragi Yaser Burhum
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);

Кажется, работает.

РЕДАКТИРОВАТЬ: Не могу проверить это, но это должно / может работать!

Пример 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
источник
Спасибо за ответ. Как я могу получить это в моем коде. Это все немного ново, поэтому нужно немного подержать. Вы должны быть в состоянии просмотреть мой исходный код.
Роб
Какой бит? Какой язык вы используете?
CatchingMonkey
Я использую JavaScript, как я могу установить интервал?
Роб
Отредактировал мой ответ.
CatchingMonkey
Также понял, что я имел в виду setTimeout () ... Спасибо, Кейси.
CatchingMonkey
9

Похоже, вы достигли лимита одновременных запросов, установленного Google (хотя я не могу найти ссылку на то, каков этот предел на самом деле). Вам нужно будет распределить свои запросы так, чтобы вы не отправляли 125 запросов одновременно. Обратите внимание, что существует также ограничение в 2500 геокодов в день.

Обратитесь к документу Google Geocoding Strategies для получения дополнительной информации.

Обновление. В качестве дополнительного решения, вдохновленного публикацией Mapperz, вы можете подумать о создании новой таблицы Google Fusion , сохранении вашего адреса и любых связанных данных в таблице и геокодировании таблицы через их веб-интерфейс. Существует ограничение на количество запросов геокодов, которые Fusion Table делает, однако это ограничение довольно велико. Как только вы достигнете предела, вам нужно будет повторно отправить запрос геокода, и Fusion Tables определит, где он остановился. Преимуществом этого подхода является значительное улучшение скорости, поскольку вам нужно только геокодировать ОДИН РАЗ, где с вашим текущим решением вам нужно будет геокодировать каждую нагрузку, быстро достигая суточных пределов.

Саша Иветик
источник
Я догадался, что достигну предела, я настолько новичок в этом, что думаю, мне нужен пример кода, чтобы помочь.
Роб
Я изучал 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);
}

Это по существу добавляет секунду и половину между каждым запросом геокодирования.

Casey
источник
Спасибо за ответ. Я получаю пустую страницу, когда пытаюсь интегрироваться в мой код - mediwales / mapping
Rob
Используете ли вы какие-либо средства отладки, которые могут указать на ошибку? Если нет, попробуйте использовать FireFox плагин FireFox. Это может быть очень удобно в подобных ситуациях.
Кейси
Я не нет. Я не уверен, что поставил код в нужном месте, я обновлю свой вопрос своей попыткой.
Роб
Мне не хватало закрывающей скобки в моем примере кода. Я отредактировал свой ответ и добавил его с комментарием. Однако, похоже, что это не проблема в вашем примере кода. Вы получаете пустую страницу или пустую карту? Пустая страница будет указывать на наличие синтаксической ошибки в коде JavaScript. Пустая карта (без маркеров) будет указывать на наличие проблемы с кодом геокодирования.
Кейси
1
Здравствуй. Я получил еще один ответ на ваш ответ. Задержка работает сейчас, но не может вывести маркеры на график. Из моего кода это важные биты, которые строят маркеры - (function (i) {и}) (i); без них он не будет построен, даже без добавления задержки.
Роб
5

Я попробовал страницу сейчас, и она, кажется, работает прямо сейчас .

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

LocalStorage - это относительно новая технология, встроенная в большинство браузеров, которая позволяет веб-странице хранить данные на клиенте. Он чем-то похож на куки, но он намного мощнее и не всегда отправляется на сервер (в отличие от куки).

Моя цель - сохранить геокодированный адрес на клиенте, чтобы в случае, если пользователь обновляет страницу, нет необходимости снова вызывать функции геокодера 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); 
} 
})
(); 
unicoletti
источник
Большое спасибо, просто попробую, но попробую через минуту. Звучит как хорошая идея.
Роб
Только что попробовал (теперь вернул назад к предыдущему), это сработало в первый раз, тогда когда я обновил это просто показало пустую страницу.
Роб
попробуйте сейчас, произошла ошибка, также обратите внимание, что переменная popup_content была отредактирована для краткости.
unicoletti
3

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

вот мой тест:

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, Brazil ', (-18.9388154, -48.2220562))

7596 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7596 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Brazil ', (-18.938814, -48.2217423))

7597 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7597 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-288, Brazil ', (-18.9388128, -48.2220381))

7598 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7598 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Brazil ', (-18.9388114, -48.2217242))

7599 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7599 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-288, Brazil ', (-18.9388102, -48.2220201))

7600 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7600 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Brazil ', (-18.9388088, -48.2217062))

Это все еще работает, и я с 7k результатов.

РЕДАКТИРОВАТЬ: Через некоторое время я достиг конца улицы, и Google начал давать мне те же очки, но похоже, что он все еще делает запросы и дает мне точные ответы.

Джордж Сильва
источник
Geopy не волшебство, ограничения использования все еще применяются.
alphabetasoup
1

Эта функция PHP (я не знаю, на каком языке вы работаете, но вы можете выбрать его отдельно), использует API Google Geolocator. Учитывая адрес, он вернет нормализованный адрес и долготу. НТН.

// 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));
}    
Питер
источник
Спасибо за ответ, как бы я включил это в мой код?
Роб
Извините, я предположил, что вы кодируете сайт. Эта функция используется как часть сценариев на стороне сервера, которая, например, принимает адрес пользовательского ввода, использует API геокодера Google для получения координат. Затем вы можете поместить эти координаты в свою базу данных, а когда вам нужно создать карту, просто запросите координаты и создайте карту с маркерами. Таким образом, вы не будете злоупотреблять геокодером для каждой страницы, отображаемой как dicsussed. (Вы преуменьшили мой комментарий? Я пытаюсь помочь, и наказание меня не слишком поощряет меня). Также я забыл упомянуть, что 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: вы должны получать и хранить информацию 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 тыс. Долларов в год.

Если вам нужен такой же уровень точности или лучше (и вам не нужно платить эту цену), вы можете попробовать наш сервис. Для гораздо меньшего, чем Google (почти в 10 раз меньше), вы можете получить намного более высокий лимит, чем 2500 (наш самый низкий лимит - 25 КБ / день).

Конечно, использование нашего платного API геокодирования не является решением, которое я бы порекомендовал быть на 100% честным, даже если это плохой бизнес-смысл. Вместо этого я бы предложил перейти к варианту 1: оптимизировать службу для кэширования. Если вам не нужно более 2500 уникальных геокодов в день.

Отказ от ответственности : я работаю в Geocode Farm (сервис, который я рекомендую).

Geocode.Farm Staff
источник
Почему за это проголосовали? Я не вижу, где здесь что-то неточное или неправильное?
Geocode.Farm Staff