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

Bibliothèques & Frameworks Discussion :

Afficher l'itinéraire entre deux adresses [LeafLet]


Sujet :

Bibliothèques & Frameworks

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Points : 18
    Points
    18
    Par défaut Afficher l'itinéraire entre deux adresses
    Bonjour,

    Dans mon code ci-dessous, l'autocomplete des 2 adresses fonctionnes, cependant après avoir introduit et confirmer les 2 adresses quand je clique sur "Afficher sur la carte", les 2 adresses ne sont pas marquées comme prévu sur la carte, l'itinéraire n'est pas tracé et la distance et le temps de trajet ne s'affiche pas, est-ce que quelqu'un sait où se situe mon erreur svp ?

    Pour tester le lien est http://lc-sd.be

    Merci d'avance.

    Voici le code :

    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
    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
    <!DOCTYPE html>
    <html lang="fr">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Carte</title>
        <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
        <link rel="stylesheet" href="https://unpkg.com/leaflet-routing-machine/dist/leaflet-routing-machine.css" />
        <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
        <script src="https://unpkg.com/leaflet-routing-machine/dist/leaflet-routing-machine.js"></script>
        <style>
            #map {
                height: 500px;
                width: 100%;
            }
            #results {
                height: 200px;
                width: 300px;
                overflow-y: auto;
            }
        </style>
    </head>
    <body>
            <center><u><b>Trajet :</b></u></center><br /><br />
        <form id="addressForm">
            <label for="address1">Adresse de départ : </label>
            <input type="text" id="address1" name="address1" oninput="autocompleteAddress('address1', 'results1')"><br /><br />
            <div id="results1"></div>
            <label for="address2">Adresse d'arrivée : </label>
            <input type="text" id="address2" name="address2" oninput="autocompleteAddress('address2', 'results2')"><br /><br />
            <div id="results2"></div>
            <button type="button" onclick="updateMap()">Afficher sur la carte</button><br />
        </form><br /><br />
        <div id="distance">Distance: </div>
        <div id="time">Temps: </div>
        <div id="map"></div>
        <script>
            var waypoints = [{}, {}]; // Stocker les coordonnées des adresses
     
            // Initialiser la carte et définir ses options
            var map = L.map('map').setView([50.8504500, 4.3487800], 13); // Coordonnées pour Bruxelles
     
            // Ajouter la couche OpenStreetMap
            L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
                attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
            }).addTo(map);
     
            // Ajouter le contrôle de routage
            var control = L.Routing.control({
                routeWhileDragging: true,
                geocoder: L.Control.Geocoder.nominatim(),
                router: new L.Routing.osrmv1({
                    serviceUrl: 'https://router.project-osrm.org/route/v1'
                }),
                createMarker: function(i, wp) {
                    var color = i == 0 ? 'blue' : 'red';
                    var icon = new L.Icon({
                        iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-' + color + '.png',
                        shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
                        iconSize: [25, 41],
                        iconAnchor: [12, 41],
                        popupAnchor: [1, -34],
                        shadowSize: [41, 41]
                    });
                    return L.marker(wp.latLng, {icon: icon}).bindPopup('Adresse ' + (i + 1));
                },
                lineOptions: {
                    styles: [{color: 'blue', opacity: 0.6, weight: 4}]
                },
                addWaypoints: false
            }).addTo(map);
     
            // Ajouter un gestionnaire d'événements pour l'événement 'routesfound'
            control.on('routesfound', function(e) {
                var routes = e.routes;
                var summary = routes[0].summary;
                // Afficher la distance (en kilomètres) et le temps (en minutes)
                var distance = (summary.totalDistance / 1000).toFixed(2);
                var time = (summary.totalTime / 60).toFixed(2);
                document.getElementById('distance').innerHTML = 'Distance: ' + distance + ' km';
                document.getElementById('time').innerHTML = 'Temps: ' + time + ' min';
                var routeShape = routes[0].coordinates;
                var line = L.Routing.line(routes[0]);
                var marker = L.marker(routeShape[routeShape.length - 1]).bindPopup('Distance: ' + distance + ' km<br>Temps: ' + time + ' min');
                line.addTo(map);
                marker.addTo(map);
            });
     
            function updateMap() {
                var lat1 = waypoints[0].lat || 50.8504500; // Coordonnées par défaut pour Bruxelles
                var lon1 = waypoints[0].lon || 4.3487800;
                map.setView([lat1, lon1], 13);
                control.spliceWaypoints(0, 1, L.latLng(lat1, lon1));
                L.marker([lat1, lon1], {icon: new L.Icon({iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-blue.png', shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41]})}).addTo(map).bindPopup('Adresse de départ');
     
                var lat2 = waypoints[1].lat || 50.8504500;
                var lon2 = waypoints[1].lon || 4.3487800;
                control.spliceWaypoints(control.getWaypoints().length - 1, 1, L.latLng(lat2, lon2));
                L.marker([lat2, lon2], {icon: new L.Icon({iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-red.png', shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41]})}).addTo(map).bindPopup('Adresse d\'arrivée');
            }
     
            function autocompleteAddress(inputId, resultsId) {
                var address = document.getElementById(inputId).value;
     
                fetch(`https://nominatim.openstreetmap.org/search?format=json&viewbox=-31.268,28.626,39.659,81.008&q=${address}`)
                    .then(response => response.json())
                    .then(data => {
                        var resultsDiv = document.getElementById(resultsId);
                        resultsDiv.innerHTML = '';
     
                        data.forEach(item => {
                            var div = document.createElement('div');
                            div.textContent = item.display_name;
                            div.onclick = function() {
                                document.getElementById(inputId).value = item.display_name;
                                waypoints[inputId === 'address1' ? 0 : 1] = {lat: parseFloat(item.lat), lon: parseFloat(item.lon)};
                                resultsDiv.innerHTML = '';
                            };
                            resultsDiv.appendChild(div);
                        });
                    });
            }
        </script>
    </body>
    </html>

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 108
    Points : 44 921
    Points
    44 921
    Par défaut
    Bonjour,
    visiblement il te manque le script :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script>

    Regarde dans la console, touche F12 du navigateur.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2012
    Messages : 14
    Points : 18
    Points
    18
    Par défaut Merci
    Un grand merci, ça fonctionne pour ceux que cela intéresse voici le code final :

    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
    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
    <!DOCTYPE html>
    <html lang="fr">
    <head>
       <meta charset="UTF-8">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
       <title>Carte</title>
       <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
       <link rel="stylesheet" href="https://unpkg.com/leaflet-routing-machine/dist/leaflet-routing-machine.css" />
       <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
       <script src="https://unpkg.com/leaflet-routing-machine/dist/leaflet-routing-machine.js"></script>
       <script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script>
       <style>
           #map {
               height: 500px;
               width: 100%;
           }
           #results {
               height: 200px;
               width: 300px;
               overflow-y: auto;
           }
       </style>
    </head>
    <body>
       <center><u><b>Calculateur d'itinéraire :</b></u></center><br /><br />
       <form id="addressForm">
           <label for="address1">Adresse de départ : </label>
           <input type="text" id="address1" name="address1" oninput="autocompleteAddress('address1', 'results1')"><br /><br />
           <div id="results1"></div>
           <label for="address2">Adresse d'arrivée : </label>
           <input type="text" id="address2" name="address2" oninput="autocompleteAddress('address2', 'results2')"><br /><br />
           <div id="results2"></div>
           <button type="button" onclick="updateMap()">Calculer l'itinéraire</button><br />
       </form><br /><br />
       <div id="distance">Distance: </div>
       <div id="time">Temps: </div>
       <div id="map"></div>
       <script>
           var waypoints = [{}, {}]; // Stocker les coordonnées des adresses
     
           // Initialiser la carte et définir ses options
           var map = L.map('map').setView([50.8504500, 4.3487800], 13); // Coordonnées pour Bruxelles
           console.log('Carte initialisée');
     
           // Ajouter la couche OpenStreetMap
           L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
               attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
           }).addTo(map);
           console.log('Couche OpenStreetMap ajoutée');
     
           // Ajouter le contrôle de routage
           var control = L.Routing.control({
               routeWhileDragging: true,
               geocoder: L.Control.Geocoder.nominatim(),
               router: new L.Routing.osrmv1({
                   serviceUrl: 'https://router.project-osrm.org/route/v1',
                   language: 'fr' // Définir la langue sur français
               }),
               createMarker: function(i, wp) {
                   var color = i == 0 ? 'blue' : 'red';
                   var icon = new L.Icon({
                       iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-' + color + '.png',
                       shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
                       iconSize: [25, 41],
                       iconAnchor: [12, 41],
                       popupAnchor: [1, -34],
                       shadowSize: [41, 41]
                   });
                   console.log('Marker créé pour', wp.latLng);
                   return L.marker(wp.latLng, {icon: icon}).bindPopup('Adresse ' + (i + 1));
               },
               lineOptions: {
                   styles: [{color: 'green', opacity: 0.6, weight: 4}]
               },
               addWaypoints: false
           }).addTo(map);
           console.log('Contrôle de routage ajouté');
     
           // Ajouter un gestionnaire d'événements pour l'événement 'routesfound'
           control.on('routesfound', function(e) {
               console.log('Routes found:', e.routes);
               var routes = e.routes;
               var summary = routes[0].summary;
               // Afficher la distance (en kilomètres) et le temps (en minutes)
               var distance = (summary.totalDistance / 1000).toFixed(2);
               var time = (summary.totalTime / 60).toFixed(2);
               document.getElementById('distance').innerHTML = 'Distance: ' + distance + ' km';
               document.getElementById('time').innerHTML = 'Temps: ' + time + ' min';
               console.log('Distance et temps mis à jour:', distance, time);
           });
     
           function updateMap() {
               var lat1 = waypoints[0].lat || 50.8504500; // Coordonnées par défaut pour Bruxelles
               var lon1 = waypoints[0].lon || 4.3487800;
               console.log('Waypoint 1:', lat1, lon1);
               control.spliceWaypoints(0, 1, L.latLng(lat1, lon1));
     
               var lat2 = waypoints[1].lat || 50.8504500;
               var lon2 = waypoints[1].lon || 4.3487800;
               console.log('Waypoint 2:', lat2, lon2);
               control.spliceWaypoints(control.getWaypoints().length - 1, 1, L.latLng(lat2, lon2));
           }
     
           function autocompleteAddress(inputId, resultsId) {
               var address = document.getElementById(inputId).value;
               console.log('Autocomplete pour:', address);
     
               fetch(`https://nominatim.openstreetmap.org/search?format=json&viewbox=-31.268,28.626,39.659,81.008&q=${address}`)
                   .then(response => response.json())
                   .then(data => {
                       console.log('Données reçues:', data);
                       var resultsDiv = document.getElementById(resultsId);
                       resultsDiv.innerHTML = '';
     
                       data.forEach(item => {
                           var div = document.createElement('div');
                           div.textContent = item.display_name;
                           div.onclick = function() {
                               document.getElementById(inputId).value = item.display_name;
                               waypoints[inputId === 'address1' ? 0 : 1] = {lat: parseFloat(item.lat), lon: parseFloat(item.lon)};
                               console.log('Waypoint sélectionné:', waypoints);
                               resultsDiv.innerHTML = '';
                           };
                           resultsDiv.appendChild(div);
                       });
                   });
           }
       </script>
    </body>
    </html>

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

Discussions similaires

  1. [Lazarus] Calculer distance entre deux adresses
    Par jojo86 dans le forum Lazarus
    Réponses: 8
    Dernier message: 17/03/2019, 23h36
  2. Calculer la distance entre deux adresse situé dans un fichier Excel,
    Par yoryas dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 06/10/2017, 11h04
  3. [Google Maps] tracé l'itinéraire entre deux adresses
    Par jet-anass dans le forum APIs Google
    Réponses: 1
    Dernier message: 20/06/2012, 20h53
  4. Calcul du nombre d'octets entre deux adresses
    Par IMPRO dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 21/12/2009, 19h18
  5. Recherche de la distance km entre deux adresses
    Par nanath02 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 15/10/2009, 22h35

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