使用turf.js和mapbox测量绘制的线长

时间:2018-07-15 04:52:59

标签: mapbox

我正在尝试使用turf.js的“长度”功能来构建该功能,以测量用户在Mapbox地图上绘制的线。

那就是说,我是一名编码新手-我只知道有点危险。

最终,我希望能够同时绘制区域和线条,并返回它们各自的度量值(多边形的面积,线串的长度)。

任何人都可以提供有关此代码为何不起作用的见解吗?

https://jsfiddle.net/knxwu342

<html>
<head>
<meta charset=utf-8 />
<title>Line Test</title>
<meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
<style>
    body { margin:0; padding:0; }
    #map { position:absolute; top:0; bottom:0; width:100%; }

    .calculation-box-length {
        height: 75px;
        width: 100px;
        position: absolute;
        bottom: 40px;
        left: 10px;
        background-color: rgba(255, 255, 255, .9);
        padding: 15px;
        text-align: center;
    }

</style>

<script src='https://api.tiles.mapbox.com/mapbox.js/plugins/turf/v3.0.11/turf.min.js'> 
</script>
<script src='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.9/mapbox-gl-draw.js'></script>
<link rel='stylesheet' href='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.9/mapbox-gl-draw.css' type='text/css'/>

<script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.45.0/mapbox-gl.js'> 
</script>
<link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.45.0/mapbox-gl.css' rel='stylesheet' />

</head>
<body>
<div id='map'></div>

<div class='calculation-box-length'>
<p>Length:</p>
<div id='calculated-length'></div>
</div>

<nav id="menu"></nav>

<script>mapboxgl.accessToken = 'pk.eyJ1IjoibWJsYWNrbGluIiwiYSI6ImNqaWMxcGk2MzAwd3YzbG1oeW4yOHppdnYifQ.xdb-2slu5LapzpuMCiKzQQ';

//*********-----------------------------------------------------------------------------------------------------------------**********
//Create new map object
var map = new mapboxgl.Map({
container: 'map', // container id
style: 'mapbox://styles/mblacklin/cjii8o7w91g9o2stcktaeixai', // stylesheet location
center: [-117.572737, 51.746916], // starting position [lng, lat]
zoom: 16 // starting zoom
});
//*********-----------------------------------------------------------------------------------------------------------------**********
// Add navigation controls to the map
map.addControl(new mapboxgl.NavigationControl());


//*********-----------------------------------------------------------------------------------------------------------------**********
// Add the ability to draw geometries and display their measurements
//
var draw = new MapboxDraw({
displayControlsDefault: false,
controls: {
    line_string: true,
    polygon: true,
    trash: true
}
});

map.addControl(draw);

map.on('draw.create.', updateLength);
map.on('draw.delete', updateLength);
map.on('draw.update', updateLength);

function updateLength(e) {
var data = draw.getAll();
var answer = document.getElementById('calculated-length');
if (data.features.length > 0) {
    var length = turf.length(data);
    // restrict to area to 2 decimal points
    answer.innerHTML = '<p><strong>' + length + '</strong></p><p> meters</p>';
} else {
    answer.innerHTML = '';
    if (e.type !== 'draw.delete') alert("Use the draw tools in the upper right to calculate a distance");
}
};
//
//*********-----------------------------------------------------------------------------------------------------------------**********  
</script>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

我在您的代码中看到两个小问题:

  1. draw.create ”侦听器中有一个错字。只需在 create 创建后删除点:

    map.on('draw.create',updateLength);

  2. 您使用的Turf版本太旧,似乎没有长度功能。尝试使用最新的版本:https://npmcdn.com/@turf/turf/turf.min.js