function initMap(): void { const markerArray: google.maps.Marker[] = []; // Instantiate a directions service. const directionsService = new google.maps.DirectionsService(); // Create a map and center it on Manhattan. const map = new google.maps.Map( document.getElementById("map") as HTMLElement, { zoom: 13, center: { lat: 40.771, lng: -73.974 }, } ); // Create a renderer for directions and bind it to the map. const directionsRenderer = new google.maps.DirectionsRenderer({ map: map }); // Instantiate an info window to hold step text. const stepDisplay = new google.maps.InfoWindow(); // Display the route between the initial start and end selections. calculateAndDisplayRoute( directionsRenderer, directionsService, markerArray, stepDisplay, map ); // Listen to change events from the start and end lists. const onChangeHandler = function () { calculateAndDisplayRoute( directionsRenderer, directionsService, markerArray, stepDisplay, map ); }; (document.getElementById("start") as HTMLElement).addEventListener( "change", onChangeHandler ); (document.getElementById("end") as HTMLElement).addEventListener( "change", onChangeHandler ); } function calculateAndDisplayRoute( directionsRenderer: google.maps.DirectionsRenderer, directionsService: google.maps.DirectionsService, markerArray: google.maps.Marker[], stepDisplay: google.maps.InfoWindow, map: google.maps.Map ) { // First, remove any existing markers from the map. for (let i = 0; i < markerArray.length; i++) { markerArray[i].setMap(null); } // Retrieve the start and end locations and create a DirectionsRequest using // WALKING directions. directionsService .route({ origin: (document.getElementById("start") as HTMLInputElement).value, destination: (document.getElementById("end") as HTMLInputElement).value, travelMode: google.maps.TravelMode.WALKING, }) .then((result: google.maps.DirectionsResult) => { // Route the directions and pass the response to a function to create // markers for each step. (document.getElementById("warnings-panel") as HTMLElement).innerHTML = "<b>" + result.routes[0].warnings + "</b>"; directionsRenderer.setDirections(result); showSteps(result, markerArray, stepDisplay, map); }) .catch((e) => { window.alert("Directions request failed due to " + e); }); } function showSteps( directionResult: google.maps.DirectionsResult, markerArray: google.maps.Marker[], stepDisplay: google.maps.InfoWindow, map: google.maps.Map ) { // For each step, place a marker, and add the text to the marker's infowindow. // Also attach the marker to an array so we can keep track of it and remove it // when calculating new routes. const myRoute = directionResult!.routes[0]!.legs[0]!; for (let i = 0; i < myRoute.steps.length; i++) { const marker = (markerArray[i] = markerArray[i] || new google.maps.Marker()); marker.setMap(map); marker.setPosition(myRoute.steps[i].start_location); attachInstructionText( stepDisplay, marker, myRoute.steps[i].instructions, map ); } } function attachInstructionText( stepDisplay: google.maps.InfoWindow, marker: google.maps.Marker, text: string, map: google.maps.Map ) { google.maps.event.addListener(marker, "click", () => { // Open an info window when the marker is clicked on, containing the text // of the step. stepDisplay.setContent(text); stepDisplay.open(map, marker); }); } declare global { interface Window { initMap: () => void; } } window.initMap = initMap;Note: Read the guide on using TypeScript and Google Maps. JavaScript
function initMap() { const markerArray = []; // Instantiate a directions service. const directionsService = new google.maps.DirectionsService(); // Create a map and center it on Manhattan. const map = new google.maps.Map(document.getElementById("map"), { zoom: 13, center: { lat: 40.771, lng: -73.974 }, }); // Create a renderer for directions and bind it to the map. const directionsRenderer = new google.maps.DirectionsRenderer({ map: map }); // Instantiate an info window to hold step text. const stepDisplay = new google.maps.InfoWindow(); // Display the route between the initial start and end selections. calculateAndDisplayRoute( directionsRenderer, directionsService, markerArray, stepDisplay, map, ); // Listen to change events from the start and end lists. const onChangeHandler = function () { calculateAndDisplayRoute( directionsRenderer, directionsService, markerArray, stepDisplay, map, ); }; document.getElementById("start").addEventListener("change", onChangeHandler); document.getElementById("end").addEventListener("change", onChangeHandler); } function calculateAndDisplayRoute( directionsRenderer, directionsService, markerArray, stepDisplay, map, ) { // First, remove any existing markers from the map. for (let i = 0; i < markerArray.length; i++) { markerArray[i].setMap(null); } // Retrieve the start and end locations and create a DirectionsRequest using // WALKING directions. directionsService .route({ origin: document.getElementById("start").value, destination: document.getElementById("end").value, travelMode: google.maps.TravelMode.WALKING, }) .then((result) => { // Route the directions and pass the response to a function to create // markers for each step. document.getElementById("warnings-panel").innerHTML = "<b>" + result.routes[0].warnings + "</b>"; directionsRenderer.setDirections(result); showSteps(result, markerArray, stepDisplay, map); }) .catch((e) => { window.alert("Directions request failed due to " + e); }); } function showSteps(directionResult, markerArray, stepDisplay, map) { // For each step, place a marker, and add the text to the marker's infowindow. // Also attach the marker to an array so we can keep track of it and remove it // when calculating new routes. const myRoute = directionResult.routes[0].legs[0]; for (let i = 0; i < myRoute.steps.length; i++) { const marker = (markerArray[i] = markerArray[i] || new google.maps.Marker()); marker.setMap(map); marker.setPosition(myRoute.steps[i].start_location); attachInstructionText( stepDisplay, marker, myRoute.steps[i].instructions, map, ); } } function attachInstructionText(stepDisplay, marker, text, map) { google.maps.event.addListener(marker, "click", () => { // Open an info window when the marker is clicked on, containing the text // of the step. stepDisplay.setContent(text); stepDisplay.open(map, marker); }); } window.initMap = initMap;Note: The JavaScript is compiled from the TypeScript snippet. CSS
/* * Always set the map height explicitly to define the size of the div element * that contains the map. */ #map { height: 100%; } /* * Optional: Makes the sample page fill the window. */ html, body { height: 100%; margin: 0; padding: 0; } #floating-panel { position: absolute; top: 10px; left: 25%; z-index: 5; background-color: #fff; padding: 5px; border: 1px solid #999; text-align: center; font-family: "Roboto", "sans-serif"; line-height: 30px; padding-left: 10px; } #warnings-panel { width: 100%; height: 10%; text-align: center; }HTML
<html> <head> <title>Directions Service (Complex)</title> <link rel="stylesheet" type="text/css" href="./style.css" /> <script type="module" src="./index.js"></script> </head> <body> <div id="floating-panel"> <b>Start: </b> <select id="start"> <option value="penn station, new york, ny">Penn Station</option> <option value="grand central station, new york, ny"> Grand Central Station </option> <option value="625 8th Avenue, New York, NY, 10018"> Port Authority Bus Terminal </option> <option value="staten island ferry terminal, new york, ny"> Staten Island Ferry Terminal </option> <option value="101 E 125th Street, New York, NY"> Harlem - 125th St Station </option> </select> <b>End: </b> <select id="end"> <option value="260 Broadway New York NY 10007">City Hall</option> <option value="W 49th St & 5th Ave, New York, NY 10020"> Rockefeller Center </option> <option value="moma, New York, NY">MOMA</option> <option value="350 5th Ave, New York, NY, 10118"> Empire State Building </option> <option value="253 West 125th Street, New York, NY"> Apollo Theater </option> <option value="1 Wall St, New York, NY">Wall St</option> </select> </div> <div id="map"></div> <div id="warnings-panel"></div> <!-- The `defer` attribute causes the script to execute after the full HTML document has been parsed. For non-blocking uses, avoiding race conditions, and consistent behavior across browsers, consider loading using Promises. See https://developers.google.com/maps/documentation/javascript/load-maps-js-api for more information. --> <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=initMap&v=weekly" defer ></script> </body> </html>
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4