天天看點

Java經緯度計算兩點的直線距離

複制即用

/**
 * @author: 雲
 * @date: 2020/5/28 16:25
 * @version: 1.0
 */

public class AddressUtils {
    private static final double EARTH_RADIUS = 6371393; // 平均半徑,機關:m;不是赤道半徑。赤道為6378左右

    /**
     * @描述 反餘弦進行計算
     * @參數  [lat1, lng1, lat2, lng2]
     * @傳回值  double
     * @建立人  Young
     * @建立時間  2019/3/13 20:31
     **/
    public static double getDistance(Double lat1,Double lng1,Double lat2,Double lng2) {
        // 經緯度(角度)轉弧度。弧度用作參數,以調用Math.cos和Math.sin
        double radiansAX = Math.toRadians(lng1); // A經弧度
        double radiansAY = Math.toRadians(lat1); // A緯弧度
        double radiansBX = Math.toRadians(lng2); // B經弧度
        double radiansBY = Math.toRadians(lat2); // B緯弧度

        // 公式中“cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2”的部分,得到∠AOB的cos值
        double cos = Math.cos(radiansAY) * Math.cos(radiansBY) * Math.cos(radiansAX - radiansBX)
                + Math.sin(radiansAY) * Math.sin(radiansBY);
//        System.out.println("cos = " + cos); // 值域[-1,1]
        double acos = Math.acos(cos); // 反餘弦值
//        System.out.println("acos = " + acos); // 值域[0,π]
//        System.out.println("∠AOB = " + Math.toDegrees(acos)); // 球心角 值域[0,180]
        return Double.valueOf(String.format("%.2f",EARTH_RADIUS * acos/1000 )); // 最終結果
    }

}

           

調用

return AddressUtils.getDistance(36.78154,119.217809,
                36.751915, 119.204033);