package co.yixiang.yshop.framework.common.util.distancecalculator;

/**
 * @author pepis
 * @apiNote
 **/
public class DistanceCalculatorUtil {
    public static void main(String[] args) {
        double lat1 = 37.7749; // 第一个点的纬度
        double lon1 = -122.4194; // 第一个点的经度

        double lat2 = 34.0522; // 第二个点的纬度
        double lon2 = -118.2437; // 第二个点的经度

        double distance = calculateDistance(lat1, lon1, lat2, lon2);
        System.out.println("Distance: " + distance + " m");
    }

    /**
     * 计算两地之间距离
     *
     * @param lat1 第一个点的纬度
     * @param lon1 第一个点的经度
     * @param lat2 第二个点的纬度
     * @param lon2 第二个点的经度
     * @return 距离单位 米
     */
    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        // 地球半径，单位：千米
        final double R = 6371.0;

        // 将经纬度转换为弧度
        double radLat1 = Math.toRadians(lat1);
        double radLon1 = Math.toRadians(lon1);
        double radLat2 = Math.toRadians(lat2);
        double radLon2 = Math.toRadians(lon2);

        // Haversine公式计算距离
        double dlon = radLon2 - radLon1;
        double dlat = radLat2 - radLat1;
        double a = Math.pow(Math.sin(dlat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(dlon / 2), 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        // 计算距离
        return Math.round(R * c * 1000);
    }
}
