Google Maps Animated Polyline
CSS
GoogleMaps
JavaScript
Website
jQuery
This demo shows two ways of showing the direction of a Google Maps PolyLine. One method is by moving an icon along the path of the PolyLine. The other method is by drawing another PolyLine on top of the other one section at a time to create an animation.
Download the JavaScript (Minified)
View source on GitHubCode Snippets
var map; var polyline; var bounds; var linePartArr = []; //timeout because jquery script is loaded later that this js file on this page setTimeout(function () { initializePolylineMap(52.52000, 5.28662); }, 50); //create the map function initializePolylineMap(lat, lng) { //coord for the center of the map var startpos = new google.maps.LatLng(lat, lng); //map options var options = { zoom: 8, center: startpos, zoomControl: true, mapTypeControl: false, scaleControl: false, streetViewControl: false, rotateControl: false, fullscreenControl: false, mapTypeId: google.maps.MapTypeId.TERRAIN }; //start the map map = new google.maps.Map(document.getElementById('map_canvas'), options); //add bounds bounds = new google.maps.LatLngBounds(); //create the polyline createPolyLine(); //animate the polyline drawing animatePolyline(); //animate the icon animateIcon(); //make an array of maps coordinates for the bounds for (var i = 0; i < lineCoordinates.length; i++) { var pos = new google.maps.LatLng(lineCoordinates[i].lat, lineCoordinates[i].lng); bounds.extend(pos); } //fit the map within the bounds map.fitBounds(bounds); } //add a polyline to the map function createPolyLine() { //create a symbol to animate along the route var lineSymbol = { path: google.maps.SymbolPath.CIRCLE, scale: 8, fillColor: '#566895', fillOpacity: 1, strokeColor: '#282c41', strokeOpacity: 1, strokeWeight: 2 }; //create a polyline polyline = new google.maps.Polyline({ path: lineCoordinates, strokeColor: '#f39e9e', strokeWeight: 5, icons: [ { icon: lineSymbol, offset: '100%' }, ], map: map }); } //animate the icon on the map function animateIcon() { var lineOffset = 0; //experiment with the speed based on the length of the line var iconSpeed = 0.2; //move the icon setInterval(function () { lineOffset = (lineOffset + iconSpeed) % 200; var lineIcon = polyline.get('icons'); lineIcon[0].offset = lineOffset / 2 + '%'; polyline.set('icons', lineIcon); }, 20); } //animate the drawing of the polyline function animatePolyline() { var i = 0; var pause = false; var pauseLineRemove = 1500; var pauseRedrawLine = 1000; //experiment with the speed based on the total parts in the line var drawSpeed = 50; setInterval(function () { //check if the end of the array is reached if (i + 1 == lineCoordinates.length && !pause) { pause = true; //remove all the line parts, optionally with a delay to keep the fully drawn line on the map for a while setTimeout(function () { for (var j = 0; j < linePartArr.length; j++) { linePartArr[j].setMap(null); } linePartArr = []; }, pauseLineRemove); //delay the drawing of the next animated line setTimeout(function () { pause = false; i = 0; }, pauseRedrawLine + pauseLineRemove); } //create a line part between the current and next coordinate if (!pause) { var part = []; part.push(lineCoordinates[i]); part.push(lineCoordinates[i + 1]); //create a polyline var linePart = new google.maps.Polyline({ path: part, strokeColor: '#ff0000', strokeOpacity: 1, strokeWeight: 5, zIndex: i + 2, map: map }); //add the polyline to an array linePartArr.push(linePart); i++; } }, drawSpeed); }
In this example the Array lineCoordinates
with the coordinates of the PolyLine is in the following format.
var lineCoordinates = [ { lat: 53.531003, lng: 6.483307 }, { lat: 53.441118, lng: 6.834869 }, { lat: 53.339565, lng: 6.884308 } ];