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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM