<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
<title>Draggable directions</title>
<style>
html, body {
height: 100%;
margin: 0;
padding: 0;
}
#map {
height: 100%;
width: 100%;
}
</style>
</head>
<body>
<div id="map"></div>
<script>
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 10,
center: {lat: 40.6, lng: -73.9}
});
var directionsService = new google.maps.DirectionsService;
var directionsDisplay = new google.maps.DirectionsRenderer({
draggable: true,
map: map,
suppressMarkers: true
});
var waypoints = [];
var markerStart = new google.maps.Marker({
position: {lat: 40.851246, lng: -73.875218},
map: map,
draggable:true
});
var infowindowStart = new google.maps.InfoWindow({
content: "Marker Start Info Window"
});
markerStart.addListener('click', function() {
infowindowStart.open(map, markerStart);
});
var markerEnd = new google.maps.Marker({
position: {lat: 40.831916, lng: -73.888947},
map: map,
draggable:true
});
var infowindowEnd = new google.maps.InfoWindow({
content: "Marker End Info Window"
});
markerEnd.addListener('click', function() {
infowindowEnd.open(map, markerEnd);
});
var redisplay = _.throttle(function() {
displayRoute(markerStart, markerEnd, directionsService, directionsDisplay, waypoints);
}, 200);
google.maps.event.addListener(markerStart, 'drag', redisplay);
google.maps.event.addListener(markerEnd, 'drag', redisplay);
directionsDisplay.addListener('directions_changed', function() {
var directions = directionsDisplay.getDirections();
waypoints = directions.request.waypoints;
});
displayRoute(markerStart, markerEnd, directionsService, directionsDisplay, waypoints);
}
function displayRoute(markerStart, markerEnd, service, display, waypoints) {
service.route({
origin: markerStart.getPosition(),
destination: markerEnd.getPosition(),
travelMode: google.maps.TravelMode.DRIVING,
waypoints: waypoints,
avoidTolls: true
}, function(response, status) {
if (status === google.maps.DirectionsStatus.OK) {
waypoints = response.request.waypoints;
display.setDirections(response);
} else {
console.log('Could not display directions due to: ' + status);
}
});
}
</script>
<script src="https://maps.googleapis.com/maps/api/js?callback=initMap" async defer></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min.js"></script>
</body>
</html>