首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何计算像geojson.io这样的Leaflet中折线的距离?

如何计算像geojson.io这样的Leaflet中折线的距离?
EN

Stack Overflow用户
提问于 2015-07-04 21:19:39
回答 4查看 20.2K关注 0票数 11

我正在使用Mapbox和Leaflet处理地图,我应该让用户绘制多边形并计算和显示该多边形的区域,我还需要让用户绘制折线并显示折线的距离。

我已经弄清楚了多边形面积特征,但我不知道如何计算折线的距离。

我的代码如下:

代码语言:javascript
复制
loadScript('https://api.tiles.mapbox.com/mapbox.js/plugins/leaflet-draw/v0.2.2/leaflet.draw.js', function(){
    loadScript('https://api.tiles.mapbox.com/mapbox.js/plugins/leaflet-geodesy/v0.1.0/leaflet-geodesy.js', function(){
        var featureGroup = L.featureGroup().addTo(map);

        var drawControl = new L.Control.Draw({
        edit: {
            featureGroup: featureGroup
        },
        draw: {
            polygon: true,
            polyline: true,
            rectangle: false,
            circle: false,
            marker: false
        }
    }).addTo(map);

    map.on('draw:created', showPolygonArea);
    map.on('draw:edited', showPolygonAreaEdited);

    function showPolygonAreaEdited(e) {
        e.layers.eachLayer(function(layer) {
            showPolygonArea({ layer: layer });
        });
    }
    function showPolygonArea(e) {
        var type = e.layerType,
        layer = e.layer;

        if (type === 'polygon') {
            featureGroup.clearLayers();
            featureGroup.addLayer(e.layer);
            e.layer.bindPopup(((LGeo.area(e.layer) / 1000000) * 0.62137).toFixed(2) + ' mi<sup>2</sup>');
            e.layer.openPopup();
        }

        if (type === 'polyline') {
            featureGroup.clearLayers();
            featureGroup.addLayer(e.layer);
            // What do I do different here to calculate the distance of the polyline?
            // Is there a method in the LGeo lib itself?
            // e.layer.bindPopup(((LGeo.area(e.layer) / 1000000) * 0.62137).toFixed(2) + ' mi<sup>2</sup>');
            e.layer.openPopup();
        }

    }
    });
});

在LGeo库中有没有一个方法可以帮助我计算折线的距离?geogson.io的开发人员也有计算距离的方法,但我看不出他们的代码。我不是一个经验丰富的Javascript开发人员。欢迎任何帮助。:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-07-05 02:19:26

所以我最终自己想出了一个算法。我基本上找到了折线的属性,它包含了折线的所有latlngs,然后我让它经过一个循环,我使用Leaflet中的distanceTo方法计算点之间的距离,并不断将它们添加到totalDistance变量中。

代码语言:javascript
复制
if (type === 'polyline') {
    featureGroup.clearLayers();
    featureGroup.addLayer(e.layer);

    // Calculating the distance of the polyline
    var tempLatLng = null;
    var totalDistance = 0.00000;
    $.each(e.layer._latlngs, function(i, latlng){
        if(tempLatLng == null){
            tempLatLng = latlng;
            return;
        }

        totalDistance += tempLatLng.distanceTo(latlng);
        tempLatLng = latlng;
    });
    e.layer.bindPopup((totalDistance).toFixed(2) + ' meters');
    e.layer.openPopup();
}
票数 20
EN

Stack Overflow用户

发布于 2016-01-16 20:20:45

我通过扩展L.Polyline类并使用LatLngdistanceTo方法解决了这个问题:

代码语言:javascript
复制
L.Polyline = L.Polyline.include({
    getDistance: function(system) {
        // distance in meters
        var mDistanse = 0,
            length = this._latlngs.length;
        for (var i = 1; i < length; i++) {
            mDistanse += this._latlngs[i].distanceTo(this._latlngs[i - 1]);
        }
        // optional
        if (system === 'imperial') {
            return mDistanse / 1609.34;
        } else {
            return mDistanse / 1000;
        }
    }
});

希望这能帮助到别人。

票数 15
EN

Stack Overflow用户

发布于 2015-07-24 19:58:03

这也是计算圆面积的解。

代码语言:javascript
复制
else if (type === 'circle') {
     var area = 0;
     var radius = e.layer.getRadius();
     area = (Math.PI) * (radius * radius);
     e.layer.bindPopup((area / 1000000).toFixed(2) + ' km<sup>2</sup>');
     e.layer.openPopup();
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31221088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档