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 :

Markers multiples [Google Maps]


Sujet :

APIs Google

  1. #1
    Membre du Club Avatar de babou54
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 57
    Points
    57
    Par défaut Markers multiples
    Bonjour,

    j'ai un petit probleme avec google maps

    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
    43
    44
    function initialize()
    {
    
    // tableaux des points avec les noms a afficher dans la bulle
    var TabPoints = ["38, rue St Dizier 54000 Nancy "," Place Stanislas 54000 Nancy","Rue Baron Louis 54000 Nancy","Rue Victor Poirel 54000 Nancy","3, rue Victor 54000 Nancy"];
    
    var TabNoms=["HALL DU LIVRE - 38, rue St Dizier "," OFFICE DU TOURISME - Place Stanislas","MEDIATHEQUE – Rue Baron Louis","SALLE POIREL – Rue Victor Poirel","CINEMA KINEPOLIS - 3, rue Victor"];
    
    
    if (GBrowserIsCompatible())
    {
    var map = new GMap2(document.getElementById("map_canvas"));
    map.setCenter(new GLatLng(48.700,6.200),13);
    geocoder = new GClientGeocoder();
    
    function createMarker(point, number,texte)
    {
    var marker = new GMarker(point);
    marker.value = number;
    GEvent.addListener(marker,"click", function()
    {
    var myHtml = texte;
    map.openInfoWindowHtml(point, myHtml);
    });
    return marker;
    }
    for (var i = 0; i< TabPoints.length; i++)
    {
    geocoder.getLatLng(
    TabPoints[i],
    function(point)
    {
    if (!point) {
    alert(TabPoints[i]+"not found");
    } else {
    
    map.addOverlay(createMarker(point,i,TabNoms[i]));
    }
    });
    
    }
    }
    }
    Mon problème est que dans la fonction point (en gras) dans le code ne reconnai pas l'indice "i" de ma boucle plus précisement il me le met a 5 ( nombre d'élément dans mon tableau ).
    J'ai un peu de mal a comprendre la, si quelqu'un pouvait m'expliquer ce serai gentil.
    merci d'avance

  2. #2
    Membre du Club Avatar de babou54
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 57
    Points
    57
    Par défaut
    En faisant d'autre test j'ai découvert que "apparement" le boucle s'executait totalement avant d'exescuter la fonction point.
    Ce qui est super bizard quand même c'est que les markers se placent correctement sur ma carte.

  3. #3
    Membre actif Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 226
    Points
    226
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (var i = 0; i< TabPoints.length; i++) {
    geocoder.getLatLng(TabPoints[i], (function (index) {
        return function(point) {
            if (!point) {
                alert(TabPoints[index]+"not found");
            } else {
                map.addOverlay(createMarker(point,index,TabNoms[index]));
            }
        }
    })(i)); // là on oblige le script à prendre la valeur courante de i
    }
    Un truc dans le genre peut-être ?

  4. #4
    Membre du Club Avatar de babou54
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 57
    Points
    57
    Par défaut
    viii c'est ça !! merki
    Pourquoi y faut la fonction index ?? Enfin à quoi ca sert et pourquoi la valeur de i avant était fausse ??

  5. #5
    Membre actif Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 226
    Points
    226
    Par défaut
    Le problème c'est que dans le code du début, toutes les fonctions font référence au même i. Js est flemmard et execute les choses au dernier moment, donc pour toutes tes fonctions, i vaut 5.

    Pour que ça marche il faut fixer le i pour chaque appel de map.overlay(). Donc il faut "enfermer" la bonne valeur du i quelque part. Les boucles n'ont pas de variables locales en js, donc pour ça on utilise une fonction. On doit crée une closure (documente toi sur le sujet si la suite n'est pas très clair…)

    Ça sera peut-être plus clair comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function returnFunction (index) {
        return function(point) {
            if (!point) {
                alert(TabPoints[index]+"not found");
            } else {
                map.addOverlay(createMarker(point,index,TabNoms[index]));
            }
        };
    }
     
    for (var i = 0; i< TabPoints.length; i++) {
    geocoder.getLatLng(TabPoints[i], returnFunction(i)); // là on oblige le script à prendre la valeur courante de i
    }
    On rend la variable i, ayant la bonne valeur, locale à la fonction returnFunction. On garde la bonne valeur du i parce que en déclarant une fonction dans une fonction, on crée une closure. Donc index (ayant la bonne valeur) est une variable uniquement accessible à la fonction qui a été renvoyée. donc tes fonctions ne pointent plus vers le même i, mais vers des variables index, différente pour chaque itérations.

    Je sais pas si c'est très clair… a faire ok, mais à expliquer… c'est moins mon fort.

  6. #6
    Membre du Club Avatar de babou54
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 137
    Points : 57
    Points
    57
    Par défaut
    Ok je vois en tout cas merci pour le coup de main et pour les explications

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

Discussions similaires

  1. [Google Maps] Geocoder, Multiple Marker et infowindow [TypeError: a is undefined]
    Par Nico440 dans le forum APIs Google
    Réponses: 3
    Dernier message: 25/06/2013, 19h05
  2. [Google Maps] Google Map API V3 - Marker Multiple
    Par Centrallatice dans le forum APIs Google
    Réponses: 2
    Dernier message: 06/02/2013, 07h36
  3. [Google Maps] Marker multiples google map
    Par popo38 dans le forum APIs Google
    Réponses: 2
    Dernier message: 04/10/2011, 19h08
  4. Google maps et markers multiples
    Par babou54 dans le forum Services
    Réponses: 0
    Dernier message: 03/06/2009, 11h28
  5. Erreur de compilation de type "multiple markers at this line"!
    Par mobi_bil dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 01/03/2009, 20h21

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