计算任意多边形的面积

需求

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

解决方案

1.线段的实际长度

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

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

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

具体代码:

 /**
     * 计算任意多边形的面积
     * @param latLngLines 经纬度坐标点
     * @return
     */
    public float calculateArea(List latLngLines) {
        List 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;
    }

你可能感兴趣的:(计算任意多边形的面积)