leaflet计算多边形面积

本文介绍如何使用Leaflet绘制圆形,并通过不同方法计算圆形的面积,包括使用数学公式、turf.js库及地图服务。

上一篇介绍了使用leaflet绘制圆形,那如何计算圆形的面积呢?

1、使用数学公式计算,绘制好圆形后,获取中心点以及半径即可

2、使用第三方工具计算,如turf.js. 这里turf的area方法入参为geojson对象

3、使用超图的地图服务做面积计算,见下文范例

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>图形绘制并计算面积</title>
</head>

<body style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%;position: absolute;top: 0;">
    <div id="map" style="width: 100%;height:100%"></div>
    <script type="text/javascript" include="turf,leaflet.draw" src="../../dist/include-leaflet.js"></script>

    <script type="text/javascript">
        var map, url = "http://support.supermap.com.cn:8090/iserver/services/map-china400/rest/maps/China";
        map = L.map('map', {
            center: [33, 114],
            zoom: 4
        });
        L.supermap.tiledMapLayer(url).addTo(map);

        var editableLayers = new L.FeatureGroup();
        map.addLayer(editableLayers);

        var drawControl = new L.Control.Draw({
            position: 'topleft',
            draw: {
                polyline: false,
                polygon: false,
                circle: {},
                rectangle: false,
                marker: false,
                remove: true
            },
            edit: {
                featureGroup: editableLayers,
                remove: true
            }
        });
        map.addControl(drawControl);
        handleMapEvent(drawControl._container, map);

        map.on(L.Draw.Event.CREATED, function (e) {
            var type = e.layerType,
                layer = e.layer;
            if (type === 'marker') {
                layer.bindPopup('A popup!');
            }
            editableLayers.addLayer(layer);

            //绘制完成后,获取圆形的半径和中心点坐标
            var radius = layer._mRadius;
            var lonlat = layer._latlng;
            console.log(radius + ";  " + lonlat);

            //点集
            var parts = [];
            //计算圆的边缘所有点
            for (var i = 0; i < 360; i++) {
                var radians = (i + 1) * Math.PI / 180;
                var circlePoint = [Math.cos(radians) * radius + lonlat.lat, Math.sin(radians) * radius + lonlat
                    .lng
                ];
                parts[i] = circlePoint;
            }
            //用点集来构造leaflet的面对象
            var polygon1 = L.polygon(parts);



            //服务端计算面积
            //getAreaByServer(polygon1);
            //数学公式计算面积
            //getAreaByClient(radius);
            //turf计算面积
            getAreaByTurf(polygon1.toGeoJSON());
        });


        function getAreaByClient(radius) {
            //使用数学公式或者用turf计算
            var square = radius * radius * Math.PI;
            alert("面积: " + square + "  平方米");
        }

        function getAreaByTurf(polygon) {
            var area = turf.area(polygon);
            alert("面积: " + area + "  平方米");
        }


        function getAreaByServer(polygon) {
            //参数说明: SuperMap.MeasureParameters(geometry, options)
            // distanceMode(指定量算的方式为按球面长度 'Geodesic' 或者平面长度 'Planar' 来计算,默认是球面)
            // prjCoordSys(指定该量算操作所使用的投影)
            // unit (量算单位。默认量算结果以米为单位)
            var areaMeasureParam = new SuperMap.MeasureParameters(polygon, { distanceMode: 'Geodesic' });
            L.supermap
                .measureService(url)
                .measureArea(areaMeasureParam, function (serviceResult) {
                    alert("面积: " + serviceResult.result.area + "  平方米");
                });
        }




        function handleMapEvent(div, map) {
            if (!div || !map) {
                return;
            }
            div.addEventListener('mouseover', function () {
                map.scrollWheelZoom.disable();
                map.doubleClickZoom.disable();
            });
            div.addEventListener('mouseout', function () {
                map.scrollWheelZoom.enable();
                map.doubleClickZoom.enable();
            });
        }
    </script>
</body>

</html>

 

转载于:https://www.cnblogs.com/yaohuimo/p/9515464.html

### 如何在 Leaflet 中实现测量多边形面积的功能 要在 Leaflet 地图中实现多边形面积的测量功能,可以通过多种方法完成。以下是几种常见的解决方案及其具体实现方式。 #### 方法一:使用 `leaflet-measure` 插件 插件 `leaflet-measureCoordinate` 提供了一种简单的方式来集成线性距离和区域测量工具到 Leaflet 地图中[^1]。该插件支持绘制多边形并自动计算面积。通过引入此插件,开发者无需手动编写复杂的逻辑即可快速启用测量功能。 安装与初始化代码如下所示: ```javascript // 引入 leafletleaflet-measure 插件 import L from 'leaflet'; import 'https://gitcode.com/gh_mirrors/le/leaflet-measure/dist/leaflet-measure.js'; const map = L.map('map').setView([51.505, -0.09], 13); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, }).addTo(map); // 添加测量控件 var measureControl = new L.Control.Measure({ primaryLengthUnit: 'meters', secondaryLengthUnit: 'kilometers', primaryAreaUnit: 'sqmeters', activeColor: '#ff0000' }); measureControl.addTo(map); ``` 上述代码片段展示了如何加载地图以及配置测量控制面板来允许用户创建自定义几何图形,并实时查看它们对应的面积数值。 --- #### 方法二:基于 Vue 和 Leaflet 的组合方案 如果开发环境涉及前端框架(如 Vue),则可以参考引用中的实例说明,在 vue+leaflet 结合场景下构建交互式的测量模块[^2]。这种情况下通常会利用事件监听器捕获用户的鼠标操作行为,动态更新界面上展示的数据信息。 下面是一个简单的例子用于解释这一过程: ```html <template> <div id="app"> <div id="map"></div> </template> <script> export default { data() => ({ polygons: [] }), mounted(){ this.initMap(); }, methods:{ initMap(){ let self=this; self.map=L.map('map',{center:[47,-80],zoom:6}); L.tileLayer('http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',{ maxZoom:18,minZoom:3 }).addTo(self.map); self.drawnItems=new L.FeatureGroup().addTo(self.map); self.map.on(L.Draw.Event.CREATED,(e)=>{ const layer=e.layer; let geoJson=layer.toGeoJSON(); // 转化为 GeoJSON 格式 console.log(geoJson.geometry.coordinates); self.polygons.push(layer); self.calculateAreas(); }); function calculateAreas(){ var totalSqMtrs=0; this.polygons.forEach((polygon)=>{ try{ var sqMtr=turf.area(polygon.toGeoJSON()); document.getElementById("output").innerHTML += "<p>Area:"+Math.round(sqMtr*10)/10+" square meters.</p>"; totalSqMtrs+=sqMtr; }catch(err){ alert(`Error calculating area ${err}`); } }); } } } }; </script> ``` 在此模板里我们不仅实现了基本的地图渲染还加入了绘图组件以便于捕捉新形成的对象进而调用外部库函数求解表面积^[]^. --- #### 方法三:纯原生 JavaScript 实现 对于不希望依赖额外第三方扩展包的情况,则可以直接采用标准 API 来达成目标。例如借助 Turf.js 库处理地理空间运算任务或者单纯依靠内置算法解析 WGS84 坐标系下的经纬度集合从而得出最终结果[^3][^4]. 一个典型的应用案例就是先获取所有顶点位置再传送给专门负责此类工作的服务端接口做进一步分析;当然也可以完全客户端内部解决只是需要注意精度损失等问题。 下面是仅靠 JS 完成的一个简化版本示范: ```javascript function polygonArea(coords) { let radianSum = coords.reduce(function(sum,[lon,lat]){ lon *= Math.PI / 180; lat *= Math.PI / 180; return sum + (lat * Math.cos(lon)); }, 0); return Math.abs(radianSum)*6378137*6378137/2; } // Example usage with an array of coordinate pairs. console.log(polygonArea([[0,0],[0,1],[1,1],[1,0]])); // Outputs approx value in Sq Mts ``` 以上脚本定义了一个接受二维数组参数的方法用来估算给定路径所包围起来的土地大小单位默认设为平方米. --- ### 总结 综上所述,无论选择哪种途径都能有效达到预期效果即让用户能够在网页版 GIS 平台上便捷地测定任意闭合轮廓的实际占地面积数据。每一种技术路线都有各自的优势所在因此需根据实际需求权衡利弊之后作出最佳抉择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值