leaflet计算多边形面积

上一篇介绍了使用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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Leaflet是一个非常流行的JavaScript库,它可以用来创建交互式的Web地图。要绘制多边形,需要使用Leaflet的绘图插件——Leaflet.draw。 下面是一个简单的示例: 1. 引入LeafletLeaflet.draw库 ```html <!-- Leaflet --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet@1.7.1/dist/leaflet.css" /> <script src="https://cdn.jsdelivr.net/npm/leaflet@1.7.1/dist/leaflet.js"></script> <!-- Leaflet.draw --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.js"></script> ``` 2. 创建地图容器 ```html <div id="map" style="width: 100%; height: 400px;"></div> ``` ```javascript // 初始化地图 var map = L.map('map').setView([51.505, -0.09], 13); // 添加OSM地图图层 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors', maxZoom: 18 }).addTo(map); ``` 3. 添加绘图工具 ```javascript // 添加绘图工具 var drawControl = new L.Control.Draw({ draw: { polygon: true, // 允许绘制多边形 polyline: false, rectangle: false, circle: false, marker: false, circlemarker: false }, edit: { featureGroup: drawnItems // 将绘制的图形添加到drawnItems图层 } }).addTo(map); ``` 4. 处理绘制完成事件 ```javascript // 处理绘制完成事件 map.on('draw:created', function(e) { var layer = e.layer; drawnItems.addLayer(layer); }); ``` 完整代码如下: ```html <!DOCTYPE html> <html> <head> <title>Leaflet Draw Demo</title> <!-- Leaflet --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet@1.7.1/dist/leaflet.css" /> <script src="https://cdn.jsdelivr.net/npm/leaflet@1.7.1/dist/leaflet.js"></script> <!-- Leaflet.draw --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.js"></script> </head> <body> <div id="map" style="width: 100%; height: 400px;"></div> <script> // 初始化地图 var map = L.map('map').setView([51.505, -0.09], 13); // 添加OSM地图图层 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors', maxZoom: 18 }).addTo(map); // 添加绘图工具 var drawnItems = new L.FeatureGroup(); map.addLayer(drawnItems); var drawControl = new L.Control.Draw({ draw: { polygon: true, // 允许绘制多边形 polyline: false, rectangle: false, circle: false, marker: false, circlemarker: false }, edit: { featureGroup: drawnItems // 将绘制的图形添加到drawnItems图层 } }).addTo(map); // 处理绘制完成事件 map.on('draw:created', function(e) { var layer = e.layer; drawnItems.addLayer(layer); }); </script> </body> </html> ``` 运行代码,你可以在地图上用鼠标绘制多边形。绘制完成后,多边形将会被添加到地图上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值