计算任意多边形的面积

作者: YuGoal | 来源:发表于2018-02-11 14:38 被阅读511次

    需求

    线段:算出地图上线段的实际长度
    面积:算出地图上不规则多边形的实际面积

    解决方案

    1.线段的实际长度

    直接使用高德的AMapUtils.calculateLineDistance(latLng,latLng)方法计算。

    2.任意多边形面积的计算

    思路:http://blog.csdn.net/xxdddail/article/details/48973269

    具体代码:

     /**
         * 计算任意多边形的面积
         * @param latLngLines 经纬度坐标点
         * @return
         */
        public float calculateArea(List<LatLng> latLngLines) {
            List<double[]> pointFList = new ArrayList<>();
            for (int i = 0; i < latLngLines.size(); i++) {
                LatLng latLng = latLngLines.get(i);
                //经纬度转换成平面直角坐标系
                pointFList.add(AMapUtil.WGS2flat(latLng.longitude, latLng.latitude));
            }
    
            int iCycle, iCount;
            iCycle = 0;
            double iArea = 0;
            iCount = pointFList.size();
    
            for (iCycle = 0; iCycle < iCount; iCycle++) {
                iArea = iArea + (pointFList.get(iCycle)[0] * pointFList.get((iCycle + 1) % iCount)[1] - pointFList.get((iCycle + 1) % iCount)[0] * pointFList.get(iCycle)[1]);
            }
    
            return (float) Math.abs(0.5 * iArea);
        }
    

    经纬度转平面直角坐标系

     // 地球长半轴
        public static final double EARTH_RADIUS = 6378.137;
    /**
         * 经纬度转换成以米为单位的平面直角坐标
         *
         * @param lon 经度
         * @param lat 纬度
         * @return 平面直角坐标double型数组,以米为单位
         */
        public static double[] WGS2flat(double lon, double lat) {
            double L = CalcRad(lon);
            double l = L - CalcRad(120);
            double B = CalcRad(lat);
            double cosb = Math.cos(B);
            double sinb = Math.sin(B);
    
            double a = EARTH_RADIUS * 1000;
            // 地球短半轴
            double b = 6356752.3142451793;
            double t = Math.tan(B);
            // double r = 3600 * 180 / Math.PI;
            double e2 = (Math.pow(a, 2) - Math.pow(b, 2)) / Math.pow(a, 2);
            double e12 = (Math.pow(a, 2) - Math.pow(b, 2)) / Math.pow(b, 2);
            double n2 = e12 * Math.pow(cosb, 2);
            double N = a / Math.sqrt(1 - e2 * Math.pow(sinb, 2));
    
            double x = 6367449.1458 * B - 32009.8185 * cosb * sinb - 133.9975
                    * cosb * Math.pow(sinb, 3) - 0.6975 * cosb * Math.pow(sinb, 5);
            double X = x + N / 2 * t * Math.pow(cosb, 2) * Math.pow(l, 2) + N / 24
                    * t * Math.pow(cosb, 4)
                    * (5 - Math.pow(t, 2) + 9 * n2 + 4 * Math.pow(n2, 2))
                    * Math.pow(l, 4);
            double Y = N * cosb * l + N / 6 * Math.pow(cosb, 3)
                    * (1 - Math.pow(t, 2) + n2) * Math.pow(l, 3);
    
            double[] coord = {X, Y};
            return coord;
        }
    
        /**
         * 计算弧度
         *
         * @param d 以度为单位的经纬度数值
         * @return 以弧度为单位的经纬度数值
         */
        public static double CalcRad(double d) {
            return d * Math.PI / 180.0;
        }
    

    相关文章

      网友评论

        本文标题:计算任意多边形的面积

        本文链接:https://www.haomeiwen.com/subject/yrwktftx.html