Usando o Google Geocoder v3, se eu tentar geocodificar 20 endereços, obtenho um OVER_QUERY_LIMIT, a menos que o tempo eles tenham cerca de 1 segundo de intervalo, mas leva 20 segundos para que todos os meus marcadores sejam colocados.
Existe alguma outra maneira de fazer isso, além de armazenar as coordenadas com antecedência?
javascript
geocoding
google-maps
Michiel van Oosterhout
fonte
fonte
Respostas:
Não, não há realmente outra maneira: se você tem muitos locais e deseja exibi-los em um mapa, a melhor solução é:
Isso, é claro, considerando que você tem muito menos criação / modificação de locais do que consultas de locais.
Sim, isso significa que você terá que trabalhar um pouco mais ao salvar os locais - mas também significa:
fonte
Na verdade, você não precisa esperar um segundo inteiro para cada solicitação. Descobri que, se eu esperar 200 milissegundos entre cada solicitação, posso evitar a resposta de OVER_QUERY_LIMIT e a experiência do usuário é aceitável. Com esta solução você pode carregar 20 itens em 4 segundos.
fonte
setInterval
o número de solicitações necessárias, em vez desetTimeout
, e definir como100
- apenas no caso de o valor do endereço em algum momento no futuro aumentar o20
valor.Infelizmente, esta é uma restrição do serviço Google Maps.
Atualmente, estou trabalhando em um aplicativo que usa o recurso de geocodificação e salvando cada endereço exclusivo por usuário. Eu gero as informações de endereço (cidade, rua, estado, etc) com base nas informações retornadas pelo Google maps e, em seguida, salvo as informações de latitude / longitude no banco de dados também. Isso evita que você tenha que recodificar as coisas e fornece endereços formatados de maneira adequada.
Outro motivo pelo qual você deseja fazer isso é porque há um limite diário no número de endereços que podem ser geocodificados a partir de um endereço IP específico. Você não quer que seu aplicativo falhe para uma pessoa por esse motivo.
fonte
Estou enfrentando o mesmo problema ao tentar geocodificar 140 endereços.
Minha solução alternativa foi adicionar usleep (100.000) para cada loop da próxima solicitação de geocodificação. Se o status da solicitação for OVER_QUERY_LIMIT, o usleep será aumentado em 50000 e a solicitação será repetida e assim por diante.
E, obviamente, todos os dados recebidos (latitude / longitude) são armazenados em um arquivo XML para não executar a solicitação toda vez que a página estiver carregando.
fonte
EDITAR:
Esqueci de dizer que essa solução é em js puro, a única coisa que você precisa é de um navegador que suporte promessas https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Promise
Para aqueles que ainda precisam realizar isso, escrevi minha própria solução que combina promessas com tempos limite.
Código:
Observe que é apenas uma parte de uma biblioteca maior que escrevi para lidar com as coisas do Google Maps, portanto, os comentários podem ser confusos.
O uso é bastante simples, a abordagem, no entanto, é um pouco diferente: em vez de fazer um loop e resolver um endereço de cada vez, você precisará passar uma matriz de endereços para a classe e ela cuidará da pesquisa por si mesma, retornando uma promessa que , quando resolvido, retorna uma matriz contendo todos os endereços resolvidos (e não resolvidos).
Exemplo:
Saída do console:
Objeto devolvido:
Toda a magia acontece aqui:
Basicamente, ele faz um loop em cada item com um atraso de 750 milissegundos entre cada um deles, portanto, a cada 750 milissegundos, um endereço é controlado.
Fiz mais alguns testes e descobri que mesmo em 700 milissegundos às vezes recebia o erro QUERY_LIMIT, enquanto com 750 não tive nenhum problema.
Em qualquer caso, sinta-se à vontade para editar o 750 acima se achar que está seguro lidando com um atraso menor.
Espero que isso ajude alguém em um futuro próximo;)
fonte
Acabei de testar o Google Geocoder e tive o mesmo problema que você. Percebi que só obtenho o status OVER_QUERY_LIMIT uma vez a cada 12 solicitações. Portanto, espero 1 segundo (esse é o atraso mínimo). Isso torna o aplicativo mais lento, mas menos do que esperar 1 segundo a cada solicitação
Com o método holdOn básico:
Espero que ajude
fonte