計算任意多邊形的面積(Android)

yugoal發表於2018-10-15

需求

線段:算出地圖上線段的實際長度 面積:算出地圖上不規則多邊形的實際面積

解決方案

1.線段的實際長度 直接使用高德的AMapUtils.calculateLineDistance(latLng,latLng)方法計算。

2.任意多邊形面積的計算 思路:blog.csdn.net/xxdddail/ar…

具體程式碼:

 /**
     * 計算任意多邊形的面積
     * @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;
    }
複製程式碼

相關文章