Mais perguntas de geocodificação de lote com a v3 API do Google Maps
-
12-09-2019 - |
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?
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');
}
});