-1

我正在使用Google Maps JavaScript API,并希望在同一地图上显示两条路线(每条路线都有不同的折线样式)。Google Maps JavaScript API在同一地图上显示两条具有不同折线样式的路线

第一条路线是驾驶模式,起止位置分别是用户输入的地址和用户选择的停车场。此路线将显示为一条实线。

第二条路线是走路模式。此路线从停车库到定义为centerOfMap的同一地图上的另一个静态位置。此路线将显示为带圆圈符号的虚线。

所需的输出:

enter image description here

// Set the driving route line 

var drivingPathLine = new google.maps.Polyline({ 
    strokeColor: '#FF0000', 
    strokeOpacity: 0, 
    fillOpacity: 0 
}); 

// Set the walking route line 

var walkingLineSymbol = { 
    path: google.maps.SymbolPath.CIRCLE, 
    fillOpacity: 1, 
    scale: 3 
}; 

var walkingPathLine = new google.maps.Polyline({ 
    strokeColor: '#0eb7f6', 
    strokeOpacity: 0, 
    fillOpacity: 0, 
    icons: [{ 
     icon: walkingLineSymbol, 
     offset: '0', 
     repeat: '10px' 
    }], 
}); 

directionsDisplay = new google.maps.DirectionsRenderer({suppressMarkers:true,polylineOptions: walkingPathLine}); 
directionsService = new google.maps.DirectionsService; 

的问题是,代码被当前写入的方式,仅在第二路线(路线行走)被显示在地图上。我知道我需要在getDirectionsHere方法中放置多段线变量和directionsRenderer,但不知道如何。任何指导表示赞赏!

如何在同一地图上显示两条路线,并且每条路线的样式都不相同(一条是实线折线,另一条是点线折线)?

<!DOCTYPE html> 
 
<html> 
 
<body> 
 
<style> 
 
    
 
html { 
 
\t height: 100%; 
 
} 
 

 
body { 
 
\t height: 100%; 
 
\t margin: 0; 
 
\t padding: 0; 
 
\t font-size: 26px; 
 
    font-family: "filson-soft"; 
 
} 
 

 
#map_container { 
 
    height: 700px; 
 
} 
 

 
#map { 
 
\t width: 100%; 
 
\t height: 100%; 
 
\t float: left; 
 
} 
 
    
 
</style> 
 

 
<div id="map_container"> 
 

 
    <div id="map"></div> 
 
    
 
</div> 
 
     
 
<script> 
 
     
 
     google.maps.event.addDomListener(window, "load", initMap); 
 

 
     var centerOfMap; 
 
     var geocoder; 
 
     var map; 
 
     var locations; 
 
     var gmarkers = []; 
 
     var search_lat; 
 
     var search_lng; 
 
     var infowindow; 
 
     var directionsDisplay; 
 
     var directionsService; 
 

 
     function initMap() { 
 
      
 
      gmarkers = []; 
 
      
 
      // Set the driving route line 
 

 
      var drivingPathLine = new google.maps.Polyline({ 
 
       strokeColor: '#FF0000', 
 
       strokeOpacity: 0, 
 
       fillOpacity: 0 
 
      }); 
 

 
      // Set the walking route line 
 

 
      var walkingLineSymbol = { 
 
       path: google.maps.SymbolPath.CIRCLE, 
 
       fillOpacity: 1, 
 
       scale: 3 
 
      }; 
 

 
      var walkingPathLine = new google.maps.Polyline({ 
 
       strokeColor: '#0eb7f6', 
 
       strokeOpacity: 0, 
 
       fillOpacity: 0, 
 
       icons: [{ 
 
        icon: walkingLineSymbol, 
 
        offset: '0', 
 
        repeat: '10px' 
 
       }], 
 
      }); 
 
      
 
      directionsDisplay = new google.maps.DirectionsRenderer({suppressMarkers:true,polylineOptions: walkingPathLine}); 
 
      directionsService = new google.maps.DirectionsService; 
 
      
 
      geocoder = new google.maps.Geocoder(); 
 
      
 
      // SET THE CENTER OF THE MAP 
 
      
 
      centerOfMap = { 
 
       lat: 38.5803844, 
 
       lng: -121.50024189999999 
 
      }; 
 
      
 
      // ADD THE MAP AND SET THE MAP OPTIONS 
 

 
      map = new google.maps.Map(document.getElementById('map'), { 
 
       zoom: 16, 
 
       center: centerOfMap 
 
      }); 
 

 
      var center_marker = new google.maps.Marker({ 
 
       position: centerOfMap, 
 
       icon: 'http://maps.google.com/mapfiles/ms/micons/orange-dot.png', 
 
       map: map 
 
      }); 
 
        
 
      center_marker.addListener('click', function() { 
 
       
 
       var gOneContent = '<div id="info_window">' + 
 
            '<h2>Center Of Map</h2>' + 
 
            '<div style="clear:both;height:40px;">' + 
 
            '<a href="#" id="getDirectionsButton" onclick="getDirectionsHere(' + centerOfMap.lat + ', ' + centerOfMap.lng + ');">Get Directions</a>' + 
 
            '</div>'; 
 
       
 
       infowindow.setContent(gOneContent); 
 
       infowindow.open(map, center_marker); 
 
       map.setCenter(marker.getPosition()); 
 
       
 
      }); 
 

 
      locations = [ 
 
       ["Joes Parking Garage","1001 6th St","Sacramento","CA","95814","38.58205649","-121.49857521","parking_garage"], 
 
       ["Mikes Parking Garage","918 5th St","Sacramento","CA","95814","38.5826939","-121.50012016","parking_garage"] 
 
      ]; 
 

 
      infowindow = new google.maps.InfoWindow(); 
 

 
      var marker, i; 
 
      
 
      var bounds = new google.maps.LatLngBounds(); 
 
      
 
      console.log("found " + locations.length + " locations<br>"); 
 
      
 
      for (i = 0; i < locations.length; i++) { 
 

 
       var icon_image = 'http://maps.google.com/mapfiles/ms/micons/parkinglot.png'; 
 
       
 
       var coordStr = locations[i][5] + "," + locations[i][6]; 
 
\t    var coords = coordStr.split(","); 
 
\t    var pt = new google.maps.LatLng(parseFloat(coords[0]),parseFloat(coords[1])); 
 
       bounds.extend(pt); 
 
       
 
       var location_name = locations[i][0]; 
 
       var location_address = locations[i][1] + ', ' + locations[i][2] + ', ' + locations[i][3] + ' ' + locations[i][4]; 
 

 
       marker = new google.maps.Marker({ 
 
        position: pt, 
 
        animation: google.maps.Animation.DROP, 
 
        icon: icon_image, 
 
        map: map, 
 
        title: location_name, 
 
        address: location_address 
 
       }); 
 
       
 
       gmarkers.push(marker); 
 

 
       google.maps.event.addListener(marker, 'click', (function (marker, i) { 
 
        return function() { 
 

 
         var content = '<div id="info_window">' 
 
             + '<h2 style="margin:0;">' + locations[i][0] + '</h2>' 
 
             + locations[i][1] + ', ' + locations[i][2] + ', ' + locations[i][3] + ' ' + locations[i][4] 
 
             + '<div style="clear:both;height:40px;">' 
 
             + '<a href="#" id="getDirectionsButton" onclick="getDirectionsHere(' + locations[i][5] + ', ' + locations[i][6] + ');">Get Directions</a>'; 
 
         
 
         content += '</div>'; 
 
         
 
         content += '</div>'; 
 

 
         infowindow.setContent(content); 
 
         infowindow.open(map, marker); 
 
         map.setCenter(marker.getPosition()); 
 

 
        } 
 
       })(marker, i)); 
 
      } 
 
     
 
     } 
 
     
 
     function getDirectionsHere(lat,lng) { 
 

 
      // GET THE SEARCH ADDRESS 
 

 
      var address = 'Carmichael, CA'; 
 
      console.log('search address: ' + address); 
 

 
      if (address) { 
 

 
       geocoder.geocode({ 'address': address}, function(results, status) { 
 
        if (status == google.maps.GeocoderStatus.OK) { 
 
         search_lat = results[0].geometry.location.lat(); 
 
         search_lng = results[0].geometry.location.lng(); 
 
         console.log('search FROM lat: ' + search_lat + ' search FROM lng: ' + search_lng); 
 
         console.log('search TO lat: ' + lat + ' search TO lng: ' + lng); 
 
         calculateAndDisplayRoute(directionsService, directionsDisplay); 
 
        } else { 
 
         alert("Geocode was not successful for the following reason: " + status); 
 
        } 
 
       }); 
 

 
       // CHANGE THE ZOOM LEVEL AFTER THE USER SEARCHES TO FIT THE ROUTE WITHOUT SCROLLING 
 

 
       map.setOptions({ minZoom: 10, maxZoom: 17 }); 
 
       map.setZoom(10); 
 

 
       // INITIALIZE GOOGLE MAPS DIRECTIONS SERVICE 
 

 
       directionsDisplay.setMap(map); 
 
       directionsDisplay.setPanel(document.getElementById('directions')); 
 

 
       calculateAndDisplayRoute(directionsService, directionsDisplay); 
 

 
       // CALCULATE THE FIRST ROUTE AND DIRECTIONS (DRIVING) BASED ON ADDRESS 
 

 
       function calculateAndDisplayRoute(directionsService, directionsDisplay) { 
 
        console.log('search address coordinates: ' + search_lat + ', ' + search_lng); 
 
        var selectedMode = document.getElementById('mode').value; 
 
        directionsService.route({ 
 
         origin: {lat: search_lat, lng: search_lng}, 
 
         destination: {lat: lat, lng: lng}, 
 
         travelMode: "DRIVING" 
 
        }, function(response, status) { 
 
         if (status == google.maps.DirectionsStatus.OK) { 
 
         directionsDisplay.setDirections(response); 
 
         } else { 
 
         window.alert('Directions request failed due to ' + status); 
 
         } 
 
        }); 
 
       } 
 
       
 
       // CALCULATE THE SECOND ROUTE AND DIRECTIONS (WALKING) BETWEEN PARKINGG GARAGE AND FINAL DESTINATION "CENTER OF MAP" 
 
       
 
       function calculateAndDisplayRoute(directionsService, directionsDisplay) { 
 
        var selectedMode = 'WALKING'; 
 
        directionsService.route({ 
 
         origin: {lat: lat, lng: lng}, 
 
         destination: {lat: centerOfMap.lat, lng: centerOfMap.lng}, 
 
         travelMode: google.maps.TravelMode[selectedMode] 
 
        }, function(response, status) { 
 
         if (status == google.maps.DirectionsStatus.OK) { 
 
         directionsDisplay.setDirections(response); 
 
         } else { 
 
         window.alert('Directions request failed due to ' + status); 
 
         } 
 
        }); 
 
       } 
 

 
      } else { 
 
       getLocationPopup(); 
 
       return; 
 
      } 
 

 
     } 
 
     
 
    </script> 
 
<script async defer src="https://maps.googleapis.com/maps/api/js?sensor=false&libraries=geometry,places&callback=initMap"></script> 
 

 
</body> 
 
</html> 
 
    <script type="text/javascript"> 
 
     
 
    </script> 
 
</body> 
 
</html>

+0

[您如何更改Google地图v3方向上的虚线颜色](http://stackoverflow.com/questions/35502342/how-do-you-change-the-color-of-the -dotted-line-google-map-v3-directions) – geocodezip

+0

这条路线应该怎么走?驾车路线的起点在哪里?我假设它开始 - 驾驶方向 - 停车 - 行走方向 - 结束/“地图标记的中心”。目前,你有两个具有相同名称的功能,这将不起作用,你需要做一个功能来做两件不同的事情(走路/行车路线)或两个不同名称的功能。 – geocodezip

+0

你的另一个问题是你的驾驶方向折线是透明的(strokeOpacity:0)。 – geocodezip

回答

1

你有两个问题与您的代码:

  1. 行车路线折线是透明的(strokeOpacity,用于:0)
  2. 你有两个calculateAndDisplayRoute功能,一个用于驱动,一个用于WALKING,不会在JavaScript中工作,要么给他们两个不同的名字,要么做一个函数来处理这两种情况:
function calculateAndDisplayRoute(start, end, driving) { 
     var selectedMode; 
     if (driving) selectedMode = "DRIVING"; 
     else selectedMode = "WALKING"; 
     directionsService.route({ 
     origin: start, 
     destination: end, 
     travelMode: selectedMode 
     }, function(response, status) { 
     if (status == google.maps.DirectionsStatus.OK) { 
      if (driving) { 
      directionsDisplayD.setDirections(response); 
      var start = new google.maps.LatLng(lat, lng); 
      var end = centerOfMap; 
      calculateAndDisplayRoute(start, end, false); 
      } else directionsDisplayW.setDirections(response); 
     } else { 
      window.alert('Directions request failed due to ' + status); 
     } 
     }); 
    } 
    } 
} 

proof of concept fiddle

[screenshot driving + walking

代码片断:

google.maps.event.addDomListener(window, "load", initMap); 
 

 
var centerOfMap; 
 
var geocoder; 
 
var map; 
 
var locations; 
 
var gmarkers = []; 
 
var search_lat; 
 
var search_lng; 
 
var infowindow; 
 
var directionsDisplayD; 
 
var directionsDisplayW; 
 
var directionsService; 
 

 
function initMap() { 
 

 
    gmarkers = []; 
 

 
    // Set the driving route line 
 

 
    var drivingPathLine = new google.maps.Polyline({ 
 
    strokeColor: '#FF0000', 
 
    strokeOpacity: 1, 
 
    fillOpacity: 1 
 
    }); 
 

 
    // Set the walking route line 
 

 
    var walkingLineSymbol = { 
 
    path: google.maps.SymbolPath.CIRCLE, 
 
    fillOpacity: 1, 
 
    scale: 3 
 
    }; 
 

 
    var walkingPathLine = new google.maps.Polyline({ 
 
    strokeColor: '#0eb7f6', 
 
    strokeOpacity: 0, 
 
    fillOpacity: 0, 
 
    icons: [{ 
 
     icon: walkingLineSymbol, 
 
     offset: '0', 
 
     repeat: '10px' 
 
    }], 
 
    }); 
 

 
    directionsService = new google.maps.DirectionsService(); 
 

 
    geocoder = new google.maps.Geocoder(); 
 

 
    // SET THE CENTER OF THE MAP 
 

 
    centerOfMap = { 
 
    lat: 38.5803844, 
 
    lng: -121.50024189999999 
 
    }; 
 

 
    // ADD THE MAP AND SET THE MAP OPTIONS 
 

 
    map = new google.maps.Map(document.getElementById('map'), { 
 
    zoom: 16, 
 
    center: centerOfMap 
 
    }); 
 

 
    directionsDisplayW = new google.maps.DirectionsRenderer({ 
 
    suppressMarkers: true, 
 
    polylineOptions: walkingPathLine, 
 
    map: map, 
 
    preserveViewport: true 
 
    }); 
 
    directionsDisplayD = new google.maps.DirectionsRenderer({ 
 
    suppressMarkers: true, 
 
    polylineOptions: drivingPathLine, 
 
    map: map 
 
    }); 
 

 
    var center_marker = new google.maps.Marker({ 
 
    position: centerOfMap, 
 
    icon: 'http://maps.google.com/mapfiles/ms/micons/orange-dot.png', 
 
    map: map 
 
    }); 
 

 
    center_marker.addListener('click', function() { 
 

 
    var gOneContent = '<div id="info_window">' + 
 
     '<h2>Center Of Map</h2>' + 
 
     '<div style="clear:both;height:40px;">' + 
 
     '<a href="#" id="getDirectionsButton" onclick="getDirectionsHere(' + centerOfMap.lat + ', ' + centerOfMap.lng + ');">Get Directions</a>' + 
 
     '</div>'; 
 

 
    infowindow.setContent(gOneContent); 
 
    infowindow.open(map, center_marker); 
 
    map.setCenter(marker.getPosition()); 
 

 
    }); 
 

 
    locations = [ 
 
    ["Joes Parking Garage", "1001 6th St", "Sacramento", "CA", "95814", "38.58205649", "-121.49857521", "parking_garage"], 
 
    ["Mikes Parking Garage", "918 5th St", "Sacramento", "CA", "95814", "38.5826939", "-121.50012016", "parking_garage"] 
 
    ]; 
 

 
    infowindow = new google.maps.InfoWindow(); 
 

 
    var marker, i; 
 

 
    var bounds = new google.maps.LatLngBounds(); 
 

 
    console.log("found " + locations.length + " locations<br>"); 
 

 
    for (i = 0; i < locations.length; i++) { 
 

 
    var icon_image = 'http://maps.google.com/mapfiles/ms/micons/parkinglot.png'; 
 

 
    var coordStr = locations[i][5] + "," + locations[i][6]; 
 
    var coords = coordStr.split(","); 
 
    var pt = new google.maps.LatLng(parseFloat(coords[0]), parseFloat(coords[1])); 
 
    bounds.extend(pt); 
 

 
    var location_name = locations[i][0]; 
 
    var location_address = locations[i][1] + ', ' + locations[i][2] + ', ' + locations[i][3] + ' ' + locations[i][4]; 
 

 
    marker = new google.maps.Marker({ 
 
     position: pt, 
 
     animation: google.maps.Animation.DROP, 
 
     icon: icon_image, 
 
     map: map, 
 
     title: location_name, 
 
     address: location_address 
 
    }); 
 

 
    gmarkers.push(marker); 
 

 
    google.maps.event.addListener(marker, 'click', (function(marker, i) { 
 
     return function() { 
 

 
     var content = '<div id="info_window">' + '<h2 style="margin:0;">' + locations[i][0] + '</h2>' + locations[i][1] + ', ' + locations[i][2] + ', ' + locations[i][3] + ' ' + locations[i][4] + '<div style="clear:both;height:40px;">' + '<a href="#" id="getDirectionsButton" onclick="getDirectionsHere(' + locations[i][5] + ', ' + locations[i][6] + ');">Get Directions</a>'; 
 

 
     content += '</div>'; 
 

 
     content += '</div>'; 
 

 
     infowindow.setContent(content); 
 
     infowindow.open(map, marker); 
 
     map.setCenter(marker.getPosition()); 
 

 
     } 
 
    })(marker, i)); 
 
    } 
 
} 
 

 
function getDirectionsHere(lat, lng) { 
 

 
    // GET THE SEARCH ADDRESS 
 

 
    var address = 'Carmichael, CA'; 
 
    console.log('search address: ' + address); 
 

 
    if (address) { 
 

 
    geocoder.geocode({ 
 
     'address': address 
 
    }, function(results, status) { 
 
     if (status == google.maps.GeocoderStatus.OK) { 
 
     search_lat = results[0].geometry.location.lat(); 
 
     search_lng = results[0].geometry.location.lng(); 
 
     console.log('search FROM lat: ' + search_lat + ' search FROM lng: ' + search_lng); 
 
     console.log('search TO lat: ' + lat + ' search TO lng: ' + lng); 
 
     var start = new google.maps.LatLng(search_lat, search_lng); 
 
     var end = new google.maps.LatLng(lat, lng); 
 
     calculateAndDisplayRoute(start, end, true); 
 
     // CHANGE THE ZOOM LEVEL AFTER THE USER SEARCHES TO FIT THE ROUTE WITHOUT SCROLLING 
 

 
     map.setOptions({ 
 
      minZoom: 10, 
 
      maxZoom: 17 
 
     }); 
 
     map.setZoom(10); 
 

 
     // INITIALIZE GOOGLE MAPS DIRECTIONS SERVICE 
 

 
     // directionsDisplay.setMap(map); 
 
     directionsDisplayD.setPanel(document.getElementById('directions')); 
 
     } else { 
 
     alert("Geocode was not successful for the following reason: " + status); 
 
     } 
 
    }); 
 

 

 
    // CALCULATE THE FIRST ROUTE AND DIRECTIONS (DRIVING) BASED ON ADDRESS 
 

 
    function calculateAndDisplayRoute(start, end, driving) { 
 
     console.log('start address coordinates: ' + start.lat() + ', ' + start.lng()); 
 
     var selectedMode; // = document.getElementById('mode').value; 
 
     if (driving) selectedMode = "DRIVING"; 
 
     else selectedMode = "WALKING"; 
 
     directionsService.route({ 
 
     origin: start, 
 
     destination: end, 
 
     travelMode: selectedMode 
 
     }, function(response, status) { 
 
     if (status == google.maps.DirectionsStatus.OK) { 
 
      if (driving) { 
 
      directionsDisplayD.setDirections(response); 
 

 
      var start = new google.maps.LatLng(lat, lng); 
 
      var end = centerOfMap; 
 
      calculateAndDisplayRoute(start, end, false); 
 

 
      } else directionsDisplayW.setDirections(response); 
 
     } else { 
 
      window.alert('Directions request failed due to ' + status); 
 
     } 
 
     }); 
 
    } 
 
    } 
 
}
html { 
 
    height: 100%; 
 
} 
 
body { 
 
    height: 100%; 
 
    margin: 0; 
 
    padding: 0; 
 
    font-size: 26px; 
 
    font-family: "filson-soft"; 
 
} 
 
#map_container { 
 
    height: 100%; 
 
} 
 
#map { 
 
    width: 100%; 
 
    height: 100%; 
 
    float: left; 
 
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=geometry,places"></script> 
 
<div id="map_container"> 
 
    <div id="map"></div> 
 
</div>

+0

只是想感谢你在这几天的这些问题上的帮助..真的很感激! – cpcdev

相关问题