88 votes

Comment puis-je géocoder 20 adresses sans recevoir une réponse OVER_QUERY_LIMIT ?

En utilisant le Google Geocoder v3, si j'essaie de géocoder 20 adresses, j'obtiens un OVER_QUERY_LIMIT à moins de les espacer d'environ 1 seconde, mais il faut alors 20 secondes avant que mes marqueurs soient tous placés.

Y a-t-il un autre moyen de le faire, autre que de stocker les coordonnées à l'avance ?

0 votes

Est-ce toujours le cas ? La seule restriction que je vois dans la documentation est : "une limite de 2500 requêtes de géolocalisation par jour". code.google.com/apis/maps/documentation/geocoding/

6 votes

Il ne s'agit pas du nombre total de requêtes par utilisateur et par jour, mais du nombre de requêtes dans un court laps de temps, comme lors d'une requête en boucle.

0 votes

Nous avons une licence d'entreprise dans notre magasin et nous rencontrons toujours ce problème d'incapacité à gérer plus de 10 demandes par seconde. La seule différence entre une licence d'entreprise et un développeur ordinaire est que nous avons une limite de 100 000 appels par jour.

86voto

Pascal MARTIN Points 195780

Non, il n'y a pas vraiment d'autre moyen : si vous avez beaucoup de lieux et que vous voulez les afficher sur une carte, la meilleure solution est de :

  • Récupérer la latitude et la longitude, en utilisant le géocodeur, lorsqu'un emplacement est créé.
  • les stocker dans votre base de données, avec l'adresse
  • et utiliser ces latitudes et longitudes stockées lorsque vous voulez afficher la carte.

Ceci, bien sûr, en considérant que vous avez beaucoup moins de création/modification de lieux que de consultations de lieux.

Oui, cela signifie que vous devrez faire un peu plus d'efforts pour sauvegarder les emplacements, mais cela signifie également que.. :

  • Vous pourrez effectuer des recherches par coordonnées géographiques.
    • c'est-à-dire " Je veux une liste de points qui sont près de l'endroit où je me trouve. "
  • L'affichage de la carte sera beaucoup plus rapide
    • Même avec plus de 20 emplacements sur elle
  • Oh, et, aussi (last but not least) : cela va fonctionner ;-)
    • Il est moins probable que vous atteigniez la limite de X appels au géocodeur en N secondes.
    • Et vous aurez moins de chances d'atteindre la limite de Y appels géocodés par jour.

0 votes

Je suis curieux de savoir comment vous pouvez être sûr que les résultats sont corrects après un certain temps (disons un mois). Les interrogez-vous à nouveau de temps en temps ?

2 votes

Si l'adresse (que vous avez déjà dans votre base de données - sinon vous ne pourriez pas faire de géocodage) ne change pas, les chances sont assez faibles que la latitude/longitude change. Et, bien sûr, à chaque fois que l'adresse est modifiée, il faut réinterroger le géocodeur, pour obtenir la latitude+longitude qui correspond à la nouvelle adresse.

0 votes

J'ai stocké la latitude et la longitude dans la base de données et je l'ai récupérée de la base de données via AJAX sous forme de tableau, mais elle devrait ensuite être transmise à nouveau à une boucle java script, de plus j'ai reçu 173 emplacements de la base de données. Maintenant il me montre le même statut OVER_QUERY_LIMIT. Veuillez me conseiller...

20voto

gabeodess Points 293

En fait, vous ne devez pas attendre une seconde entière pour chaque demande. J'ai constaté que si j'attends 200 millisecondes entre chaque demande, je peux éviter la réponse OVER_QUERY_LIMIT et l'expérience utilisateur est acceptable. Avec cette solution, vous pouvez charger 20 éléments en 4 secondes.

$(items).each(function(i, item){

  setTimeout(function(){

    geoLocate("my address", function(myLatlng){
      ...
    });

  }, 200 * i);

}

5 votes

Mais (200 * i) signifie que la pause entre chaque demande augmente. Ainsi, à la troisième demande, elle est de 600, puis de 800, etc.

0 votes

Il suffit d'enlever le '* i'.

9 votes

SetTimeout l'exécutera une fois. Donc, si j'ai raison, (... , 200 * i) planifiera chaque appel séparé par 200ms (comme oyatek l'a commenté), ce qui est ce que gabeodess voulait réaliser. L'actuelle (... , 200) les exécutera tous en même temps après 200ms. Ou est-ce que quelque chose m'échappe ?

6voto

Zachary Points 5714

Malheureusement, il s'agit d'une restriction du service Google Maps.

Je travaille actuellement sur une application qui utilise la fonction de géocodage et je sauvegarde chaque adresse unique pour chaque utilisateur. Je génère les informations d'adresse (ville, rue, état, etc.) sur la base des informations renvoyées par Google Maps, puis j'enregistre les informations de latitude et de longitude dans la base de données. Cela vous évite d'avoir à recoder les choses, et vous donne des adresses bien formatées.

Une autre raison pour laquelle vous voulez faire cela est qu'il y a une limite quotidienne sur le nombre d'adresses qui peuvent être géocodées à partir d'une adresse IP particulière. Vous ne voulez pas que votre application échoue pour une personne pour cette raison.

2voto

gray Points 147

Je rencontre le même problème en essayant de géocoder 140 adresses.

Ma solution de contournement consistait à ajouter usleep(100000) pour chaque boucle de la prochaine demande de géocodage. Si le statut de la demande est OVER_QUERY_LIMIT, l'usleep est augmenté de 50000 et la demande est répétée, et ainsi de suite.

Et bien sûr, toutes les données reçues (lat/long) sont stockées dans un fichier XML et ne doivent pas être demandées à chaque fois que la page est chargée.

1 votes

Votre réponse est vague, faites-vous référence au côté serveur ou s'agit-il de javascript, si c'est le dernier, usleep est no Si c'est le premier cas, je vous suggère de modifier votre réponse pour indiquer explicitement qu'il s'agit d'une fonction côté serveur afin d'éviter toute ambiguïté.

1voto

ntechi Points 1014

C'est une réponse tardive, mais voici la solution du géocodage en utilisant le côté serveur et le php.

http://webstutorial.com/google-server-side-geocoding-php-infobox/website-tweaks/google

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X