1. 程式人生 > >經緯度和高德地圖計算兩點距離面積

經緯度和高德地圖計算兩點距離面積

關於經緯度,可以看huanhuan的部落格根據兩點經緯度計算距離
文章詳細介紹了經緯度以及根據經緯度,計算兩點直接的距離。
高德地圖中,計算兩點直線距離的公式如下:

//根據經緯度獲取兩點距離
  public static int calculateDistance(double x1, double y1, double x2, double y2) {
        final double NF_pi = 0.01745329251994329; // 弧度 PI/180
        x1 *= NF_pi;
        y1 *= NF_pi;
        x2 *= NF_pi;
        y2 *= NF_pi;
        double
sinx1 = Math.sin(x1); double siny1 = Math.sin(y1); double cosx1 = Math.cos(x1); double cosy1 = Math.cos(y1); double sinx2 = Math.sin(x2); double siny2 = Math.sin(y2); double cosx2 = Math.cos(x2); double cosy2 = Math.cos(y2); double[] v1 = new
double[3]; v1[0] = cosy1 * cosx1 - cosy2 * cosx2; v1[1] = cosy1 * sinx1 - cosy2 * sinx2; v1[2] = siny1 - siny2; double dist = Math.sqrt(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2]); return (int) (Math.asin(dist / 2) * 12742001.5798544); }

獲取指定兩點間固定距離的點

  //獲取指定兩點之間固定距離點
public static LatLng getPointForDis(LatLng sPt, LatLng ePt, double dis) { double lSegLength = calculateDistance(sPt, ePt); double preResult = dis / lSegLength; return new LatLng((ePt.latitude - sPt.latitude) * preResult + sPt.latitude, (ePt.longitude - sPt.longitude) * preResult + sPt.longitude); }

計算兩點之間的矩形面積

 public static float calculateArea(LatLng leftTop, LatLng rightBottom) {
        try {
            double var2 = Math.sin(leftTop.latitude * 3.141592653589793D / 180.0D) - Math.sin(rightBottom.latitude * 3.141592653589793D / 180.0D);
            double var4 = (rightBottom.longitude - leftTop.longitude) / 360.0D;
            if (var4 < 0.0D) {
                ++var4;
            }

            return (float) (2.5560394669790553E14D * var2 * var4);
        } catch (Throwable t) {
            t.printStackTrace();
            return 0.0F;
        }
    }

計算多點圍成的面積

 public static float calculateArea(List<LatLng> points) {
        byte i3 = 3;
        if (points != null && points.size() >= i3) {
            double var2 = 0.0D;
            double var4 = 111319.49079327357D;
            int size = points.size();

            for(int i = 0; i < size; ++i) {
                LatLng var8 = points.get(i);
                LatLng var9 = points.get((i + 1) % size);
                double var10 = var8.longitude * var4 * Math.cos(var8.latitude * 0.017453292519943295D);
                double var12 = var8.latitude * var4;
                double var14 = var9.longitude * var4 * Math.cos(var9.latitude * 0.017453292519943295D);
                double var16 = var9.latitude * var4;
                var2 += var10 * var16 - var14 * var12;
            }

            return (float)Math.abs(var2 / 2.0D);
        } else {
            return 0.0F;
        }
    }