Дополнительные вопросы по пакетному геокодированию с помощью Google Maps API v3
-
12-09-2019 - |
Вопрос
Я пытаюсь найти хороший способ ограничить скорость, с которой я отправляю запросы на геокодирование в службу геокодирования 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');
}
});