Pergunta

Eu estou tentando descobrir uma boa maneira de limitar a taxa em que eu enviar solicitações de geocódigo ao serviço geocoder API v3 do Google Maps. Eu sei que o Javascript não tem qualquer wait agradável ou sleep porque sua execução é, por enquanto, single-threaded.

Cada pedido geocoder é enviado dentro de uma função each jQuery. Assim, o esqueleto de código geral é:

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

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

    // do more stuff
    ...
}

Como posso definir um intervalo fixo de espera entre cada chamada para geocode? Se eu enviar a cada solicitação o mais rápido JavaScript será executado, então eu rapidamente começar a receber respostas OVER_QUERY_LIMIT - mesmo que eu só estou enviando 20 pedidos. Isso é esperado, e eu estou tentando fazer o meu jogo cliente bem com o serviço do Google.


Uma rota alternativa Eu estou disposto a seguir é abandonar completamente Javascript para geocodificação, e escrever tudo em Java. Com Java seria realmente fácil de sono em entre os pedidos.

No entanto, eu não poderia encontrar uma maneira de usar o serviço de geocodificação do Google (especificamente, usando a versão 3 da API) em Java. GeoGoogle parece ser mais do que um ano fora da data, e usos v2.

Pode ser feito em Java, e se sim, como?

Foi útil?

Solução

Sua melhor aposta para implementar algum tipo de submissões limitado de taxa seria usar um objeto temporizador e uma fila. O temporizador está programado a uma taxa fixa para rodar indefinidamente (jQuery tem algumas implementações muito agradáveis ??temporizador) e no corpo desse timer, você pop algo fora da fila e submetê-lo e depois terminar. Você outro código, em seguida, adiciona coisas para essa fila, conforme necessário.

Outras dicas

O Google está desenvolvendo ativamente v2 e v3 da API do Google Maps separadamente. v3 é uma versão mais magro muito adequado para dispositivos com capacidade de processamento limitada ou tarefas básicas de mapeamento (e não precisa de uma chave de API para o trabalho).

Em qualquer caso, se você está geocodificação muitas coisas que você provavelmente deve olhar usando HTTP Serviço de geocodificação ( http://code.google.com/apis/maps/documentation/geocoding/index.html ). Isso irá evitar a questão limitante da velocidade.

E fwiw: Javascript pode fazer operações básicas sleep / espera usando setInterval () e setTimeout (). Apenas fogo a solicitação e redefinir o temporizador para fazê-lo novamente no final do seu processamento de retorno de chamada.

Aqui está um trecho do meu script, basicamente, tenta novamente se ela atinge 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');
        }
    });
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top