-1

I have total 6 markers and it is connected with each other with polyline, I want to show distance between 2 markers in infowindown, on click on polyline, i am able to show that but it always show last 2 marker distance, here i have added my code in snippet, can anyone please look into it and help me where i am going wrong, It alwasy show me this distance 1 hour 2 mins 44.9 km

Distance between markers :

1)41 mins 22.8 km
2)17 mins 5.9 km
3)10 mins 4.1 km
4)39 mins 28.0 km
5)1 hour 2 mins 44.9 km

var geocoder;
var map;
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var locations = [
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Maroubra Beach', -33.950198, 151.259302, 1],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
];
var infowindow;


function initialize() {
  directionsDisplay = new google.maps.DirectionsRenderer({
    suppressPolylines: true,
    infoWindow: infowindow,
    polylineOptions: {
      strokeColor: '#C83939',
      strokeOpacity: 0,
      strokeWeight: 1,
      icons: [{
        icon: {
          path: google.maps.SymbolPath.CIRCLE,
          fillColor: '#C83939',
          scale: 3,
          strokeOpacity: 1
        },
        offset: '0',
        repeat: '15px'
      }]
    }
  });


  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 10,
    center: new google.maps.LatLng(-33.92, 151.25),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });
  directionsDisplay.setMap(map);
  var infowindow = new google.maps.InfoWindow();

  var marker, i;
  var request = {
    travelMode: google.maps.TravelMode.DRIVING
  };
  for (i = 0; i < locations.length; i++) {
    marker = new google.maps.Marker({
      position: new google.maps.LatLng(locations[i][1], locations[i][2]),
    });

    google.maps.event.addListener(marker, 'click', (function(marker, i) {
      return function() {
        infowindow.setContent(locations[i][0]);
        infowindow.open(map, marker);
      }
    })(marker, i));

    if (i == 0)
      request.origin = marker.getPosition();
    else if (i == locations.length - 1)
      request.destination = marker.getPosition();
    else {
      if (!request.waypoints)
        request.waypoints = [];
      request.waypoints.push({
        location: marker.getPosition(),
        stopover: true
      });
    }

  }
  directionsService.route(request, function(response, status) {
    if (status == google.maps.DirectionsStatus.OK) {
      //console.log(response);
      directionsDisplay.setDirections(response);
      var route = response.routes[0];
      var summaryPanel = document.getElementById("directions_panel");
      /************ New Code **********/
      directionsDisplay.setMap(map);
      directionsDisplay.setPanel(summaryPanel);
      /******************************/
      summaryPanel.innerHTML = "";
      // For each route, display summary information.



      /************* New Code *************/
      var polylineOptions = {
        strokeColor: '#C83939',
        strokeOpacity: 1,
        strokeWeight: 4
      };
      var polylines = [];
      for (var i = 0; i < polylines.length; i++) {
        polylines[i].setMap(null);
      }
      /***********************************/





      for (var i = 0; i < route.legs.length; i++) {
        var routeSegment = i + 1;
        summaryPanel.innerHTML += "<b>Route Segment: " + routeSegment + "</b><br />";
        summaryPanel.innerHTML += route.legs[i].start_address + " to ";
        summaryPanel.innerHTML += route.legs[i].end_address + "<br />";
        summaryPanel.innerHTML += route.legs[i].distance.text + "<br /><br />";
        /*********** INFOWINDOW *****************/
        var legs = route.legs;
        var steps = legs[i].steps;
        var stepPath = [];
        /************ New Code **********/
        var stepPolyline = new google.maps.Polyline(polylineOptions);
        /*******************************/

        for (j = 0; j < steps.length; j++) {
          var nextSegment = steps[j].path;

          for (k = 0; k < nextSegment.length; k++) {
            stepPath.push(nextSegment[k]);
            /************ New Code **********/
            stepPolyline.getPath().push(nextSegment[k]);
            /*******************************/
          }
          /************ New Code **********/
          stepPolyline.setMap(map);
          polylines.push(stepPolyline);
          /*******************************/

        }
        var center = stepPath[Math.floor(stepPath.length / 2)];
        var stepIW = new google.maps.InfoWindow();
        var testtext = response.routes[0].legs[i].duration.text + "<br>" + response.routes[0].legs[i].distance.text;
        console.log(testtext);
        /************ New Code **********/
        google.maps.event.addListener(stepPolyline, 'click', function(evt) {
          console.log('sdsd');
          stepIW.setContent(testtext);
          stepIW.setPosition(evt.latLng);
          stepIW.open(map, stepPolyline);
        });
        /*******************************/
      }
      computeTotalDistance(response);
    } else {
      alert("directions response " + status);
    }
  });
}

function attachInstructionText(stepDisplay, marker, text, map) {
  google.maps.event.addListener(marker, 'click', function() {
    // Open an info window when the marker is clicked on, containing the text
    // of the step.
    stepDisplay.setContent(text);
    stepDisplay.open(map, marker);
  });
}

function computeTotalDistance(result) {
  var totalDist = 0;
  var totalTime = 0;
  var myroute = result.routes[0];
  for (i = 0; i < myroute.legs.length; i++) {
    totalDist += myroute.legs[i].distance.value;
    totalTime += myroute.legs[i].duration.value;
  }
  totalDist = totalDist / 1000.
  document.getElementById("total").innerHTML = "total distance is: " + totalDist + " km<br>total time is: " + (totalTime / 60).toFixed(2) + " minutes";
}
google.maps.event.addDomListener(window, "load", initialize);
<script src="https://maps.google.com/maps/api/js?libraries=places"></script>
<div id="map" style="float:left;width: 800px; height: 400px;"></div>
<div id="control_panel" style="display:none;float:right;width:0%;text-align:left;padding-top:20px">
  <div id="directions_panel" style="margin:20px;background-color:#FFEE77;"></div>
  <div id="total"></div>
</div>
geocodezip
  • 158,664
  • 13
  • 220
  • 245
Tirkesh Turkesh
  • 231
  • 3
  • 14
  • 2
    This is the same problem as in [Infowindow works only for 1 route, it is not working for other 3 routes in google map](https://stackoverflow.com/questions/50450850/infowindow-works-only-for-1-route-it-is-not-working-for-other-3-routes-in-googl) – geocodezip May 31 '18 at 13:55

1 Answers1

1
  1. you need to associate the content of the infowindow displayed by the click listener with the polyline (currently that text is left at the last value set, so that appears whenever the click function is triggered, regardless of the polyline that is clicked on. One way of doing the association is with function closure (as done for markers in this question: Google Maps JS API v3 - Simple Multiple Marker Example). Note also that the second argument for InfoWindow.open() only works out of the box for google.maps.Marker objects.

    google.maps.event.addListener(legPolyline, 'click', (function(text) {
      return function(evt) {
        console.log('sdsd:' + text);
        stepIW.setContent(text+"<br>"+evt.latLng.toUrlValue(6));
        stepIW.setPosition(evt.latLng);
        stepIW.open(map);
      }
    }(testtext)));
    
  2. The "last route" covers most of the places I would click (which returns the final value)

proof of concept fiddle

enter image description here

code snippet:

var geocoder;
var map;
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var locations = [
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Maroubra Beach', -33.950198, 151.259302, 1],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
];
var infowindow;
var colors = ["#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#00FFFF", "#FF00FF"]

function initialize() {
  directionsDisplay = new google.maps.DirectionsRenderer({
    suppressPolylines: true,
    infoWindow: infowindow,
  });


  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 10,
    center: new google.maps.LatLng(-33.92, 151.25),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });
  directionsDisplay.setMap(null);
  var infowindow = new google.maps.InfoWindow();

  var marker, i;
  var request = {
    travelMode: google.maps.TravelMode.DRIVING
  };
  for (i = 0; i < locations.length; i++) {
    marker = new google.maps.Marker({
      position: new google.maps.LatLng(locations[i][1], locations[i][2]),
    });

    google.maps.event.addListener(marker, 'click', (function(marker, i) {
      return function() {
        infowindow.setContent(locations[i][0]);
        infowindow.open(map, marker);
      }
    })(marker, i));

    if (i == 0)
      request.origin = marker.getPosition();
    else if (i == locations.length - 1)
      request.destination = marker.getPosition();
    else {
      if (!request.waypoints)
        request.waypoints = [];
      request.waypoints.push({
        location: marker.getPosition(),
        stopover: true
      });
    }

  }
  directionsService.route(request, function(response, status) {
    if (status == google.maps.DirectionsStatus.OK) {
      //console.log(response);
      directionsDisplay.setDirections(response);
      var route = response.routes[0];
      var summaryPanel = document.getElementById("directions_panel");
      /************ New Code **********/
      directionsDisplay.setMap(map);
      directionsDisplay.setPanel(summaryPanel);
      /******************************/
      summaryPanel.innerHTML = "";
      // For each route, display summary information.



      /************* New Code *************/
      var polylineOptions = {
        strokeColor: '#C83939',
        strokeOpacity: 1,
        strokeWeight: 4
      };
      var polylines = [];
      for (var i = 0; i < polylines.length; i++) {
        polylines[i].setMap(null);
      }
      /***********************************/

      for (var i = 0; i < route.legs.length; i++) {
        var routeSegment = i + 1; // leg
        summaryPanel.innerHTML += "<b>Route Segment: " + routeSegment + "</b><br />";
        summaryPanel.innerHTML += route.legs[i].start_address + " to ";
        summaryPanel.innerHTML += route.legs[i].end_address + "<br />";
        summaryPanel.innerHTML += route.legs[i].distance.text + "<br /><br />";
        /*********** INFOWINDOW *****************/
        var legs = route.legs;
        var steps = legs[i].steps;
        var legPath = [];
        /************ New Code **********/
        polylineOptions.strokeColor = colors[i];
        var legPolyline = new google.maps.Polyline(polylineOptions);
        console.log("leg:" + i);
        /*******************************/

        for (j = 0; j < steps.length; j++) {
          var nextSegment = steps[j].path;

          for (k = 0; k < nextSegment.length; k++) {
            legPath.push(nextSegment[k]);
            /************ New Code **********/
            legPolyline.getPath().push(nextSegment[k]);
            /*******************************/
          }
        }
        /************ New Code **********/
        legPolyline.setMap(map);
        polylines.push(legPolyline);
        console.log("polylines.length=" + polylines.length);
        /*******************************/
        var stepIW = new google.maps.InfoWindow();
        var testtext = response.routes[0].legs[i].duration.text + "<br>" + response.routes[0].legs[i].distance.text;
        console.log(testtext);
        /************ New Code **********/
        google.maps.event.addListener(legPolyline, 'click', (function(text) {
          return function(evt) {
            console.log('sdsd:' + text);
            stepIW.setContent(text + "<br>" + evt.latLng.toUrlValue(6));
            stepIW.setPosition(evt.latLng);
            stepIW.open(map);
          }
        }(testtext)));
        /*******************************/
      }
      computeTotalDistance(response);
    } else {
      alert("directions response " + status);
    }
  });
}

function attachInstructionText(stepDisplay, marker, text, map) {
  google.maps.event.addListener(marker, 'click', function() {
    // Open an info window when the marker is clicked on, containing the text
    // of the step.
    stepDisplay.setContent(text);
    stepDisplay.open(map, marker);
  });
}

function computeTotalDistance(result) {
  var totalDist = 0;
  var totalTime = 0;
  var myroute = result.routes[0];
  for (i = 0; i < myroute.legs.length; i++) {
    totalDist += myroute.legs[i].distance.value;
    totalTime += myroute.legs[i].duration.value;
  }
  totalDist = totalDist / 1000.
  document.getElementById("total").innerHTML = "total distance is: " + totalDist + " km<br>total time is: " + (totalTime / 60).toFixed(2) + " minutes";
}
google.maps.event.addDomListener(window, "load", initialize);
html,
body,
#map {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
<script src="https://maps.google.com/maps/api/js?libraries=places"></script>
<div id="map" style="float:left;width: 800px; height: 400px;"></div>
<div id="control_panel" style="display:none;float:right;width:0%;text-align:left;padding-top:20px">
  <div id="directions_panel" style="margin:20px;background-color:#FFEE77;"></div>
  <div id="total"></div>
</div>
geocodezip
  • 158,664
  • 13
  • 220
  • 245