The purpose of this task is to compare the routes. Assuming, like the example above, I am going from Boston to Seattle - which route will be better? Or maybe closer to passing Detroit?
Or another use case: if my friend and I are both traveling out of NYC on 2 separate cars, I am going to Columbus, OH and my friend is going to Detroit, MI - and another friend needs to be dropped off in State College, PA - so which car should this friend join - my car or the other car?
So here is how you do it.
FIRST - you will need to get Google Map Javascript API Key - you can get it here. Once you get it and enable the needed APIs, you will need to use it in your script reference below.
SECOND - in your HTML markup - add script reference Google Map and substituting the YOUR_API_KEY with your real API key from above.
FIRST - you will need to get Google Map Javascript API Key - you can get it here. Once you get it and enable the needed APIs, you will need to use it in your script reference below.
SECOND - in your HTML markup - add script reference Google Map and substituting the YOUR_API_KEY with your real API key from above.
<!DOCTYPE html> <html> <head> <style type="text/css"> #map { margin-top: 10px; height: 750px; width: 100%; } </style> </head> <body> <div id="map"></div> <script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap" type="text/javascript"></script> </body> </html>THIRD - initialize several global variables and create a javascript method called "initMap" - this is to initialize your map once the script from Google is loaded.
var routeMapArray = []; var map; var defaultZoom = 11; var directionsService; var directionDisplayRenderEngineArray = []; var iconColor = ''; function initMap() { routeMapArray = []; directionsService = new google.maps.DirectionsService(); // center initially on NYC loadMap(new google.maps.LatLng(40.7128, -74.0060)); }FOURTH - Create a method called "loadMap" that takes 1 parameter and create a json payload for your routes.
var loadMap = function(center) { var mapOptions = { zoom: 11, mapTypeControl: false, streetViewControl: false, mapTypeId: google.maps.MapTypeId.ROADMAP }; if (center !== undefined && center !== null) { mapOptions.center = center; } // Some basic map setup (from the API docs) map = new google.maps.Map(document.getElementById('map'), mapOptions); // Start the request making var requestArray = [{ "origin": "New York, NY", "destination": "Seattle, WA", "waypoints": [{ "location": "Detroit, MI", "stopover": true }, { "location": "Denver, CO", "stopover": true } ], "travelMode": "DRIVING" }, { "origin": "Boston, MA", "destination": "San Diego, CA", "waypoints": [{ "location": "Dayton, OH", "stopover": true }, { "location": "Las Vegas, NV", "stopover": true } ], "travelMode": "DRIVING" } ]; processRequests(requestArray); };FIFTH - We need to process the requests in order, one by one - using different renderer each time on the same map (this is the key).
var processRequests = function(requestArray) { var bounds = new google.maps.LatLngBounds(); var infoWindow = new google.maps.InfoWindow(); // Counter to track request submission and process one at a time; var i = 0; var position = ""; // Used to submit the request 'i' var submitRequest = function() { if (requestArray.length === 0) return; directionsService.route(requestArray[i], processDirectionResults); }; // Used as callback for the above request for current 'i' function processDirectionResults(result, status) { if (status === google.maps.DirectionsStatus.OK) { // Create a unique DirectionsRenderer 'i' directionDisplayRenderEngineArray[i] = new google.maps.DirectionsRenderer(); directionDisplayRenderEngineArray[i].setMap(map); if (i == 0) { bounds = new google.maps.LatLngBounds(); } iconColor = "#000000"; directionDisplayRenderEngineArray[i].setOptions({ preserveViewport: true, polylineOptions: { strokeWeight: 5, strokeOpacity: 0.8, strokeColor: iconColor }, markerOptions: {} }); // Use this new renderer with the result directionDisplayRenderEngineArray[i].setDirections(result); // adjust zooming if (i === 0) { bounds = directionDisplayRenderEngineArray[i].getDirections().routes[0].bounds; } else { bounds.union(directionDisplayRenderEngineArray[i].getDirections().routes[0].bounds); } map.fitBounds(bounds); if (map.zoom > defaultZoom) { map.setZoom(defaultZoom); } // and start the next request setTimeout(function() { nextRequest(); }, 500); } } function nextRequest() { // increment counter i++; // next request if any if (i >= requestArray.length) { // No more to do return; } // submit next request submitRequest(); } // begin processing submitRequest(); };SIXTH - Done. Make. profit. Here is a working JSFiddle for it.
No comments:
Post a Comment