Update a feature in realtime
This example shows how to change an existing feature on a map by updating its data.
It shows the progression of a path by adding new coordinates to a feature in a line layer
. This approach is useful for visualizing real-time data sources.
Calling setData
begins a new render cycle which makes the updates appear in real time without explicitly creating an animation. panTo
then follows the leading edge of the line to keep it on screen.
<!DOCTYPE html><html><head><meta charset="utf-8" /><title>Update a feature in realtime</title><meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" /><script src="https://cdn.ndrive.com/nmapsgl/v.1.6.8/nmaps-gl.js"></script><link href="https://cdn.ndrive.com/nmapsgl/v.1.6.8/nmaps-gl.css" rel="stylesheet" /><style> body { margin: 0; padding: 0; } #map { position: absolute; top: 0; bottom: 0; width: 100%; }</style></head><body><div id="map"></div> <script src="https://d3js.org/d3.v3.min.js" charset="utf-8"></script><script> // TO MAKE THE MAP APPEAR YOU MUST ADD YOUR ACCESS TOKEN nmapsgl.accessToken = '<your access token here>'; const map = new nmapsgl.Map({container: 'map',style: 'Satellite',zoom: 0}); map.on('load', () => {// We use D3 to fetch the JSON here so that we can parse and use it separately// from GL JS's use in the added source. You can use any request method (library// or otherwise) that you want.d3.json('https://nmaps-gl.ndrive.com/nmaps-gl-js/assets/hike.geojson',(err, data) => {if (err) throw err; // save full coordinate list for laterconst coordinates = data.features[0].geometry.coordinates; // start by showing just the first coordinatedata.features[0].geometry.coordinates = [coordinates[0]]; // add it to the mapmap.addSource('trace', { type: 'geojson', data: data });map.addLayer({'id': 'trace','type': 'line','source': 'trace','paint': {'line-color': 'yellow','line-opacity': 0.75,'line-width': 5}}); // setup the viewportmap.jumpTo({ 'center': coordinates[0], 'zoom': 14 });map.setPitch(30); // on a regular basis, add more coordinates from the saved list and update the maplet i = 0;const timer = window.setInterval(() => {if (i < coordinates.length) {data.features[0].geometry.coordinates.push(coordinates[i]);map.getSource('trace').setData(data);map.panTo(coordinates[i]);i++;} else {window.clearInterval(timer);}}, 10);});});</script> </body></html>