Это строка, которая вынуждает все три записи перед генерацией маршрута:
if (!this.originPlaceId || !this.destinationPlaceId || !this.destinationPlaceId2) {
return;
}
Измените это на что-то вроде:
if (!this.originPlaceId || !this.destinationPlaceId) {
return;
}
Тогда она будет маршрутизироваться только с двумя входами.
Затем, при необходимости, добавьте путевую точку:
var waypts = [];
if (!!this.destinationPlaceId2) {
waypts.push({
location: {
'placeId': this.destinationPlaceId2
},
stopover: true
});
}
подтверждение концепции скрипта
две записи:
три записи:
фрагмент кода:
// This example requires the Places library. Include the libraries=places
// parameter when you first load the API. For example:
// <script
// src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
mapTypeControl: false,
center: {
lat: -33.8688,
lng: 151.2195
},
zoom: 13
});
new AutocompleteDirectionsHandler(map);
}
/**
* @constructor
*/
function AutocompleteDirectionsHandler(map) {
this.map = map;
this.originPlaceId = null;
this.destinationPlaceId = null;
this.destinationPlaceId2 = null;
this.travelMode = 'DRIVING';
this.directionsService = new google.maps.DirectionsService;
this.directionsRenderer = new google.maps.DirectionsRenderer;
this.directionsRenderer.setMap(map);
var originInput = document.getElementById('start');
var destinationInput = document.getElementById('waypoints');
var destinationInput2 = document.getElementById('end');
//var modeSelector = document.getElementById('mode-selector');
var originAutocomplete = new google.maps.places.Autocomplete(originInput);
// Specify just the place data fields that you need.
originAutocomplete.setFields(['place_id']);
var destinationAutocomplete2 =
new google.maps.places.Autocomplete(destinationInput);
destinationAutocomplete2.setFields(['place_id']);
var destinationAutocomplete =
new google.maps.places.Autocomplete(destinationInput2);
// Specify just the place data fields that you need.
destinationAutocomplete.setFields(['place_id']);
this.setupPlaceChangedListener(originAutocomplete, 'ORIG');
this.setupPlaceChangedListener(destinationAutocomplete, 'DEST');
this.setupPlaceChangedListener(destinationAutocomplete2, 'DEST2');
}
AutocompleteDirectionsHandler.prototype.setupPlaceChangedListener = function(
autocomplete, mode) {
var me = this;
autocomplete.bindTo('bounds', this.map);
autocomplete.addListener('place_changed', function() {
var place = autocomplete.getPlace();
if (!place.place_id) {
window.alert('Please select an option from the dropdown list.');
return;
}
if (mode === 'ORIG') {
me.originPlaceId = place.place_id;
} else if (mode === 'DEST') {
me.destinationPlaceId = place.place_id;
} else if (mode === 'DEST2') {
me.destinationPlaceId2 = place.place_id;
}
me.route();
});
};
AutocompleteDirectionsHandler.prototype.route = function() {
console.log("originPlaceId=" + this.originPlaceId + " destinationPlaceId=" + this.destinationPlaceId + " destinationPlaceId2=" + this.destinationPlaceId2)
if (!this.originPlaceId || !this.destinationPlaceId) {
return;
}
var me = this;
var waypts = [];
if (!!this.destinationPlaceId2) {
waypts.push({
location: {
'placeId': this.destinationPlaceId2
},
stopover: true
});
}
this.directionsService.route({
origin: {
'placeId': this.originPlaceId
},
destination: {
'placeId': this.destinationPlaceId
},
waypoints: waypts,
optimizeWaypoints: true,
travelMode: this.travelMode
},
function(response, status) {
if (status === 'OK') {
me.directionsRenderer.setDirections(response);
var route = response.route[0];
// For each route, display summary information.
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>';
}
} else {
window.alert('Directions request failed due to ' + status);
}
});
};
/* Always set the map height explicitly to define the size of the div
* element that contains the map. */
#map {
height: 70%;
}
/* Optional: Makes the sample page fill the window. */
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
.controls {
margin-top: 10px;
border: 1px solid transparent;
border-radius: 2px 0 0 2px;
box-sizing: border-box;
-moz-box-sizing: border-box;
height: 32px;
outline: none;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
}
#start,
#waypoints,
#end {
background-color: #fff;
font-family: Roboto;
font-size: 15px;
font-weight: 300;
margin-left: 12px;
padding: 0 11px 0 13px;
text-overflow: ellipsis;
width: 200px;
}
#start:focus,
#waypoints:focus,
#end:focus {
border-color: #4d90fe;
}
#mode-selector {
color: #fff;
background-color: #4d90fe;
margin-left: 12px;
padding: 5px 11px 0px 11px;
}
#mode-selector label {
font-family: Roboto;
font-size: 13px;
font-weight: 300;
}
<div>
<input id="start" class="controls" type="text" placeholder="Enter an origin location">
<input id="end" class="controls" type="text" placeholder="Enter a destination location">
<input id="waypoints" class="controls" type="text" placeholder="Enter a destination location">
<div id="mode-selector" class="controls">
<input type="radio" name="type" id="changemode-walking" checked="checked">
<label for="changemode-walking">Walking</label>
<input type="radio" name="type" id="changemode-transit">
<label for="changemode-transit">Transit</label>
<input type="radio" name="type" id="changemode-driving">
<label for="changemode-driving">Driving</label>
</div>
</div>
<div id="map"></div>
<!-- Replace the value of the key parameter with your own API key. -->
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=places&callback=initMap" async defer></script>