百度地图中多边形覆盖物的面积计算

面积计算原理

参考古人的定理:球面多边形计算面积的关键在于计算多边形所有角的度数,对于球面N变形,所有角的和为S,球的半径为R,面积计算公式:

(S(N2)Pi)RR


直接在地图上显示一个多边形覆盖物

<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=秘钥"></script>
<body>
  <div id="allmap" style="width:100%;height:100%"></div>
  <script type="text/javascript">

    var map = new BMap.Map("allmap");
    map.centerAndZoom(new BMap.Point(121.329178,31.184047), 14);
    map.enableScrollWheelZoom();

        //添加固定范围
        var polygon = new BMap.Polygon([
        new BMap.Point(121.309056,31.22383),
        new BMap.Point(121.309918,31.207647),
        new BMap.Point(121.322998,31.185036),
        new BMap.Point(121.331046,31.171689),
        new BMap.Point(121.331621,31.170082),
        new BMap.Point(121.353324,31.177868),
        new BMap.Point(121.363673,31.187755),
        new BMap.Point(121.35548,31.229018),
        new BMap.Point(121.335646,31.229141),
        new BMap.Point(121.317967,31.224201)
        ], {strokeColor:"red", strokeWeight:2, strokeOpacity:0.8});  //创建多边形

        map.addOverlay(polygon);   //增加多边形

    </script>

</body>
</html>

计算面积逻辑代码如下:

      //参数是一个百度类型的多边形覆盖物
      function getArea(polygon){

        // 检查类型:既不是百度类型的范围又不是数组类型的数据,直接返回0
        if (!(polygon instanceof BMap.Polygon) && !(polygon instanceof Array)) {
                return 0;
        }

         //如果是百度类型的,得到点集合,不是的话,另说。
         var pts = new Array();
         if (polygon instanceof BMap.Polygon) {
              pts = polygon.getPath();
         }

         //判断数组的长度,如果是小于3的话,不构成面,无法计算面积
         if (pts.length < 3) {
                return 0;
         }

         var totalArea = 0;// 初始化总面积
         var LowX = 0.0; 
         var LowY = 0.0; 
         var MiddleX = 0.0;
         var MiddleY = 0.0;
         var HighX = 0.0;
         var HighY = 0.0;
         var AM = 0.0;
         var BM = 0.0;
         var CM = 0.0;
         var AL = 0.0;
         var BL = 0.0;
         var CL = 0.0;
         var AH = 0.0;
         var BH = 0.0;
         var CH = 0.0;
         var CoefficientL = 0.0;
         var CoefficientH = 0.0;
         var ALtangent = 0.0;
         var BLtangent = 0.0;
         var CLtangent = 0.0;
         var AHtangent = 0.0;
         var BHtangent = 0.0;
         var CHtangent = 0.0;
         var ANormalLine = 0.0;
         var BNormalLine = 0.0;
         var CNormalLine = 0.0;
         var OrientationValue = 0.0;
         var AngleCos = 0.0;
         var Sum1 = 0.0;
         var Sum2 = 0.0;
         var Count2 = 0;
         var Count1 = 0;
         var Sum = 0.0;
         var Radius = 6378137.0;// ,WGS84椭球半径
         var Count = pts.length;
          for ( var i = 0; i < Count; i++) {
                if (i == 0) {
                    LowX = pts[Count - 1].lng * Math.PI / 180;
                    LowY = pts[Count - 1].lat * Math.PI / 180;
                    MiddleX = pts[0].lng * Math.PI / 180;
                    MiddleY = pts[0].lat * Math.PI / 180;
                    HighX = pts[1].lng * Math.PI / 180;
                    HighY = pts[1].lat * Math.PI / 180;
                } else if (i == Count - 1) {
                    LowX = pts[Count - 2].lng * Math.PI / 180;
                    LowY = pts[Count - 2].lat * Math.PI / 180;
                    MiddleX = pts[Count - 1].lng * Math.PI / 180;
                    MiddleY = pts[Count - 1].lat * Math.PI / 180;
                    HighX = pts[0].lng * Math.PI / 180;
                    HighY = pts[0].lat * Math.PI / 180;
                } else {
                    LowX = pts[i - 1].lng * Math.PI / 180;
                    LowY = pts[i - 1].lat * Math.PI / 180;
                    MiddleX = pts[i].lng * Math.PI / 180;
                    MiddleY = pts[i].lat * Math.PI / 180;
                    HighX = pts[i + 1].lng * Math.PI / 180;
                    HighY = pts[i + 1].lat * Math.PI / 180;
                }
                AM = Math.cos(MiddleY) * Math.cos(MiddleX);
                BM = Math.cos(MiddleY) * Math.sin(MiddleX);
                CM = Math.sin(MiddleY);
                AL = Math.cos(LowY) * Math.cos(LowX);
                BL = Math.cos(LowY) * Math.sin(LowX);
                CL = Math.sin(LowY);
                AH = Math.cos(HighY) * Math.cos(HighX);
                BH = Math.cos(HighY) * Math.sin(HighX);
                CH = Math.sin(HighY);
                CoefficientL = (AM * AM + BM * BM + CM * CM)/ (AM * AL + BM * BL + CM * CL);
                CoefficientH = (AM * AM + BM * BM + CM * CM)/ (AM * AH + BM * BH + CM * CH);
                ALtangent = CoefficientL * AL - AM;
                BLtangent = CoefficientL * BL - BM;
                CLtangent = CoefficientL * CL - CM;
                AHtangent = CoefficientH * AH - AM;
                BHtangent = CoefficientH * BH - BM;
                CHtangent = CoefficientH * CH - CM;
                AngleCos = (AHtangent * ALtangent + BHtangent * BLtangent + CHtangent* CLtangent)/ (Math.sqrt(AHtangent * AHtangent + BHtangent* BHtangent + CHtangent * CHtangent) * Math.sqrt(ALtangent * ALtangent + BLtangent* BLtangent + CLtangent * CLtangent));
                AngleCos = Math.acos(AngleCos);
                ANormalLine = BHtangent * CLtangent - CHtangent * BLtangent;
                BNormalLine = 0 - (AHtangent * CLtangent - CHtangent* ALtangent);
                CNormalLine = AHtangent * BLtangent - BHtangent * ALtangent;
                if (AM != 0)
                    OrientationValue = ANormalLine / AM;
                else if (BM != 0)
                    OrientationValue = BNormalLine / BM;
                else
                    OrientationValue = CNormalLine / CM;
                if (OrientationValue > 0) {
                    Sum1 += AngleCos;
                    Count1++;
                } else {
                    Sum2 += AngleCos;
                    Count2++;
                }
            }

            var tempSum1, tempSum2;
            tempSum1 = Sum1 + (2 * Math.PI * Count2 - Sum2);
            tempSum2 = (2 * Math.PI * Count1 - Sum1) + Sum2;
            if (Sum1 > Sum2) {
                if ((tempSum1 - (Count - 2) * Math.PI) < 1)
                    Sum = tempSum1;
                else
                    Sum = tempSum2;
            } else {
                if ((tempSum2 - (Count - 2) * Math.PI) < 1)
                    Sum = tempSum2;
                else
                    Sum = tempSum1;
            }
            totalArea = (Sum - (Count - 2) * Math.PI) * Radius * Radius;

            return totalArea; // 返回总面积
}

调用计算面积的方法

      //1秒后弹出面积值,单位:米
       setTimeout(function(){

        alert(getArea(polygon));

       },1000);

如图所示
这里写图片描述

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
在高德地图多边形是一种常见的覆盖物类型。您可以使用JavaScript API提供的`AMap.Polygon`类来添加、获取和删除多边形。下面是一些示例代码,演示如何使用`AMap.Polygon`类来操作多边形覆盖物。 ### 添加多边形覆盖物 要在地图上添加多边形覆盖物,您可以使用以下代码: ```javascript var map = new AMap.Map('container', { zoom: 13, center: [116.39, 39.9] }); var path = [[116.403322, 39.920255], [116.410703, 39.897555], [116.402292, 39.892353], [116.389846, 39.891365]]; var polygon = new AMap.Polygon({ map: map, path: path, strokeColor: '#FF33FF', strokeWeight: 6, fillColor: '#1791fc', fillOpacity: 0.4 }); ``` 在上面的代码,我们创建了一个地图对象,然后定义了多边形的路径(path)和样式(strokeColor、strokeWeight、fillColor、fillOpacity),最后使用`new AMap.Polygon()`方法创建多边形覆盖物,并将其添加到地图上。 ### 获取多边形覆盖物 要获取多边形覆盖物的属性(如路径、样式等),您可以使用以下代码: ```javascript var path = polygon.getPath(); // 获取多边形的路径 var strokeColor = polygon.getOptions().strokeColor; // 获取多边形的边框颜色 var fillColor = polygon.getOptions().fillColor; // 获取多边形的填充颜色 ``` 在上面的代码,我们使用`getPath()`方法获取多边形的路径,使用`getOptions()`方法获取多边形的选项,并从选项获取边框颜色和填充颜色。 ### 删除多边形覆盖物 要删除多边形覆盖物,您可以使用以下代码: ```javascript polygon.setMap(null); // 将多边形从地图上删除 ``` 在上面的代码,我们使用`setMap(null)`方法将多边形从地图上删除。 总结一下,您可以使用`AMap.Polygon`类来添加、获取和删除多边形覆盖物。您可以根据您的需求,修改多边形的属性和样式,实现更多地图功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值