Дополнительные вопросы о геокодировании в пакетном режиме с помощью Google Maps API v3 - PullRequest
4 голосов
/ 21 сентября 2009

Я пытаюсь найти хороший способ ограничить скорость отправки запросов геокодирования в службу геокодера API Карт Google 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 (в частности, используя API версии 3) в Java. GeoGoogle , похоже, устарел более чем на год и использует версию 2.

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

Ответы [ 4 ]

4 голосов
/ 21 сентября 2009

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

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

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

2 голосов
/ 09 октября 2010
2 голосов
/ 21 сентября 2009

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

1 голос
/ 24 марта 2011

Вот фрагмент из моего скрипта, в основном он пытается снова, если попадает в 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');
        }
    });
...