Google Maps API Directions - Move directions link to sidebar

后端 未结 1 518
不思量自难忘°
不思量自难忘° 2021-01-16 22:57

Currently when you click on a marker, a clickable get directions link comes up along with title and address. I would also like the get directions link to appear on the side

相关标签:
1条回答
  • 2021-01-16 23:21

    You need to use the "sorted" version of the address, not the version in the input.

    // save title and address in record for sorting
    for (var i = 0; i < closest.length; i++) {
      results[i].title = closest[i].title;
      results[i].address = closest[i].address;
      results[i].idx_closestMark = i;
    }
    results.sort(sortByDistDM);
    // use the stored values in the output to the sidebar
    for (var i = 0;
      ((i < numberOfResults) && (i < closest.length)); i++) {
      closest[i].setMap(map);
      outputDiv.innerHTML += "<a href='javascript:google.maps.event.trigger(closest[" + results[i].idx_closestMark + "],\"click\");'>" + results[i].title + '</a><br>' + results[i].address + "<br>" + results[i].distance.text + ' approximately ' + results[i].duration.text + "<br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;" + results[i].address + "&quot;);'>Get Directions</a><br><hr>"
    }
    

    sort function:

    function sortByDistDM(a, b) {
      return (a.distance.value - b.distance.value)
    }
    

    proof of concept fiddle

    code snippet:

    var locations = [
      ["John Doe", "145 Rock Ridge Road, Chester, NY ", "41.314926,-74.270134", "http://maps.google.com/mapfiles/ms/icons/blue.png"],
      ["Jim Smith", "12 Williams Rd, Montvale, NJ ", "41.041599,-74.019554", "http://maps.google.com/mapfiles/ms/icons/green.png"],
      ["John Jones", "689 Fern St Township of Washington, NJ ", "40.997704,-74.050598", "http://maps.google.com/mapfiles/ms/icons/yellow.png"],
    
    ];
    // alert(locations.length);
    
    var geocoder = null;
    var map = null;
    var customerMarker = null;
    var gmarkers = [];
    var closest = [];
    var directionsDisplay = new google.maps.DirectionsRenderer();;
    var directionsService = new google.maps.DirectionsService();
    var map;
    
    function initialize() {
      // alert("init");
      geocoder = new google.maps.Geocoder();
      map = new google.maps.Map(document.getElementById('map'), {
        zoom: 9,
        center: new google.maps.LatLng(52.6699927, -0.7274620),
        mapTypeId: google.maps.MapTypeId.ROADMAP
      });
      var infowindow = new google.maps.InfoWindow();
      var marker, i;
      var bounds = new google.maps.LatLngBounds();
      document.getElementById('info').innerHTML = "found " + locations.length + " locations<br>";
      for (i = 0; i < locations.length; i++) {
        var coordStr = locations[i][2];
        var coords = coordStr.split(",");
        var pt = new google.maps.LatLng(parseFloat(coords[0]), parseFloat(coords[1]));
        bounds.extend(pt);
        marker = new google.maps.Marker({
          position: pt,
          map: map,
          icon: locations[i][3],
          address: locations[i][1],
          title: locations[i][0],
          html: locations[i][0] + "<br>" + locations[i][1] + "<br><br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;" + locations[i][1] + "&quot;);'>Get Directions</a>"
        });
        gmarkers.push(marker);
        google.maps.event.addListener(marker, 'click', (function(marker, i) {
            return function() {
              infowindow.setContent(marker.html);
              infowindow.open(map, marker);
            }
          })
          (marker, i));
      }
      map.fitBounds(bounds);
    
    }
    
    function codeAddress() {
      var address = document.getElementById('address').value;
      geocoder.geocode({
        'address': address
      }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          map.setCenter(results[0].geometry.location);
          if (customerMarker) customerMarker.setMap(null);
          customerMarker = new google.maps.Marker({
            map: map,
            position: results[0].geometry.location
          });
          closest = findClosestN(results[0].geometry.location, 12);
          // get driving distance
          closest = closest.splice(0, 12);
          calculateDistances(results[0].geometry.location, closest, 12);
        } else {
          alert('Geocode was not successful for the following reason: ' + status);
        }
      });
    }
    
    function findClosestN(pt, numberOfResults) {
      var closest = [];
      document.getElementById('info').innerHTML += "processing " + gmarkers.length + "<br>";
      for (var i = 0; i < gmarkers.length; i++) {
        gmarkers[i].distance = google.maps.geometry.spherical.computeDistanceBetween(pt, gmarkers[i].getPosition());
        document.getElementById('info').innerHTML += "process " + i + ":" + gmarkers[i].getPosition().toUrlValue(6) + ":" + gmarkers[i].distance.toFixed(2) + "<br>";
        gmarkers[i].setMap(null);
        closest.push(gmarkers[i]);
        closest.sort(sortByDist);
      }
    
      return closest;
    }
    
    function sortByDist(a, b) {
      return (a.distance - b.distance)
    
    }
    
    function calculateDistances(pt, closest, numberOfResults) {
      var service = new google.maps.DistanceMatrixService();
      var request = {
        origins: [pt],
        destinations: [],
        travelMode: google.maps.TravelMode.DRIVING,
        unitSystem: google.maps.UnitSystem.IMPERIAL,
        avoidHighways: false,
        avoidTolls: false
      };
      for (var i = 0; i < closest.length; i++) {
        request.destinations.push(closest[i].getPosition());
      }
      service.getDistanceMatrix(request, function(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('side_bar');
          outputDiv.innerHTML = '';
    
          var results = response.rows[0].elements;
          // save title and address in record for sorting
          for (var i = 0; i < closest.length; i++) {
            results[i].title = closest[i].title;
            results[i].address = closest[i].address;
            results[i].idx_closestMark = i;
          }
          results.sort(sortByDistDM);
          for (var i = 0;
            ((i < numberOfResults) && (i < closest.length)); i++) {
            closest[i].setMap(map);
    
            outputDiv.innerHTML += "<a href='javascript:google.maps.event.trigger(closest[" + results[i].idx_closestMark + "],\"click\");'>" + results[i].title + '</a><br>' + results[i].address + "<br>" + results[i].distance.text + ' approximately ' + results[i].duration.text + "<br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;" + results[i].address + "&quot;);'>Get Directions</a><br><hr>"
    
          }
        }
      });
    }
    
    function getDirections(origin, destination) {
      var request = {
        origin: origin,
        destination: destination,
        travelMode: google.maps.DirectionsTravelMode.DRIVING
      };
      directionsService.route(request, function(response, status) {
        if (status == google.maps.DirectionsStatus.OK) {
          directionsDisplay.setMap(map);
          directionsDisplay.setDirections(response);
          directionsDisplay.setPanel(document.getElementById('side_bar'));
        }
      });
    }
    
    function sortByDistDM(a, b) {
      return (a.distance.value - b.distance.value)
    }
    
    google.maps.event.addDomListener(window, 'load', initialize);
    html,
    body,
    #map_canvas {
      margin: 0;
      padding: 0;
      height: 100%;
    }
    table,tr,td {
      height: 100%;
      }
    
    
    .text {
      width: 300px;
      height: 500px;
      background-color: white;
      overflow: scroll;
      overflow-x: hidden;
    }
    <script src="https://maps.googleapis.com/maps/api/js?libraries=geometry&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
    <table border="0">
      <tr>
        <td>
          <div id="map" style="height: 100%; width:400px;"></div>
        </td>
        <td>
          <div id="side_bar" class='text'> </div>
        </td>
      </tr>
    </table>
    
    <input id="address" type="text" value="Paramus, NJ" />
    <input type="button" value="Search" onclick="codeAddress();" />
    <div id="info"></div>

    0 讨论(0)
提交回复
热议问题