Дополнительные вопросы по пакетному геокодированию с помощью Google Maps API v3

StackOverflow https://stackoverflow.com/questions/1456258

Вопрос

Я пытаюсь найти хороший способ ограничить скорость, с которой я отправляю запросы на геокодирование в службу геокодирования Google Maps API v3.Я знаю, что в Javascript нет никаких приятных wait или sleep потому что его выполнение на данный момент является однопоточным.

Каждый запрос геокодера отправляется внутри jQuery each функция.Итак, общий скелет кода таков:

$(xml).find('foo').each(function(){
    // do stuff
    ...

    geocoder.geocode(request, function(results, status) {/* do other stuff */});

    // do more stuff
    ...
}

Как я могу установить фиксированный интервал ожидания между каждым вызовом в geocode?Если я отправляю каждый запрос так быстро, как будет запущен Javascript, то я быстро начинаю получать OVER_QUERY_LIMIT ответы - даже если я отправляю всего 20 запросов.Это ожидаемо, и я пытаюсь заставить моего клиента хорошо работать с сервисом Google.


Альтернативный путь, которого я готов придерживаться, - это полностью отказаться от Javascript для геокодирования и написать все это на Java.С Java это было бы действительно легко засыпать в промежутках между запросами.

Однако я не смог найти способ использовать службу геокодирования Google (в частности, используя версию 3 API) на Java. Геогугл кажется, устарел более чем на год и использует версию v2.

Можно ли это сделать на Java, и если да, то как?

Это было полезно?

Решение

Лучше всего для реализации какой-либо отправки с ограниченной скоростью было бы использовать объект timer и очередь.Таймер запланирован на выполнение с фиксированной частотой на неопределенный срок (в jQuery есть несколько очень хороших реализаций таймера), и в теле этого таймера вы извлекаете что-то из очереди и отправляете это, а затем завершаете.Затем ваш другой код добавляет что-то в эту очередь по мере необходимости.

Другие советы

Google активно разрабатывает версии v2 и v3 Maps API отдельно.v3 - это гораздо более тонкая версия, подходящая для устройств с ограниченной вычислительной мощностью или для базовых задач отображения (и для работы ей не нужен ключ API).

В любом случае, если вы геокодируете много вещей, вам, вероятно, следует обратить внимание на использование сервиса геокодирования HTTP от Google (http://code.google.com/apis/maps/documentation/geocoding/index.html).Это позволит избежать проблемы с ограничением скорости.

И fwiw:Javascript может выполнять основные операции перехода в режим ожидания с помощью setInterval() и setTimeout().Просто запустите запрос и сбросьте таймер, чтобы сделать это снова в конце обработки обратного вызова.

Вот фрагмент из моего скрипта, в основном он повторяет попытку, если попадает в google.maps.GeocoderStatus.OVER_QUERY_LIMIT

function(results, status) {
    // If the limit is reached try again in a second
        if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {

            window.setTimeout(
                function() {self.resolveAddress(addr);},1000
            );
        } else if (status == google.maps.GeocoderStatus.OK) {
            // Do something clever
        } else if (status == google.maps.GeocoderStatus.ZERO_RESULTS) {
            self.reduce(addr); // Try removing something from addr
        } else {
            atira.log('Something terrible happened');
        }
    });
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top