Measure distances
Click points on a map to create lines that measure distanced using turf.length.
Note
If you want to test this example, edit it in JSFiddle or CodePen and replace the "YOUR-OWN-API-KEY" and "YOUR-OWN-VPM-ID" placeholders with your actual api key and vpm id.<!DOCTYPE html><html><head><meta charset="utf-8" /><title>Measure distances</title><meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" /><script src="https://unpkg.com/unl-map-js@0.1.5/lib/unl-map-js.js"></script><link href="https://unpkg.com/unl-map-js@0.1.5/lib/unl-map-js.css" rel="stylesheet" /><linkhref="https://unpkg.com/maplibre-gl@2.1.9/dist/maplibre-gl.css"rel="stylesheet"/><style> body { margin: 0; padding: 0; } #map { position: absolute; top: 0; bottom: 0; width: 100%; }</style></head><body><style>.distance-container {position: absolute;top: 10px;left: 10px;z-index: 1;} .distance-container > * {background-color: rgba(0, 0, 0, 0.5);color: #fff;font-size: 11px;line-height: 18px;display: block;margin: 0;padding: 5px 10px;border-radius: 3px;}</style> <div id="map"></div><div id="distance" class="distance-container"></div> <script src="https://npmcdn.com/@turf/turf@5.1.6/turf.min.js"></script><script>var map = new UnlSdk.Map({container: "map",apiKey: "YOUR-OWN-API-KEY",vpmId: "YOUR-OWN-VPM-ID",center: [2.3399, 48.8555],zoom: 12,}); var distanceContainer = document.getElementById("distance"); // GeoJSON object to hold our measurement featuresvar geojson = {type: "FeatureCollection",features: [],}; // Used to draw a line between pointsvar linestring = {type: "Feature",geometry: {type: "LineString",coordinates: [],},}; map.on("load", function () {map.addSource("geojson", {type: "geojson",data: geojson,}); // Add styles to the mapmap.addLayer({id: "measure-points",type: "circle",source: "geojson",paint: {"circle-radius": 5,"circle-color": "#000",},filter: ["in", "$type", "Point"],});map.addLayer({id: "measure-lines",type: "line",source: "geojson",layout: {"line-cap": "round","line-join": "round",},paint: {"line-color": "#000","line-width": 2.5,},filter: ["in", "$type", "LineString"],}); map.on("click", function (e) {var features = map.queryRenderedFeatures(e.point, {layers: ["measure-points"],}); // Remove the linestring from the group// So we can redraw it based on the points collectionif (geojson.features.length > 1) geojson.features.pop(); // Clear the Distance container to populate it with a new valuedistanceContainer.innerHTML = ""; // If a feature was clicked, remove it from the mapif (features.length) {var id = features[0].properties.id;geojson.features = geojson.features.filter(function (point) {return point.properties.id !== id;});} else {var point = {type: "Feature",geometry: {type: "Point",coordinates: [e.lngLat.lng, e.lngLat.lat],},properties: {id: String(new Date().getTime()),},}; geojson.features.push(point);} if (geojson.features.length > 1) {linestring.geometry.coordinates = geojson.features.map(function (point) {return point.geometry.coordinates;}); geojson.features.push(linestring); // Populate the distanceContainer with total distancevar value = document.createElement("pre");value.textContent ="Total distance: " + turf.length(linestring).toLocaleString() + "km";distanceContainer.appendChild(value);} map.getSource("geojson").setData(geojson);});}); map.on("mousemove", function (e) {var features = map.queryRenderedFeatures(e.point, {layers: ["measure-points"],});// UI indicator for clicking/hovering a point on the mapmap.getCanvas().style.cursor = features.length ? "pointer" : "crosshair";});</script> </body></html>