IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

APIs Google Discussion :

OVER_QUERY_LIMIT pour les itinéraires [Google Maps]


Sujet :

APIs Google

  1. #1
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 70
    Points : 44
    Points
    44
    Par défaut OVER_QUERY_LIMIT pour les itinéraires
    Bonjour,

    Tout est dit dans le titre : j'ai cette erreur au bout de 10 requêtes et je n'arrive pas à la contrer. J'ai surfé un bon moment et j'ai vu qu'avec une pause c'était possible, mais je n'y arrive pas.

    Voici mon code sans la pause :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    for(var i=0 ; i < tableau.length ; i++){
    	// ...
    	addMarker(tableau[i]);
    	// ...
    }
     
    function addMarker(tableau){
    	// ...
    	var coords = new g.LatLng(tableau[8], tableau[9]);
    	var marker = new google.maps.Marker({
    		position: coords,
    		map: map
    	});
    	// ...
    	if(markersEtablis.length > 0){
    		directionsService = new g.DirectionsService();
    		directionsService.route({
    			origin: coords,
    			destination: markersEtablis[0].getPosition(),
    			provideRouteAlternatives: true,
    			unitSystem: g.DirectionsUnitSystem.METRIC,
    			travelMode: g.DirectionsTravelMode.DRIVING
    		}, function(result, status){
    			if (status == g.DirectionsStatus.OK){
    				cptTabMarker++;
    				var directionsDisplay = new g.DirectionsRenderer();
    				var options = {suppressMarkers: true};
    				directionsDisplay.setOptions(options);
    				directionsDisplay.setDirections(result);
    				directions.push(directionsDisplay);
    				// ...
    				}
    				else {
    					console.log('Le calcul d\'itinéraire a échoué pour ' + status);
    				}
    			});
    		}
    	}
    	markers.push(marker);
    	marker.setMap(map);
    }
    Voilà je vous ai mis la partie importante de mon code. Si vous pouviez m'aider, ce serait avec plaisir

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 983
    Points : 44 183
    Points
    44 183
    Par défaut
    Bonjour,
    J'ai surfé un bon moment et j'ai vu qu'avec une pause c'était possible, mais je n'y arrive pas.
    il te fallait prendre la bonne vague
    http://www.developpez.net/forums/d10...e/#post5964793

  3. #3
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    Merci,

    Effectivement, la mienne était pourri de vague. Celle que tu m'a dit de prendre était parfaite !

    Du coup, j'ai créé une fonction qui contient juste mon directionsService et suivi les mêmes instructions que tu as donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    function  afficherTabDistancier(coords, tableau) {
    	directionsService = new g.DirectionsService();
    	directionsService.route({
    		origin: coords,
    		destination: markersEtablis[0].getPosition(),
    		provideRouteAlternatives: true,
    		unitSystem: g.DirectionsUnitSystem.METRIC,
    		travelMode: g.DirectionsTravelMode.DRIVING
    	}, function(result, status){
    		if (status == g.DirectionsStatus.OK){
    			cptTabMarker++;
    			var directionsDisplay = new g.DirectionsRenderer();
    			var options = {suppressMarkers: true};
    			directionsDisplay.setOptions(options);
    			directionsDisplay.setDirections(result);
    			directions.push(directionsDisplay);
    			// ...
    			}
    			else {
    			// on traite l'erreur OVER_QUERY_LIMIT
    			if( status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT){
    				// relance la requete
    				setTimeout( function(){
    					afficherTabDistancier(coords, tableau); // rappel de la même fonction avec les même paramètres
    				}, 200);
    			}
    			else{
    				// affichage erreur
    				console.log('Le calcul d\'itinéraire a échoué pour ' + tableau[1]);
    				console.log(status);
    			}
    		});
    	}
    }
    Par contre, c'est lent... Il n'y a pas un autre moyen plus rapide ? (c'est fonctionnel, je ne me plains pas, c'est juste que je me sens obligé de poser la question... )

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 983
    Points : 44 183
    Points
    44 183
    Par défaut
    d'où sont extrait les données des marqueurs?

    - Si il s'agit d'un click sur la map cette soluce est jouable
    - Si ce sont toujours les mêmes valeurs, mets tout cela en BdD ou en dur dans un fichier

    ...
    Tiens je reprend presque ce que j'ai mis dans la discussion en référence
    Citation Envoyé par NoSmoking Voir le message
    si l'on considère 100 requêtes limitées à 5 requêtes par seconde il te faut, sans erreur OVER_QUERY_LIMIT, déjà 20s c'est déjà looooooong, alors avec le temps de latence cela devient interminable, enfin pour moi.

    La question qui se pose est de savoir si tu es obligé d'attendre d'avoir tous tes points définis pour faire la demande?

    - Si les points sont saisis, voir cliqués au fil de l'eau, autant faire l'appel une fois pris connaissance de celui ci.
    - Si les points sont dans un fichier chargé autant mettre les adresses préalablement récupérées.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Désolé de ne répondre que maintenant.

    Je récupère les latitudes et longitudes en BdD, les enregistre dans mon tableau "tableau" et réalise la fonction ci-dessus.

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 983
    Points : 44 183
    Points
    44 183
    Par défaut
    Je récupère les latitudes et longitudes en BdD...
    dans ce cas pourquoi donc ne pas mettre les infos utiles dans la BdD également ?

  7. #7
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    Euh.. Là je ne suis pas... Enregistrer tous les points de chaque itinéraire ? J'ai plus de 1500 adresses en base, avec leurs coordonnées.

    Les itinéraires ne sont pas toujours les mêmes, ils changent selon les choix de l'utilisateur.

    Je ne comprend pas bien ce que tu me proposes...

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 983
    Points : 44 183
    Points
    44 183
    Par défaut
    Euh.. Là je ne suis pas...
    c'est moi qui n'ai pas suivi, au temps pour moi, j'avais la tête dans le geodécodage...

    Par contre, c'est lent... Il n'y a pas un autre moyen plus rapide ?
    coté quota tu as droit à 10 requêtes par seconde, il faudrait peut être voir vers une offre professionnel.

  9. #9
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    Ah oui... Les offres professionnelles...

    Non mais écoute, c'est pas grave, avec ma solution ça marche plutôt bien :

    Je géocode chaque itinéraire (avec le setTimeOut, comme tu m'as dit) mais je n'affiche pas les itinéraires, je rempli un tableau html dynamiquement.
    C'est sympa, il rajoute des lignes au fur et à mesure !
    Et sur chaque ligne de ce tableau j'affiche la distance et la durée de l'itinéraire, puis un bouton "Tracer" qui va me permettre de le tracer sur la map

    En tout cas merci de m'avoir répondu, a bientôt NoSmocking

  10. #10
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    Bonjour !

    Bon j'ai un nouveau soucis... Si je lance une recherche d'itinéraire alors que l'ancienne n'est pas terminée, mon ancien setTimeout continu de m'afficher des résultats de mon ancienne recherche. :dry:

    J'ai pourtant bien appelé un clearTimeout mais rien n'y fait.

    Je vous publie les parties de mon code intéressantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    var timeOut;
     
    // Fonction qui me permet de lancer une recherche, d'afficher mes markers et de lancer ma fonction qui affiche mon distancier
    function rechercher(){
    	clearTimeout(timeOut);
     
    	// boucle for pour chaque résultat de ma recherche
    		// Affichage du marker
    		// ...
     
    		afficherTabDistancier(marker);
    	// Fin boucle for
    }
     
    function afficherTabDistancier(marker) {
    	// la même que précédemment, sauf pour le setTimeout dont je sauvegarde l'identifiant :
    	timeOut = setTimeout( function(){
    		afficherTabDistancier(marker, tableau); // rappel de la même fonction avec les même paramètres
    	}, 1000);
    }
    Je ne comprends pas pourquoi il ne s'arrête pas...

  11. #11
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 983
    Points : 44 183
    Points
    44 183
    Par défaut
    Bon j'ai un nouveau soucis... Si je lance une recherche d'itinéraire alors que l'ancienne n'est pas terminée, mon ancien setTimeout continu de m'afficher des résultats de mon ancienne recherche. :dry:
    sauf que si la requête est partie entre temps elle se terminera.

    Tu peux gérer cela avec un flag, si au retour le flag est posé alors tu ne fais rien, mais c'est ballot de ne pas profiter du retour.

    Peut être ai je mal compris le problème.

  12. #12
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    Enfait, je vais chercher en base des latitudes et longitudes selon certains paramètres rentrés par l'utilisateur. Si l'utilisateur change son paramètre et lance à nouveau la recherche de latitudes / longitudes avant que la première recherche soit finie, il va continuer de me chercher les anciennes (que je ne veux plus) en plus des nouvelles (que je veux seules ^^)

    Je ne connais pas les Flags... Quel est le principe ?

  13. #13
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 983
    Points : 44 183
    Points
    44 183
    Par défaut
    Pour le flag il suffit de mettre un flag, boolean true/false, à true et si la valeur est à true ne pas lancer la requête suivante.

    Une autre solution est de mettre le champ de saisie en disabled le temps du retour, dans l'esprit cela revient au même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var bRequeteEnCours = false;
    if( !bRequeteEnCours){
      bRequeteEnCours = true;
      lancementRequete();
    }
    et sur la function callBack il suffit de rétablir la situation normale.

  14. #14
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 70
    Points : 44
    Points
    44
    Par défaut
    Chuis vraiment désolé de t'embêter, mais je ne comprend pas le but. Je ne vois pas l'utilité du flag... Ni de mettre mon champs de saisie en disabled... Puisque dans tous ces cas, il va quand même continuer à chercher l'ensemble des anciens itinéraires demandés.

    Enfait je crois que j'ai mieux compris d'où vient le problème :

    Le truc, c'est que lorsque l'utilisateur valide ses paramètres, ça lance l'AJAX pour aller chercher les coordonnées en BDD. Les coordonnées sont retournées par le biais d'un tableau JSON. Ce tableau est traité, au success de mon AJAX. Je fais une boucle sur mon tableau et appelle pour chaque élément de mon tableau ma fonction d'itinéraire. Cependant, javascript gère la fonction de réussite de la recherche d'itinéraire en dernier. C'est à dire (je dis peut-être des bêtises...) qu'il enregistre l'ensemble des appels à la fonction de recherche d'itinéraire, il finit la suite du code, puis reviens sur les appels et réalise la recherche d'itinéraire.

    Je ne sais pas si je suis très claire.

    Voilà si on lit le code ce que devrait faire mon programme :
    AJAX SUCCESS:
    BOUCLE sur JSON
    TRAITEMENT de mes informations...
    APPEL à ma fonction de recherche d'itinéraire
    RECHERCHE d'itinéraire
    FIN FONCTION
    AUTRES TRAITEMENTS...
    FIN BOUCLE
    AUTRES TRAITEMENTS...
    Mais en réalité il fait ça :
    AJAX SUCCESS:
    BOUCLE sur JSON
    TRAITEMENT de mes informations...
    APPEL à ma fonction de recherche d'itinéraire
    AUTRES TRAITEMENTS...
    FIN BOUCLE
    AUTRES TRAITEMENTS...
    RECHERCHE d'itinéraire
    Et si la recherche d'itinéraire n'est pas terminée et qu'on en relance une, le programme se déroule comme ça :
    AJAX SUCCESS:
    BOUCLE sur JSON
    TRAITEMENT de mes informations...
    APPEL à ma fonction de recherche d'itinéraire
    AUTRES TRAITEMENTS...
    FIN BOUCLE
    AUTRES TRAITEMENTS...
    RECHERCHE d'itinéraire (partielle)
    AJAX SUCCESS:
    BOUCLE sur JSON
    TRAITEMENT de mes informations...
    APPEL à ma fonction de recherche d'itinéraire
    AUTRES TRAITEMENTS...
    FIN BOUCLE
    AUTRES TRAITEMENTS...
    RECHERCHE d'itinéraire (suite)
    RECHERCHE d'itinéraire (la nouvelle)

    Y a-t-il un moyen pour que la ligne : "RECHERCHE d'itinéraire (suite)" s'efface ? ^^

    Peut-être qu'il faut le faire avec le flag comme tu m'as dis, mais je ne vois pas comment...

  15. #15
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 983
    Points : 44 183
    Points
    44 183
    Par défaut
    le problème que tu rencontres est un problème lié aux fonctions asynchrone, on sait quand on les envoi mais pas quand elles reviennent et dans quel ordre.

    De plus le moteur de rendu n'intervient que quand il à la main, quand le javascript lui en laisse le temps.

    En bref, je verrais bien la mise en place d'un "jeton".
    A chaque validation, on modifie la valeur du "jeton" et au retour des fonctions callback on teste cette valeur. Si elle correspond à la valeur lors de l'envoi, on traite, dans le cas contraire on ne fait rien.

    Un autre problème va se lié du fait que l'on est en présence de fonction asynchrone, donc il faut créer un contexte pour conserver la valeur du "jeton".

    Donc il faut une variable globale var refJeton = 0; par exemple.

    A chaque validation il suffit d'incrémenter cette variable, refJeton++; pour faire simple.

    Dans la fonction geocoder.geocode, il faut récupérer la valeur de celui ci en static. On peut utiliser la méthode des closures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    (function( jeton){
      geocoder.geocode( { 'address': sAddress}, function( results, status){
        oResult = document.getElementById( 'resultat');
        if (status == google.maps.GeocoderStatus.OK) {
          // affiche le resultat si jeton valide
          if( jeton === refJeton){
            oResult.innerHTML = getProperty( results);
          }
          else{
            oResult.innerHTML = 'Jeton [' +jeton +'] invalide';
          }
        }
        else {
          oResult.innerHTML = '<b>SORRY!<\/b><br>Geocode was not successful for the following reason: ' + status;
        }
      });
      })(refJeton);
    La même méthode peut être utilisée pour ton retour Ajax.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. FormatFloat pour les entiers !?
    Par Lung dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2003, 15h20
  2. [Kylix] cherche composants pour les sockets
    Par coriolis dans le forum EDI
    Réponses: 1
    Dernier message: 09/04/2003, 10h18
  3. Probleme pour les insertion au format etranger
    Par Sandrine75 dans le forum XMLRAD
    Réponses: 5
    Dernier message: 19/03/2003, 10h55
  4. Réponses: 2
    Dernier message: 08/10/2002, 18h26
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo