package com.hfkj.common.utils;

/**
 * @Auther: 胡锐
 * @Description:
 * @Date: 2021/4/1 20:32
 */
public class CoordCommonUtil {


    private static final double EARTH_RADIUS = 6371000; // 平均半径,单位：m；不是赤道半径。赤道为6378左右

    /**
     * 获得球面（地球）上两个点之间的距离（坐标可以为WGS84、GCJ02等任何一种坐标，但两个点的坐标类型必须相同）
     *
     * @param lon1 起点的经度
     * @param lat1 起点的纬度
     * @param lon2 终点的经度
     * @param lat2 终点的纬度
     * @return 两点之间的距离，单位是米
     */
    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 EARTH_RADIUS * acos; // 最终结果附上原文出处链接及本声明。
    }
}
