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 :

API Distance Matrix & MySQL


Sujet :

APIs Google

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut API Distance Matrix & MySQL
    Bonjour à tous,

    Je cherche à réaliser un script qui calcul la distance entre une ville et plusieurs autres villes. Mes villes sont stockées dans MySQL.

    J'ai alors trouvé un script dans l'api Google qui ressemble à ce que je veux faire, il se trouve ici : http://code.google.com/apis/maps/doc...ce-matrix.html

    Dans l'idée j'ai donc un menu déroulant alimenter des villes de ma base SQL, je sélectionne une ville, une fonction ajax permet de lancer une requête SQLqui récupère les 10 villes les plus proches.

    Les deux codes fonctionnes séparément, mais je ne sais pas comment alimenter les destinations par ma requête.

    Je ne saisi pas si je suis très clair, voici mon code :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
     
    <html> 
      <head> 
        <title>Google Maps API v3 Example: Distance Matrix</title> 
     
       <script type='text/javascript'>
    			function getXhr(){
                                    var xhr = null; 
    				if(window.XMLHttpRequest) // Firefox et autres
    				   xhr = new XMLHttpRequest(); 
    				else if(window.ActiveXObject){ // Internet Explorer 
    				   try {
    			                xhr = new ActiveXObject("Msxml2.XMLHTTP");
    			            } catch (e) {
    			                xhr = new ActiveXObject("Microsoft.XMLHTTP");
    			            }
    				}
    				else { // XMLHttpRequest non supporté par le navigateur 
    				   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
    				   xhr = false; 
    				} 
                                    return xhr;
    			}
     
    			// Quand je sélectionne une ville
    			function go(){
     
    				var xhr = getXhr();
    				// On défini ce qu'on va faire quand on aura la réponse
    				xhr.onreadystatechange = function(){
    					// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    					if(xhr.readyState == 4 && xhr.status == 200){
    						leselect = xhr.responseText;
    						// On se sert de innerHTML pour rajouter les options a la liste
    						document.getElementById('resultat').innerHTML = leselect;
    					}
    				}
     
    				// Ici on va voir comment faire du post
    				xhr.open("POST","ajax.php",true);
    				// ne pas oublier ça pour le post
    				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    				// ne pas oublier de poster les arguments
    				sel = document.getElementById('start');
    				client = sel.options[sel.selectedIndex].value;
    				xhr.send("client="+client);
     
    			}
     
    </script>
        <script src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> 
        </script> 
     
     
        <style type="text/css"> 
          body {
            margin: 20px;
            font-size: 12px;
          }
          #map {
            height: 480px;
            width: 640px;
            border: solid thin #333;
            margin-top: 20px;
          }
        </style> 
     
    <?php
    include('connexion_base.php');
    //Reqête pour alimenter le menu déoulant
    $retour_sel = mysql_query("	SELECT 	CONCAT(c.nom, ' ', c.ville) AS Client,
    									c.id_client,
    									CONCAT(cc.lat, ',', cc.lon) AS coord
    							FROM client c
    							JOIN client_coord cc
    							ON c.id_client=cc.client_co
    							GROUP BY c.id_client
    							ORDER BY c.nom");
     
     
    //Requête pour alimenter l'array destination en fixe
    $retour = mysql_query("	SELECT 	c.nom,
    								CONCAT(cc.lat, ',', cc.lon) AS coord
    						FROM client c
    						JOIN client_coord cc
    						ON c.id_client=cc.client_co
    						ORDER BY c.nom
    						LIMIT 0,10");
    $i=1;
    while ($donnees = mysql_fetch_array($retour))
    	{	
    		$destination[$i] = $donnees['coord'];
    		$i++;
    	}
    ?>
        <script> 
     
     
          var map;
          var geocoder;
          var bounds = new google.maps.LatLngBounds();
          var markersArray = [];
     
    	// Array en fixe qui devra être alimenter par la requête ajax
          var destinationA = "<?php echo $destination['1']; ?>";
          var destinationB = "<?php echo $destination['2']; ?>";
    	  var destinationC = "<?php echo $destination['3']; ?>";
    	  var destinationD = "<?php echo $destination['4']; ?>";
    	  var destinationE = "<?php echo $destination['5']; ?>";
    	  //var desti = array["Marseille, France", "Nice, France"];	
          var destinationIcon = "http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=D|FF0000|000000";
          var originIcon = "http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=O|FFFF00|000000";
     
          function initialize() {
            var opts = {
              center: new google.maps.LatLng(55.53, 9.4),
              zoom: 10,
              mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            map = new google.maps.Map(document.getElementById('map'), opts);
            geocoder = new google.maps.Geocoder();
          }
     
     
     
     
     
          function calculateDistances() {
     
    		var origin1 = document.getElementById("start").value;
            var service = new google.maps.DistanceMatrixService();
            service.getDistanceMatrix(
              {
                origins: [origin1],
                destinations: [destinationA, destinationB, destinationC, destinationD, destinationE],
                travelMode: google.maps.TravelMode.DRIVING,
                unitSystem: google.maps.UnitSystem.METRIC,
                avoidHighways: false,
                avoidTolls: false
              }, callback);
          }
     
          function callback(response, status) {
            if (status != google.maps.DistanceMatrixStatus.OK) {
              alert('Error was: ' + status);
            } else {
              var origins = response.originAddresses;
              var destinations = response.destinationAddresses;
              var outputDiv = document.getElementById('outputDiv');
              outputDiv.innerHTML = "";
              deleteOverlays();
     
              for (var i = 0; i < origins.length; i++) {
                var results = response.rows[i].elements;
                addMarker(origins[i], false);
                for (var j = 0; j < results.length; j++) {
                  addMarker(destinations[j], true);
                  outputDiv.innerHTML += "<table border='1'><tr><td><b>" + origins[i] + "</b></td><td>" + destinations[j]
                      + "</td><td>" + results[j].distance.text + "</td><td>"
                      + results[j].duration.text + "</td></tr></table>";
                }
    			outputDiv.innerHTML += "";
              }
            }
          }
     
          function addMarker(location, isDestination) {
            var icon;
            if (isDestination) {
              icon = destinationIcon;
            } else {
              icon = originIcon;
            }
            geocoder.geocode({'address': location}, function(results, status) {
              if (status == google.maps.GeocoderStatus.OK) {
                bounds.extend(results[0].geometry.location);
                map.fitBounds(bounds);
                var marker = new google.maps.Marker({
                  map: map,
                  position: results[0].geometry.location,
                  icon: icon
                });
                markersArray.push(marker);
              } else {
                alert("Geocode was not successful for the following reason: "
                  + status);
              }
            });
          }
     
          function deleteOverlays() {
            if (markersArray) {
              for (i in markersArray) {
                markersArray[i].setMap(null);
              }
              markersArray.length = 0;
            }
          }
     
        </script> 
      </head> 
      <body onLoad="initialize()"> 
     
        <div id="resultat"></div>
        <div id="inputs"> 
          <pre class="prettyprint"> 
     
          </pre> 
          <p>
          <select id="start" onChange="go()"> 
    <?php
            while ($donnees_sel = mysql_fetch_array($retour_sel))
                    {
                            echo '<option value="'.$donnees_sel['coord'].'">'.$donnees_sel['Client'].'</option>';
                    }
    ?>
    </select> 
     
          <button type="button" onClick="calculateDistances();">Calculate
            distances</button></p> 
        </div> 
        <div id="outputDiv"></div> 
        <div id="map"></div> 
      </body> 
    </html>
    Le script en ajax :
    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
     
     
    if(isset($_POST["client"]))
    	{
    		include ('connexion_base.php');
     
    		$tab = explode(',', $_POST['client']);
    		$radius = 2000;
    		$lat_gps = $tab[0];
    		$lon_gps = $tab[1];
     
    		$query = sprintf("	SELECT 	CONCAT(c.nom, ' ', c.ville) AS Client,
    									CONCAT(cc.lat, ',', cc.lon) AS coord,
    								( 6371 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lon ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance 
     
    						FROM client c  
     
    						JOIN client_coord cc
    						ON c.id_client=cc.client_co
     
    						HAVING distance < '%s' 
    						ORDER BY distance ASC  
    						LIMIT 0, 10",
    						mysql_real_escape_string($lat_gps),
    						 mysql_real_escape_string($lon_gps),
    						 mysql_real_escape_string($lat_gps),
    						 mysql_real_escape_string($radius));
    	$result = mysql_query($query);
    	$i=1;
    	while ($row = mysql_fetch_array($result))
    		{  
    			$destination[$i] = $row['coord'];
    			echo $row['Client'].'<br>';
    			$i++;
    		}
     
    	}
    Merci d'avance de votre aide.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    Bonjour,
    il te faut formater la réponse correctement, en recevant une chaine de la forme, pour insertion direct dans la DIV.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <select><option></option><option></option></select>
    ou plus propre un fichier xml

    voir une autocomplétion pas à pas

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Je peux aller chercher mes données avec une fonction :
    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
     
    	 function recup_adresse() {
         var searchUrl = 'genxml.php';
         downloadUrl(searchUrl, function(data) {
           var xml = parseXml(data);
           var markerNodes = xml.documentElement.getElementsByTagName("marker");
           var bounds = new google.maps.LatLngBounds();
           for (var i = 0; i < markerNodes.length; i++) {
             var name = markerNodes[i].getAttribute("name");
             var address = markerNodes[i].getAttribute("address");
             var distance = parseFloat(markerNodes[i].getAttribute("distance"));
             var latlng = new google.maps.LatLng(
                  parseFloat(markerNodes[i].getAttribute("lat")),
                  parseFloat(markerNodes[i].getAttribute("lng")));
           }
     
          });
        }
    Mais comment à partir de cette fonction alimenter les destinations du service getDistanceMatrix qui est dans la fonction calculateDistances ? Il faut que je fusionne les deux fonctions ?

    Merci d'avance

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    je me perds un peu dans ton besoin!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function calculateDistances() {
      var service = new google.maps.DistanceMatrixService();
      service.getDistanceMatrix( {
        origins :     // tu mets ici l'Array des adresses de depart
        destinations: // tu mets ici l'Array des adresses de destination
    ...la suite
    mais est ce que c'est bien cela que tu souhaites ou pas plutôt un calcul simple de trajet, dans ce cas voir du coté de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new google.maps.DirectionsRenderer();

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Bonjour et merci pour ton aide.

    Oui je cherche bien a calculer les destinations entre une ville et plusieurs autres.
    Donc l'origine ne sera pas un array mais les destinations oui.

    Je cherche donc à construire cette array et surtout à le récupérér, j'arrive à sortir les 10 ville les plus proches mais je ne vois comment les mettre dans un array.

    Déjà pour aller chercher les 10 villes les plus proches par ma requête SQL je ne sais pas quel script choisir :

    - Le premier qui est un script en ajax et qui lance ajax.php qui affiche mes résultats dans un div (comment les mettre dans l'array) :
    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
    45
    46
     
     <script type='text/javascript'>
    			function getXhr(){
                                    var xhr = null; 
    				if(window.XMLHttpRequest) // Firefox et autres
    				   xhr = new XMLHttpRequest(); 
    				else if(window.ActiveXObject){ // Internet Explorer 
    				   try {
    			                xhr = new ActiveXObject("Msxml2.XMLHTTP");
    			            } catch (e) {
    			                xhr = new ActiveXObject("Microsoft.XMLHTTP");
    			            }
    				}
    				else { // XMLHttpRequest non supporté par le navigateur 
    				   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
    				   xhr = false; 
    				} 
                                    return xhr;
    			}
     
    			// Quand je sélectionne une ville
    			function go(){
     
    				var xhr = getXhr();
    				// On défini ce qu'on va faire quand on aura la réponse
    				xhr.onreadystatechange = function(){
    					// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    					if(xhr.readyState == 4 && xhr.status == 200){
    						leselect = xhr.responseText;
    						// On se sert de innerHTML pour rajouter les options a la liste
    						document.getElementById('resultat').innerHTML = leselect;
    					}
    				}
     
    				// Ici on va voir comment faire du post
    				xhr.open("POST","ajax.php",true);
    				// ne pas oublier ça pour le post
    				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    				// ne pas oublier de poster les arguments
    				sel = document.getElementById('start');
    				client = sel.options[sel.selectedIndex].value;
    				xhr.send("client="+client);
     
    			}
     
    </script>
    - Le deuxième, avec la fonction downloadUrl qui me génère un fichier xml depuis la page genxml.php mais là aussi comment récupérer les adresses pour le mettre dans mon array de destinations ?

    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
     
     function recup_adresse() {
         var searchUrl = 'genxml.php';
         downloadUrl(searchUrl, function(data) {
           var xml = parseXml(data);
           var markerNodes = xml.documentElement.getElementsByTagName("marker");
           var bounds = new google.maps.LatLngBounds();
           for (var i = 0; i < markerNodes.length; i++) {
             var name = markerNodes[i].getAttribute("name");
             var address = markerNodes[i].getAttribute("address");
             var distance = parseFloat(markerNodes[i].getAttribute("distance"));
             var latlng = new google.maps.LatLng(
                  parseFloat(markerNodes[i].getAttribute("lat")),
                  parseFloat(markerNodes[i].getAttribute("lng")));
           }
     
          });
        }

    Bref je ne suis pas à l'aise avec les fonctions mais j'y travaille...

    Merci d'avance de ton aide.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    Oui je cherche bien a calculer les destinations entre une ville et plusieurs autres.
    Donc l'origine ne sera pas un array mais les destinations oui.
    ceci n'est pas un problème attendu que l'origine peut être mise en tableau.

    Dans la première solution il te faut récupérer une chaine transformable en tableau via la méthode split().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var chaine ="Paris;Bordeaux;Lyon;Marseille"; // separateur ; par exemple
    var tableau = chaine.split(';');
    alert( tableau[1]);
    la fonction devint
    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
      xhr.java-script = function (){
        // On ne fait quelque chose que si on a tout reçu et que le serveur est ok
        if (xhr.readyState == 4 && xhr.status == 200) {
          // declaration des tableaux
          var depart = [];
          var destination = [];
          // recup donnees
          var data = xhr.responseText;
          // mise en tableau des destinations
          // les données doivent etre passees sous la forme d'une string
          // format : "Paris;Bordeaux;Lyon;Marseille;...etc..."
          destination = data.split(';'); 
          // recup adresse de depart
          depart[0] = document.getElementById('start').value;
          //appel de la fonction avec passage des parametres 
          calculateDistances( depart, destination);
        }
      }
    on verra la fonction calculateDistances() après;

    Dans le seconde solution il ne te faut récupérer que ce qui t'est utile, à savoir l'adresse.
    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
    function recup_adresse() {
      var searchUrl = 'genxml.php';
      downloadUrl( searchUrl, function (data) {
        var xml = parseXml(data);
        var markerNodes = xml.documentElement.getElementsByTagName("marker");
        var bounds = new google.maps.LatLngBounds();
        // declaration des tableaux
        var depart = [];
        var destination = [];
        for (var i = 0; i < markerNodes.length; i++) {
          var address = markerNodes[i].getAttribute("address");
          // mise en tableau de l'adresse
          destination.push( address);
        }
        // recup adresse de depart
        depart[0] = document.getElementById('start').value;
        //appel de la fonction    
        calculateDistances( depart, destination);
      });
    }
    tu pourrais aussi récupérer les latlng qui sont également accepté, en Array bien sûr.

    La fonction de récupération des distances maintenant, il faut lui passer en paramètre l'Array départ et l'Array destination, cela donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // passage des origines et destination en parametre
    function calculateDistances( depart, arrivee){
      var service = new google.maps.DistanceMatrixService();
      service.getDistanceMatrix({
        origins : depart,        // Array de string
        destinations : arrivee,  // Array de string
        travelMode : google.maps.TravelMode.DRIVING,
        unitSystem : google.maps.UnitSystem.METRIC,
        avoidHighways : false,
        avoidTolls : false
      }, callback);
    }
    Bref je ne suis pas à l'aise avec les fonctions mais j'y travaille...
    voila une base de travail .

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Merci de ta réponse, j'ai opté pour la première solution et le script fonctionne ! Ça à l'air facile quand tu l'écris mais bon...

    En revanche j'ai plusieurs questions car je souhaite l'amélioré

    La première chose se situe au niveau de mon déroulant qui sert à sélectionner l'origine. La valeur des balise option correspond à mes coordonnées GPS (format : latitude, longitude) J'aimerais que la value soit l'ID du client, pour que je puisse l'exclure de ma requête SQL et récupérer, après, d'autres infos sur le point d'origine.

    Le problème que je rencontre se situe au niveau de la récupération des coordonnées dans le code javascript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    depart[0] = document.getElementById('start').value;
    Car si je passe l'ID du client il ne trouvera aucune correspondance pour le placer sur la carte et calculer les distances.

    Je pourrais passer le paramètre ID dans une fonctions qui irai me chercher les infos ?

    Car la deuxième chose et d'afficher les infos du client sélectionné dans unpetit div.

    Encore merci de ton aide.

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    La value d'une OPTION peut être formatée pour contenir plusieurs informations que l'on peut récupérer via la method split(), tiens encore elle, par exemple.

    Code html : 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
    <!DOCTYPE html>
    <html>
    <head>
    <title>[Method split()]</title>
    <script type="text/javascript">
    function affiche( obj){
      if( obj.value){
        var txt = obj.value.split(';');
        alert( 'Nom : '    +txt[0]
            +'\nAdresse :' +txt[1]
            +'\nVille : '  +txt[2]);
      }
    }
    </script>
    </head>
    <body>
    <div>
    <select onchange = "affiche(this);">
      <option>Choix Client</option>
      <option value="Dupond Pierre; 45 rue AA; Paris">Client #1</option>
      <option value="Durand Jacques; 51 rue BB; Lyon">Client #2</option>
      <option value="Martin Paul; 145 rue CC; Marseille">Client #3</option>
    </select>
    </div>
    </body>
    </html>

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Encore merci pour ta réponse.
    Alors j'ai un petit peu revu le script. C'est à dire que j’utilise JQuery pour aller chercher mes données, et mon script PHP génère dorénavant un XML.

    Voilà ce que ça donne pour le code javascript :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
     
     
    function go1() {
     client = document.getElementById('start').value;
     var depart = [];
     var destination = [];
     var id_des = [];
       $.ajax( {
                type: "POST",
                url: "ajax.php",
    			data: "client=" + client,
                dataType: "xml",
                success: function(xml) 
                         {
                           i=0;
    					   $(xml).find('marker').each(    
    						 function()
                             {
                                var id = $(this).attr('id_client');
    							var coord = $(this).attr('coord');
    							var ville = $(this).attr('ville');
    							depart[0] = $(this).attr('origine_coord');
    							destination[i] = $(this).attr('coord');
    							id_des[i] = $(this).attr('id_client');
                                $('<div class="items" id="link_' + id + '"></div>').html('<a href="">' + id + ' <b>'+ ville + '</b> '+ coord +'</a>').appendTo('#Div_XML');
                             i++;
    						});
     
                         calculateDistances(depart, destination);
    					 }		   
            });
     
    }
     
          var map;
          var geocoder;
          var bounds = new google.maps.LatLngBounds();
          var markersArray = [];
          var destinationIcon = "http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=D|FF0000|000000";
          var originIcon = "http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=O|FFFF00|000000";
     
     
     
     
          function initialize() {
    	    var opts = {
              center: new google.maps.LatLng(47.718884,	-1.378495),
              zoom: 7,
              mapTypeId: google.maps.MapTypeId.ROADMAP
            };
            map = new google.maps.Map(document.getElementById('map'), opts);
            geocoder = new google.maps.Geocoder();
     
          }
     
     
          function calculateDistances(depart, arrivee) {
    	    var service = new google.maps.DistanceMatrixService();
            service.getDistanceMatrix(
              {
                origins: depart,
                destinations: arrivee,
                travelMode: google.maps.TravelMode.DRIVING,
                unitSystem: google.maps.UnitSystem.METRIC,
                avoidHighways: true,
                avoidTolls: false
              }, callback);
          }
     
          function callback(response, status) {
     
            if (status != google.maps.DistanceMatrixStatus.OK) { alert('Error was: ' + status); } 
    		else {
             	var origins = response.originAddresses;
             	var destinations = response.destinationAddresses;
     
    		  	var outputDiv = document.getElementById('EmplacementDeLaListe');
              	outputDiv.innerHTML = "";
     
                deleteOverlays();
     
              	for (var i = 0; i < origins.length; i++) {
                	var results = response.rows[i].elements;
                	addMarker(origins[i], false);
     
    			for (var j = 0; j < results.length; j++) {
     
    				alert(id_des[j]);
    				 var distance = results[j].distance.text;
           			 var duration = results[j].duration.text;
    				addMarker(destinations[j], true);
           			outputDiv.innerHTML += j + ' : ' + destinations[j] + ' | '+ distance +' | '+ duration +'<br>';
     
    				} // fin du for j
    			outputDiv.innerHTML += "";
              } // fin du for i
            } // fin du else
          } // fin fonction
     
     
          function addMarker(location, isDestination) {
            var icon;
            if (isDestination) {
              icon = destinationIcon;
            } else {
              icon = originIcon;
            }
            geocoder.geocode({'address': location}, function(results, status) {
              if (status == google.maps.GeocoderStatus.OK) {
                bounds.extend(results[0].geometry.location);
                map.fitBounds(bounds);
                var marker = new google.maps.Marker({
                  map: map,
                  position: results[0].geometry.location,
                  icon: icon
                });
                markersArray.push(marker);
     
    			var contenuInfoBulle = '<div id="conteneurInfoBulle">' + results[0].geometry.location + '</div>';
    			var infoBulle = new google.maps.InfoWindow({ content: contenuInfoBulle })
    			google.maps.event.addListener(marker, 'click', function() {
        		infoBulle.open(map, marker);
    			 });
     
     
     
     
     
              } else {
               // alert("Geocode was not successful for the following reason: "
                 // + status);
              }
            });
          }
     
          function deleteOverlays() {
            if (markersArray) {
              for (i in markersArray) {
                markersArray[i].setMap(null);
              }
              markersArray.length = 0;
            }
          }

    Bon alors ça fonctionne. Mais...
    Je souhaite afficher des informations sur les destinations trouvé comme l'id client ou le téléphone.

    Dans mon esprit j'avais à l’idée de créer un tableau lorsque je récupère les infos de mon xml (j'ai tenter avec id_des dans la fonction go1)

    Une fois ce tableau créer, l'idée est de récupérer pour chaque destination l'entrée du tableau. Dans la fonction callback on parcours les destinations avec l'indice j mais quand j'appel dans cette fonction id_des[j] autant dire que ça ne marche pas. Je dois encore zapper un truc...

    Merci encore !

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    dans ta fonction go1 tu déclares var id_des =[];ce qui signifie que ton tableau est déclaré en local donc non visible par les autres fonctions.

    nota: tant qu'à utiliser jQuery autant le faire au mieux, à voir http://javascript.developpez.com/faq...ombreIteration, même si c'est peut être beaucoup juste pour une requête.

    Ce lien peut t'intéresser : http://javascript.developpez.com/faq...ipt/?page=Ajax, mais je pense que tu as déjà du le lire...

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Merci !!
    Bon c'est peut être pas optimisé à fond mais ça fonctionne.

    Maintenant je cherche, dans un premier temps, à faire apparaître un cercle sur ma carte (j'y arrive) Le rayon de ce dernier sera modifiable par un menu déroulant (j'y arrive moins)

    Alors voilà comment j'ai procédé, dans ma fonction initialize j'ai ajouté un cercle avec par défaut un rayon fixe que j'ai centré au milieu de la carte pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var circle = new google.maps.Circle({
         	center: centreCarte,
              	map: map,
              	radius: 80000,
    			fillColor: "#FF0000",
    			 fillOpacity: .3,
    			 strokeColor: "#FF0000",
    			  strokeOpacity: 1.0,
    			  strokeWeight: 1
     
    			});
     
    rayon(circle); // appel de la fonction rayon, voir ci-dessous
    J'ai ensuite ajouté un select qui servira à contrôler le rayon de mon cercle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <select id="rayon" name="rayon" onChange="rayon()">
                <option value="80000">80000</option>
                <option value="160000">160000</option>
                </select>

    Il appel la fonction rayon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	  function rayon()
     	{
    		var ray = document.getElementById('rayon').value;
    		//alert(ray);
    		circle.setRadius(ray);
     
     	}
    Bon je pense que je me suis encore un peu mélanger avec les fonctions car ça ne marche point...

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    Citation Envoyé par dam28800
    Bon c'est peut être pas optimisé à fond mais ça fonctionne.
    tant mieux !

    Pour la suite il aurait peut être été préférable d'ouvrir une autre discussion, mais bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function rayon(){
      var ray = document.getElementById('rayon').value;
      //alert(ray);
      circle.setRadius(ray);
    }
    dans la fonction ci dessus
    - ray est du type String
    - setRadius attend un paramètre de type Number
    ...donc il faut convertir via la fonction parseInt()

Discussions similaires

  1. [Python 2.X] API Google Maps Distance Matrix
    Par MAX91 dans le forum Général Python
    Réponses: 0
    Dernier message: 07/04/2015, 22h21
  2. Réponses: 6
    Dernier message: 01/08/2011, 16h00
  3. [Google Maps] Distance matrix avec c#
    Par martm62 dans le forum APIs Google
    Réponses: 2
    Dernier message: 29/07/2011, 18h57
  4. [Google Maps] Google Distance Matrix API et jQuery : la requête ne semble pas fonctionner
    Par [ZiP] dans le forum APIs Google
    Réponses: 2
    Dernier message: 19/05/2011, 08h50

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