Animate a point along a line
This example animates the position of a point by updating a GeoJSON source on each frame.
It first defines the animation as a GeoJSON object. Then it adds a GeoJSON source referring to that GeoJSON, and adds a circle layer that uses that source.
Finally, it starts the animation with the JavaScript window.requestAnimationFrame()
method to continuously update the GeoJSON object, resulting in a moving circle on the map.
<!DOCTYPE html><html><head><meta charset="utf-8"><title>Animate a point along a line</title><meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no"><link href="https://api.mapbox.com/mapbox-gl-js/v3.0.0/mapbox-gl.css" rel="stylesheet"><script src="https://api.mapbox.com/mapbox-gl-js/v3.0.0/mapbox-gl.js"></script><style>body { margin: 0; padding: 0; }#map { position: absolute; top: 0; bottom: 0; width: 100%; }</style></head><body><div id="map"></div><script> // TO MAKE THE MAP APPEAR YOU MUST // ADD YOUR ACCESS TOKEN FROM // https://account.mapbox.com mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN';const map = new mapboxgl.Map({container: 'map',// Choose from Mapbox's core styles, or make your own style with Mapbox Studiostyle: 'mapbox://styles/mapbox/streets-v12',center: [0, 0],zoom: 2}); const radius = 20; function pointOnCircle(angle) {return {'type': 'Point','coordinates': [Math.cos(angle) * radius, Math.sin(angle) * radius]};} map.on('load', () => {// Add a source and layer displaying a point which will be animated in a circle.map.addSource('point', {'type': 'geojson','data': pointOnCircle(0)}); map.addLayer({'id': 'point','source': 'point','type': 'circle','paint': {'circle-radius': 10,'circle-color': '#007cbf'}}); function animateMarker(timestamp) {// Update the data to a new position based on the animation timestamp. The// divisor in the expression `timestamp / 1000` controls the animation speed.map.getSource('point').setData(pointOnCircle(timestamp / 1000)); // Request the next frame of the animation.requestAnimationFrame(animateMarker);} // Start the animation.animateMarker(0);});</script> </body></html>
Was this example helpful?