Google Maps JavaScript API - Show INACTIVE alterna

2019-09-21 08:08发布

问题:

I am using the Google Maps JavaScript API and am providing directions with alternative routes.

I would like to display the INACTIVE alternative routes in a gray color, and the current ACTIVE route in a neon green color.

How can I target the inactive and active route states and control their colors?

I've been able to change the alternative route colors using Geocodezip's example but now I need to target inactive and active states.

Here's an example of the functionality I'm going for

for (var j = 0; j < response.routes.length; j++) {
    var path = new google.maps.MVCArray();
    polyArray.push(new google.maps.Polyline({
        map: map,
        strokeColor: colors[j],
        strokeOpacity: 1.0,
        strokeWeight: 5
    }));

    polyArray[polyArray.length - 1].setPath(path);
    for (var i = 0, len = response.routes[j].overview_path.length; i < len; i++) {
        path.push(response.routes[j].overview_path[i]);
        }
    }

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Directions service</title>
    <style>
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
      #map {
        height: 100%;
      }
      #floating-panel {
        position: absolute;
        top: 10px;
        left: 25%;
        z-index: 5;
        background-color: #fff;
        padding: 5px;
        border: 1px solid #999;
        text-align: center;
        font-family: 'Roboto','sans-serif';
        line-height: 30px;
        padding-left: 10px;
      }
    </style>
  </head>
  <body>
    <div id="floating-panel">
    <b>Start: </b>
    <select id="start">
      <option value="chicago, il">Chicago</option>
      <option value="st louis, mo">St Louis</option>
      <option value="joplin, mo">Joplin, MO</option>
      <option value="oklahoma city, ok">Oklahoma City</option>
      <option value="amarillo, tx">Amarillo</option>
      <option value="gallup, nm">Gallup, NM</option>
      <option value="flagstaff, az">Flagstaff, AZ</option>
      <option value="winona, az">Winona</option>
      <option value="kingman, az">Kingman</option>
      <option value="barstow, ca">Barstow</option>
      <option value="san bernardino, ca">San Bernardino</option>
      <option value="los angeles, ca">Los Angeles</option>
    </select>
    <b>End: </b>
    <select id="end">
      <option value="chicago, il">Chicago</option>
      <option value="st louis, mo">St Louis</option>
      <option value="joplin, mo">Joplin, MO</option>
      <option value="oklahoma city, ok">Oklahoma City</option>
      <option value="amarillo, tx">Amarillo</option>
      <option value="gallup, nm">Gallup, NM</option>
      <option value="flagstaff, az">Flagstaff, AZ</option>
      <option value="winona, az">Winona</option>
      <option value="kingman, az">Kingman</option>
      <option value="barstow, ca">Barstow</option>
      <option value="san bernardino, ca">San Bernardino</option>
      <option value="los angeles, ca">Los Angeles</option>
    </select>
    </div>
    <div id="map"></div>
    <script>
    
        var polyArray = [];
    var colors;

    function initMap() {
        
        polyArray = [];
        colors = ['#ff0000', '#00ff00', '#0000ff', '#ffff00', '#ff00ff', '#00ffff'];
        
        var directionsService = new google.maps.DirectionsService;
        var directionsDisplay = new google.maps.DirectionsRenderer;
        var map = new google.maps.Map(document.getElementById('map'), {
          zoom: 7,
          center: {lat: 41.85, lng: -87.65}
        });
        directionsDisplay.setMap(map);

        var onChangeHandler = function() {
          calculateAndDisplayRoute(directionsService, directionsDisplay);
        };
        document.getElementById('start').addEventListener('change', onChangeHandler);
        document.getElementById('end').addEventListener('change', onChangeHandler);
      }

      function calculateAndDisplayRoute(directionsService, directionsDisplay) {
        directionsService.route({
          origin: document.getElementById('start').value,
          destination: document.getElementById('end').value,
          travelMode: 'DRIVING',
          provideRouteAlternatives: true
        }, function(response, status) {
          if (status === 'OK') {
          for (var j = 0; j < response.routes.length; j++) {
                var path = new google.maps.MVCArray();
                polyArray.push(new google.maps.Polyline({
                   map: map,
                   strokeColor: colors[j],
                   strokeOpacity: 1.0,
                   strokeWeight: 5
                }));
                polyArray[polyArray.length - 1].setPath(path);
                for (var i = 0, len = response.routes[j].overview_path.length; i < len; i++) {
                    path.push(response.routes[j].overview_path[i]);
                }
            }
            directionsDisplay.setDirections(response);
          } else {
            window.alert('Directions request failed due to ' + status);
          }
        });
      }
    </script>
    <script async defer
    src="https://maps.googleapis.com/maps/api/js?sensor=false&callback=initMap">
    </script>
  </body>
</html>

回答1:

When you "activate" a route, process through the array of polylines:

  1. set the strokeColor of all the routes to 'grey'
  2. set the active route's polyline color to the "active" color

proof of concept fiddle (based on my example which you reference, click on the polyline to "activate" it)

code snippet:

$(document).ready(function() {
  var markers = [{
    "title": '',
    "lat": '56.965969',
    "lng": '24.143496',
    "description": ''
  }, {
    "title": '',
    "lat": '56.966259',
    "lng": '24.385860',
    "description": ''
  }];
  var service = new google.maps.DirectionsService();
  var polyArray = [];
  var infoWindow = new google.maps.InfoWindow();
  var map = new google.maps.Map(document.getElementById("map_1"), mapOptions);
  var lat_lng = new Array();
  var colors = ['#ff0000', '#00ff00', '#0000ff', '#ffff00', '#ff00ff', '#00ffff'];
  var image = 'https://maps.google.com/mapfiles/ms/micons/blue.png';
  var marker = new google.maps.Marker({
    position: new google.maps.LatLng(56.966259, 24.385860),
    map: map,
    title: 'Sillava',
    icon: image
  });
  for (i = 0; i < markers.length; i++) {
    var data = markers[i];
    var myLatlng = new google.maps.LatLng(data.lat, data.lng);
    lat_lng.push(myLatlng);
  }
  for (var i = 0; i < lat_lng.length; i++) {
    if ((i + 1) < lat_lng.length) {
      var src = lat_lng[i];
      var des = lat_lng[i + 1];
      service.route({
        origin: src,
        destination: des,
        provideRouteAlternatives: true,
        travelMode: google.maps.DirectionsTravelMode.DRIVING
      }, function(result, status) {
        if (status == google.maps.DirectionsStatus.OK) {
          for (var j = 0; j < result.routes.length; j++) {
            var path = new google.maps.MVCArray();
            polyArray.push(new google.maps.Polyline({
              map: map,
              strokeColor: "grey",
              strokeOpacity: 0.3,
              strokeWeight: 5
            }));
            if (j == 0) polyArray[0].setOptions({
              strokeColor: '#00ff00',
              strokeOpacity: 1.0
            });
            polyArray[polyArray.length - 1].setPath(path);
            google.maps.event.addListener(polyArray[polyArray.length - 1], 'click', function() {
              for (var i = 0; i < polyArray.length; i++) {
                polyArray[i].setOptions({
                  strokeOpacity: 0.3,
                  strokeColor: "grey"
                });
              }
              this.setOptions({
                strokeOpacity: 1.0,
                strokeColor: "#00ff00"
              });
            })
            for (var i = 0, len = result.routes[j].overview_path.length; i < len; i++) {
              path.push(result.routes[j].overview_path[i]);
            }
          }
        }
      });
    }
  }
});
var mapOptions = {
  zoom: 11,
  center: new google.maps.LatLng(56.975749, 24.279310),
  scrollwheel: false,
  navigationControl: false,
  mapTypeControl: false,
  scaleControl: false,
  draggable: false,
  styles: [{
    "featureType": "water",
    "elementType": "geometry",
    "stylers": [{
      "color": "#d3d3d3"
    }, {
      "lightness": 17
    }]
  }, {
    "featureType": "landscape",
    "elementType": "geometry",
    "stylers": [{
      "color": "#f5f5f5"
    }, {
      "lightness": 20
    }]
  }, {
    "featureType": "road.highway",
    "elementType": "geometry.fill",
    "stylers": [{
      "color": "#ffffff"
    }, {
      "lightness": 17
    }]
  }, {
    "featureType": "road.highway",
    "elementType": "geometry.stroke",
    "stylers": [{
      "color": "#ffffff"
    }, {
      "lightness": 29
    }, {
      "weight": 0.2
    }]
  }, {
    "featureType": "road.arterial",
    "elementType": "geometry",
    "stylers": [{
      "color": "#ffffff"
    }, {
      "lightness": 18
    }]
  }, {
    "featureType": "road.local",
    "elementType": "geometry",
    "stylers": [{
      "color": "#ffffff"
    }, {
      "lightness": 16
    }]
  }, {
    "featureType": "poi",
    "elementType": "geometry",
    "stylers": [{
      "color": "#f5f5f5"
    }, {
      "lightness": 21
    }]
  }, {
    "featureType": "poi.park",
    "elementType": "geometry",
    "stylers": [{
      "color": "#dedede"
    }, {
      "lightness": 21
    }]
  }, {
    "elementType": "labels.text.stroke",
    "stylers": [{
      "visibility": "on"
    }, {
      "color": "#ffffff"
    }, {
      "lightness": 16
    }]
  }, {
    "elementType": "labels.text.fill",
    "stylers": [{
      "saturation": 36
    }, {
      "color": "#333333"
    }, {
      "lightness": 40
    }]
  }, {
    "elementType": "labels.icon",
    "stylers": [{
      "visibility": "off"
    }]
  }, {
    "featureType": "transit",
    "elementType": "geometry",
    "stylers": [{
      "color": "#f2f2f2"
    }, {
      "lightness": 19
    }]
  }, {
    "featureType": "administrative",
    "elementType": "geometry.fill",
    "stylers": [{
      "color": "#fefefe"
    }, {
      "lightness": 20
    }]
  }, {
    "featureType": "administrative",
    "elementType": "geometry.stroke",
    "stylers": [{
      "color": "#fefefe"
    }, {
      "lightness": 17
    }, {
      "weight": 1.2
    }]
  }]
};
.map {
  width: 100%;
  height: 100%;
}
body,
html {
  height: 100%;
  width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="map_1" class="map"></div>