2016-02-19 87 views
1

我正在使用Transit方向,并且能够使用polylineOptions属性更改为运输路线显示的折线颜色。如何更改Google地图v3方向上的虚线颜色

但是,我无法更改为步行方向显示的虚线颜色。

我没碰到过这样的解决方案,但它不为V3的工作(与v3.22试过)

Similar StackOverflow Question

我已经包含在这个JS Fiddle

var directions = new google.maps.DirectionsService(); 
 
var renderer = new google.maps.DirectionsRenderer({ 
 
    polylineOptions: { 
 
    strokeColor: '#C83939', 
 
    strokeOpacity: 0.8, 
 
    strokeWeight: 7 
 
    } 
 

 
}); 
 
var map, transitLayer; 
 

 
function initialize() { 
 
    var mapOptions = { 
 
    zoom: 13, 
 
    center: new google.maps.LatLng(40.7482333, -73.8681295), 
 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
 
    }; 
 

 
    map = new google.maps.Map(document.getElementById('map'), mapOptions); 
 

 
    google.maps.event.addDomListener(document.getElementById('go'), 'click', 
 
    route); 
 

 
    var input = document.getElementById('from'); 
 
    var autocomplete = new google.maps.places.Autocomplete(input); 
 
    autocomplete.bindTo('bounds', map); 
 

 
    transitLayer = new google.maps.TransitLayer(); 
 

 
    var control = document.getElementById('transit-wpr'); 
 
    map.controls[google.maps.ControlPosition.TOP_RIGHT].push(control); 
 

 
    google.maps.event.addDomListener(control, 'click', function() { 
 
    transitLayer.setMap(transitLayer.getMap() ? null : map); 
 
    }); 
 

 
    addDepart(); 
 
    route(); 
 
} 
 

 
function addDepart() { 
 
    var depart = document.getElementById('depart'); 
 
    for (var i = 0; i < 24; i++) { 
 
    for (var j = 0; j < 60; j += 15) { 
 
     var x = i < 10 ? '0' + i : i; 
 
     var y = j < 10 ? '0' + j : j; 
 
     depart.innerHTML += '<option>' + x + ':' + y + '</option>'; 
 
    } 
 
    } 
 
} 
 

 
function route() { 
 
    var departure = document.getElementById('depart').value; 
 
    var bits = departure.split(':'); 
 
    var now = new Date(); 
 
    var tzOffset = (now.getTimezoneOffset() + 60) * 60 * 1000; 
 

 
    var time = new Date(); 
 
    time.setHours(bits[0]); 
 
    time.setMinutes(bits[1]); 
 

 
    var ms = time.getTime() - tzOffset; 
 
    if (ms < now.getTime()) { 
 
    ms += 24 * 60 * 60 * 1000; 
 
    } 
 

 
    var departureTime = new Date(ms); 
 

 
    var request = { 
 
    origin: document.getElementById('from').value, 
 
    destination: '51 St, New York, NY 10022, USA', 
 
    travelMode: google.maps.DirectionsTravelMode.TRANSIT, 
 
    provideRouteAlternatives: true, 
 
    transitOptions: { 
 
     departureTime: departureTime 
 
    } 
 
    }; 
 

 
    var panel = document.getElementById('panel'); 
 
    panel.innerHTML = ''; 
 
    directions.route(request, function(response, status) { 
 
    if (status == google.maps.DirectionsStatus.OK) { 
 
     renderer.setDirections(response); 
 
     renderer.setMap(map); 
 
     renderer.setPanel(panel); 
 
     console.log(renderer.getDirections()); 
 
    } else { 
 
     renderer.setMap(null); 
 
     renderer.setPanel(null); 
 
    } 
 

 
    }); 
 

 
} 
 

 
google.maps.event.addDomListener(window, 'load', initialize);
html, 
 
body { 
 
    height: 100%; 
 
    padding: 0; 
 
    margin: 0; 
 
    color: black; 
 
    font-family: arial, sans-serif; 
 
    font-size: 13px; 
 
} 
 
#map { 
 
    position: absolute; 
 
    top: 0; 
 
    bottom: 0; 
 
    left: 0; 
 
    right: 50%; 
 
} 
 
#panel-wpr { 
 
    position: absolute; 
 
    top: 0; 
 
    bottom: 0; 
 
    left: 50%; 
 
    right: 0; 
 
    overflow: auto; 
 
} 
 
#panel { 
 
    font-family: arial; 
 
    padding: 0 5px; 
 
} 
 
#info { 
 
    padding: 5px; 
 
} 
 
#from { 
 
    width: 90%; 
 
    font-size: 1.2em; 
 
} 
 
.adp-directions { 
 
    width: 100%; 
 
} 
 
.input { 
 
    background-color: white; 
 
    padding-left: 8px; 
 
    border: 1px solid #D9D9D9; 
 
    border-top: 1px solid silver; 
 
    -webkit-border-radius: 1px; 
 
    -moz-border-radius: 1px; 
 
    border-radius: 1px; 
 
} 
 
.time { 
 
    margin: 0; 
 
    height: 17px; 
 
    border: 1px solid; 
 
    border-top-color: #CCC; 
 
    border-right-color: #999; 
 
    border-left-color: #999; 
 
    border-bottom-color: #CCC; 
 
    padding: 2px 15px 1px 1px; 
 
} 
 
button { 
 
    border: 1px solid #3079ED; 
 
    color: white; 
 
    background-color: #4D90FE; 
 
    background-image: -webkit-gradient(linear, left top, left bottom, from(#4D90FE), to(#4787ED)); 
 
    background-image: -webkit-linear-gradient(top, #4D90FE, #4787ED); 
 
    background-image: -moz-linear-gradient(top, #4D90FE, #4787ED); 
 
    background-image: -ms-linear-gradient(top, #4D90FE, #4787ED); 
 
    background-image: -o-linear-gradient(top, #4D90FE, #4787ED); 
 
    background-image: linear-gradient(top, #4D90FE, #4787ED); 
 
    filter: progid: DXImageTransform.Microsoft.gradient(startColorStr='#4d90fe', EndColorStr='#4787ed'); 
 
    display: inline-block; 
 
    min-width: 54px; 
 
    text-align: center; 
 
    font-weight: bold; 
 
    padding: 0 8px; 
 
    line-height: 27px; 
 
    -webkit-border-radius: 2px; 
 
    -moz-border-radius: 2px; 
 
    border-radius: 2px; 
 
    -webkit-transition: all 0.218s; 
 
    -moz-transition: all 0.218s; 
 
    -o-transition: all 0.218s; 
 
    transition: all 0.218s; 
 
} 
 
#info div { 
 
    line-height: 22px; 
 
    font-size: 110%; 
 
} 
 
.btn {} #panel-wpr { 
 
    border-left: 1px solid #e6e6e6; 
 
} 
 
#info { 
 
    border-bottom: 1px solid #E6E6E6; 
 
    margin-bottom: 5px; 
 
} 
 
h2 { 
 
    margin: 0; 
 
    padding: 0; 
 
}
<title>Google Maps JavaScript API v3 Example: Transit</title> 
 
<div id="transit-wpr"> 
 
    <button id="transit">Toggle transit layer</button> 
 
</div> 
 
<div id="map"></div> 
 
<div id="panel-wpr"> 
 
    <div id="info"> 
 
    <div> 
 
     <h2>Transit directions</h2> 
 
    </div> 
 
    <div> 
 
     <label>from:</label> 
 
     <input class="input" id="from" value="Grand Central 42, NY"> 
 
    </div> 
 
    <div> 
 
     <label>to:</label> 
 
     <strong>51 St, New York, NY 10022, USA</strong> 
 
    </div> 
 
    <div>Depart at 
 
     <select id="depart"></select> 
 
    </div> 
 
    <div class="btn"> 
 
     <button id="go">Get Directions</button> 
 
    </div> 
 
    </div> 
 
    <div id="panel"></div> 
 
</div>
工作示例

任何可用的属性,我错过了,或t他不可能?

+0

我曾尝试使用图标的PolylineOptions的财产,但不工作要么。的PolylineOptions:{ 则strokeColor: '#C83939', strokeOpacity,用于:0.8, strokeWeight,用于:7, 图标:[{ 图标:{ 填充颜色: '#C83939',//或十六进制颜色,例如: '#FF0000' 则strokeColor: '#C83939' }} ] } – cynx

+0

请提供[最小的,完整的,经过测试和读示例](http://stackoverflow.com/help/mcve),演示了这一问题**在自问**。 – geocodezip

+0

嗨,我已经在问题 – cynx

回答

3

这些行的选项是固定的,不会受到DirectionsRenderer的polylineOptions的影响。

这些虚线的PolylineOptions将(目前)由API设置为:

{ 
    "icons": [{ 
    "icon": { 
     "path": 0, 
     "scale": 3, 
     "fillOpacity": 0.7, 
     "fillColor": "#00b3fd", 
     "strokeOpacity": 0.8, 
     "strokeColor": "#3379c3", 
     "strokeWeight": 1 
    }, 
    "repeat": "10px" 
    }], 
    "strokeColor": "#000000", 
    "strokeOpacity": 0, 
    "strokeWeight": 5 
} 

...的的DirectionsRenderer的任何自定义polylineOption将被忽略。

可能的解决方法(但只会有可能为所有这些虚线的单一固定值):

function initMap() { 
 
    var goo = google.maps, 
 
      map = new goo.Map(document.getElementById('map'), { 
 
        zoom: 7, 
 
        center: {lat: 41.85, lng: -87.65} 
 
       }), 
 
      directionsService  = new goo.DirectionsService, 
 
      directionsDisplay  = new goo.DirectionsRenderer({ 
 
             map:map, 
 
             polylineOptions:{ 
 
             strokeColor:'red' 
 
             }}); 
 
     google.maps.Polyline.prototype.setMap=(function(f,r){ 
 
     
 
     return function(map){ 
 
      if(
 
      this.get('icons') 
 
       && 
 
      this.get('icons').length===1 
 
       && 
 
      this.get('strokeOpacity')===0 
 
       && 
 
      !this.get('noRoute') 
 
     ){ 
 
      if(r.get('polylineOptions')&& r.get('polylineOptions').strokeColor){ 
 
       
 
       var icons=this.get('icons'), 
 
        color=r.get('polylineOptions').strokeColor; 
 
       icons[0].icon.fillOpacity=1; 
 
       icons[0].icon.fillColor=color; 
 
       icons[0].icon.strokeColor=color; 
 
       this.set('icons',icons); 
 
      }} 
 
     f.apply(this,arguments); 
 
     } 
 
     
 
    })(
 
      google.maps.Polyline.prototype.setMap, 
 
      directionsDisplay); 
 
    
 
    
 
    directionsService.route({ 
 
    origin: new google.maps.LatLng(52.549917, 13.42539669), 
 
    destination: new google.maps.LatLng(52.541843, 13.4206566), 
 
    travelMode: google.maps.TravelMode.TRANSIT 
 
    }, function(response, status) { 
 
    if (status === google.maps.DirectionsStatus.OK) { 
 
     directionsDisplay.setDirections(response); 
 
    } else { 
 
     window.alert('Directions request failed due to ' + status); 
 
    } 
 
    }); 
 
}
html, body,#map { 
 
     height: 100%; 
 
     margin: 0; 
 
     padding: 0; 
 
     }
<div id="map"></div> 
 
<script src="https://maps.googleapis.com/maps/api/js?callback=initMap" 
 
     async defer></script>

它覆盖setMap -method的google.maps.Polyline

它检查是否

  1. 的strokeOpacity,用于为0
  2. 与单个图标IconSequence存在
  3. 它没有一个noRoute - 属性(在你画匹配其前2个条件需要自己设置折线的情况下noRoute - 选项为true,否则它们也会受到影响)

当所有3个条件都为真时,它将修改折线的图标属性。

+0

包括JS小提琴谢谢,作品完美! – cynx

0

没有属性(当前)允许对部分折线进行样式设置。一种选择是隐藏DirectionRenderer Polyline并自己渲染多段线,这使您可以完全控制单独的多段线。

var polylineOptions = { 
    strokeColor: '#C83939', 
    strokeOpacity: 1, 
    strokeWeight: 4 
}; 
var walkingPolylineOptions = { 
    strokeColor: '#C83939', 
    strokeOpacity: 0, 
    strokeWeight: 4, 
    icons: [{ 
    icon: { 
     path: google.maps.SymbolPath.CIRCLE, 
     fillColor: '#C83939', 
     fillOpacity: 1, 
     scale: 2, 
     strokeColor: '#C83939', 
     strokeOpacity: 1, 
    }, 
    offset: '0', 
    repeat: '10px' 
    }] 
}; 

function renderDirectionsPolylines(response) { 
    var legs = response.routes[0].legs; 
    for (i = 0; i < legs.length; i++) { 
    var steps = legs[i].steps; 
    for (j = 0; j < steps.length; j++) { 
     var nextSegment = steps[j].path; 
     var stepPolyline = new google.maps.Polyline(polylineOptions); 
     if (steps[j].travel_mode == google.maps.TravelMode.WALKING) { 
     stepPolyline.setOptions(walkingPolylineOptions) 
     } 
     for (k = 0; k < nextSegment.length; k++) { 
     stepPolyline.getPath().push(nextSegment[k]); 
     } 
     stepPolyline.setMap(map); 
    } 
    } 
} 

proof of concept fiddle

代码片段:

var polylineOptions = { 
 
    strokeColor: '#C83939', 
 
    strokeOpacity: 1, 
 
    strokeWeight: 4 
 
}; 
 
var walkingPolylineOptions = { 
 
    strokeColor: '#C83939', 
 
    strokeOpacity: 0, 
 
    strokeWeight: 4, 
 
    icons: [{ 
 
    icon: { 
 
     path: google.maps.SymbolPath.CIRCLE, 
 
     fillColor: '#C83939', 
 
     fillOpacity: 1, 
 
     scale: 2, 
 
     strokeColor: '#C83939', 
 
     strokeOpacity: 1, 
 
    }, 
 
    offset: '0', 
 
    repeat: '10px' 
 
    }] 
 
}; 
 

 
function renderDirectionsPolylines(response) { 
 
    var legs = response.routes[0].legs; 
 
    for (i = 0; i < legs.length; i++) { 
 
    var steps = legs[i].steps; 
 
    for (j = 0; j < steps.length; j++) { 
 
     var nextSegment = steps[j].path; 
 
     var stepPolyline = new google.maps.Polyline(polylineOptions); 
 
     if (steps[j].travel_mode == google.maps.TravelMode.WALKING) { 
 
     stepPolyline.setOptions(walkingPolylineOptions) 
 
     } 
 
     for (k = 0; k < nextSegment.length; k++) { 
 
     stepPolyline.getPath().push(nextSegment[k]); 
 
     } 
 
     stepPolyline.setMap(map); 
 
    } 
 
    } 
 
} 
 

 
var directions = new google.maps.DirectionsService(); 
 
var renderer = new google.maps.DirectionsRenderer({ 
 
    suppressPolylines: true, 
 
}); 
 
var map, transitLayer; 
 

 
function initialize() { 
 
    var mapOptions = { 
 
    zoom: 13, 
 
    center: new google.maps.LatLng(40.7482333, -73.8681295), 
 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
 
    }; 
 

 
    map = new google.maps.Map(document.getElementById('map'), mapOptions); 
 

 
    google.maps.event.addDomListener(document.getElementById('go'), 'click', 
 
    route); 
 

 
    var input = document.getElementById('from'); 
 
    var autocomplete = new google.maps.places.Autocomplete(input); 
 
    autocomplete.bindTo('bounds', map); 
 

 
    transitLayer = new google.maps.TransitLayer(); 
 

 
    var control = document.getElementById('transit-wpr'); 
 
    map.controls[google.maps.ControlPosition.TOP_RIGHT].push(control); 
 

 
    google.maps.event.addDomListener(control, 'click', function() { 
 
    transitLayer.setMap(transitLayer.getMap() ? null : map); 
 
    }); 
 

 
    addDepart(); 
 
    route(); 
 
} 
 

 
function addDepart() { 
 
    var depart = document.getElementById('depart'); 
 
    for (var i = 0; i < 24; i++) { 
 
    for (var j = 0; j < 60; j += 15) { 
 
     var x = i < 10 ? '0' + i : i; 
 
     var y = j < 10 ? '0' + j : j; 
 
     depart.innerHTML += '<option>' + x + ':' + y + '</option>'; 
 
    } 
 
    } 
 
} 
 

 
function route() { 
 
    var departure = document.getElementById('depart').value; 
 
    var bits = departure.split(':'); 
 
    var now = new Date(); 
 
    var tzOffset = (now.getTimezoneOffset() + 60) * 60 * 1000; 
 
    var time = new Date(); 
 
    time.setHours(bits[0]); 
 
    time.setMinutes(bits[1]); 
 
    var ms = time.getTime() - tzOffset; 
 
    if (ms < now.getTime()) { 
 
    ms += 24 * 60 * 60 * 1000; 
 
    } 
 
    var departureTime = new Date(ms); 
 
    var request = { 
 
    origin: document.getElementById('from').value, 
 
    destination: '51 St, New York, NY 10022, USA', 
 
    travelMode: google.maps.DirectionsTravelMode.TRANSIT, 
 
    provideRouteAlternatives: true, 
 
    transitOptions: { 
 
     departureTime: departureTime 
 
    } 
 
    }; 
 
    var panel = document.getElementById('panel'); 
 
    panel.innerHTML = ''; 
 
    directions.route(request, function(response, status) { 
 
    if (status == google.maps.DirectionsStatus.OK) { 
 
     renderer.setDirections(response); 
 
     renderer.setMap(map); 
 
     renderer.setPanel(panel); 
 
     renderDirectionsPolylines(response); 
 
     console.log(renderer.getDirections()); 
 
    } else { 
 
     renderer.setMap(null); 
 
     renderer.setPanel(null); 
 
    } 
 
    }); 
 
} 
 
google.maps.event.addDomListener(window, 'load', initialize);
html, 
 
body { 
 
    height: 100%; 
 
    padding: 0; 
 
    margin: 0; 
 
    color: black; 
 
    font-family: arial, sans-serif; 
 
    font-size: 13px; 
 
} 
 
#map { 
 
    position: absolute; 
 
    top: 0; 
 
    bottom: 0; 
 
    left: 0; 
 
    right: 50%; 
 
} 
 
#panel-wpr { 
 
    position: absolute; 
 
    top: 0; 
 
    bottom: 0; 
 
    left: 50%; 
 
    right: 0; 
 
    overflow: auto; 
 
} 
 
#panel { 
 
    font-family: arial; 
 
    padding: 0 5px; 
 
} 
 
#info { 
 
    padding: 5px; 
 
} 
 
#from { 
 
    width: 90%; 
 
    font-size: 1.2em; 
 
} 
 
.adp-directions { 
 
    width: 100%; 
 
} 
 
.input { 
 
    background-color: white; 
 
    padding-left: 8px; 
 
    border: 1px solid #D9D9D9; 
 
    border-top: 1px solid silver; 
 
    -webkit-border-radius: 1px; 
 
    -moz-border-radius: 1px; 
 
    border-radius: 1px; 
 
} 
 
.time { 
 
    margin: 0; 
 
    height: 17px; 
 
    border: 1px solid; 
 
    border-top-color: #CCC; 
 
    border-right-color: #999; 
 
    border-left-color: #999; 
 
    border-bottom-color: #CCC; 
 
    padding: 2px 15px 1px 1px; 
 
} 
 
button { 
 
    border: 1px solid #3079ED; 
 
    color: white; 
 
    background-color: #4D90FE; 
 
    background-image: -webkit-gradient(linear, left top, left bottom, from(#4D90FE), to(#4787ED)); 
 
    background-image: -webkit-linear-gradient(top, #4D90FE, #4787ED); 
 
    background-image: -moz-linear-gradient(top, #4D90FE, #4787ED); 
 
    background-image: -ms-linear-gradient(top, #4D90FE, #4787ED); 
 
    background-image: -o-linear-gradient(top, #4D90FE, #4787ED); 
 
    background-image: linear-gradient(top, #4D90FE, #4787ED); 
 
    filter: progid: DXImageTransform.Microsoft.gradient(startColorStr='#4d90fe', EndColorStr='#4787ed'); 
 
    display: inline-block; 
 
    min-width: 54px; 
 
    text-align: center; 
 
    font-weight: bold; 
 
    padding: 0 8px; 
 
    line-height: 27px; 
 
    -webkit-border-radius: 2px; 
 
    -moz-border-radius: 2px; 
 
    border-radius: 2px; 
 
    -webkit-transition: all 0.218s; 
 
    -moz-transition: all 0.218s; 
 
    -o-transition: all 0.218s; 
 
    transition: all 0.218s; 
 
} 
 
#info div { 
 
    line-height: 22px; 
 
    font-size: 110%; 
 
} 
 
.btn {} #panel-wpr { 
 
    border-left: 1px solid #e6e6e6; 
 
} 
 
#info { 
 
    border-bottom: 1px solid #E6E6E6; 
 
    margin-bottom: 5px; 
 
} 
 
h2 { 
 
    margin: 0; 
 
    padding: 0; 
 
}
<script src="http://maps.googleapis.com/maps/api/js?v=3.22&libraries=places"></script> 
 
<title>Google Maps JavaScript API v3 Example: Transit</title> 
 
<div id="transit-wpr"> 
 
    <button id="transit">Toggle transit layer</button> 
 
</div> 
 
<div id="map"></div> 
 
<div id="panel-wpr"> 
 
    <div id="info"> 
 
    <div> 
 
     <h2>Transit directions</h2> 
 
    </div> 
 
    <div> 
 
     <label>from:</label> 
 
     <input class="input" id="from" value="Grand Central 42, NY" /> 
 
    </div> 
 
    <div> 
 
     <label>to:</label> 
 
     <strong>51 St, New York, NY 10022, USA</strong> 
 
    </div> 
 
    <div>Depart at 
 
     <select id="depart"></select> 
 
    </div> 
 
    <div class="btn"> 
 
     <button id="go">Get Directions</button> 
 
    </div> 
 
    </div> 
 
    <div id="panel"></div> 
 
</div>

+0

我确实尝试了这种方法,通过使用routes []数组的.overview_path或.overview_polyline属性来抑制默认多段线并创建自定义多段线。然后使用setPanel()方法绘制路线。对于少数示例,这可以正常工作,但导致较长路径的未捕获错误。此错误仍然存​​在于上述建议的解决方案中。例如,请参阅此小提琴 - http://jsfiddle.net/8xw377u5/ – cynx

+0

它导致Uncaught TypeError:无法读取属性'set'的空错误。这是API的错误吗?它基本上吸取了大部分的路线,但后来失败了点B - c just – cynx

+0

你在哪里看到这个错误?我没有在小提琴或代码片段中看到它。请提供一个[最小,完整,测试和可读的示例](http://stackoverflow.com/help/mcve)来说明问题(或有关如何使用发布的代码重现该问题的说明); – geocodezip

相关问题