• 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; 100%;height:100%;position: absolute;top: 0;">
        <div id="map" style=" 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>
  • 相关阅读:
    组合模式(Composition)
    [ASP.NET MVC 3 系列] ASP.NET MVC 3 Beta新特性以及.Net开源的趋势最新译文
    [ASP.NET MVC2 系列] Action Filters以及自定义OutputCache ActionFilterAttribute事件发生次序
    [原创]CLR GC垃圾收集过程模拟(用C#来显示垃圾收集过程的视觉效果)
    [ASP.NET MVC 专题] ViewEngine的发展以及应用
    [ASP.NET MVC 专题] 如何为Route构造相关的自定义Configuration
    效率最高的Excel数据导入(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)
    ASP.NET页面生命周期的整体把握
    效率最高的Excel数据导入续SSIS Package包制作图解全过程
    Flex父子窗口传值
  • 原文地址:https://www.cnblogs.com/yaohuimo/p/9515464.html
Copyright © 2020-2023  润新知