package com.easyproject.common.utils;

import java.math.BigDecimal;
import java.awt.geom.Point2D;

/**
* @Description: 根据经纬度计算两点间的距离
* @Param: 
* @return: 
* @Author: java-002
* @Date: 2025/7/18 0018
*/
public class DistanceUtils {
    /**
     * 地球半径,单位 km
     */
    private static final double EARTH_RADIUS = 6378.137;

    /**
     * 根据经纬度，计算两点间的距离
     *
     * @param longitude1 第一个点的经度
     * @param latitude1  第一个点的纬度
     * @param longitude2 第二个点的经度
     * @param latitude2  第二个点的纬度
     * @return 返回距离 单位千米
     */
    public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {
        // 纬度
        double lat1 = Math.toRadians(latitude1);
        double lat2 = Math.toRadians(latitude2);
        // 经度
        double lng1 = Math.toRadians(longitude1);
        double lng2 = Math.toRadians(longitude2);
        // 纬度之差
        double a = lat1 - lat2;
        // 经度之差
        double b = lng1 - lng2;
        // 计算两点距离的公式
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));
        // 弧长乘地球半径, 返回单位: 千米
        s =  s * EARTH_RADIUS;

        BigDecimal two = new BigDecimal(s);
        double twoEnd = two.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();

        return twoEnd;
    }

    /**
    * 方法说明: 根据经纬度，计算两点间的距离-JDK8自带方法 同mysql计算经纬度结果一直
    * 传入参数: longitude1 第一个点的经度
    * 传入参数: latitude1  第一个点的纬度
    * 传入参数: longitude2 第二个点的经度
    * 传入参数: latitude2  第二个点的纬度
    * 返回的值: 返回距离 单位米
    * 作者: java-002
    * 日期: 2025/8/31 0031
    */
    public static double getDistanceJDK8(double longitude1, double latitude1, double longitude2, double latitude2){
        Point2D point1 = new Point2D.Double(longitude1, latitude1);
        Point2D point2 = new Point2D.Double(longitude2, latitude2);
        double distance = point2.distance(point1) * 111195; // 距离单位为米
        return distance;
    }

    public static void main(String[] args) {
        double d = getDistance(104.096612,30.599719, 104.104728,30.605986); //1044.705809155753
        System.out.println("距离：" + d + " 千米");
        double d2 = getDistanceJDK8(104.9548868815,30.8281559245, 104.0560379028,30.5933609009); //1044.705809155753
        //请求腾讯位置信息，获得两点导航距离，fromLatLng：【30.8281559245,104.9548868815】，toLatLng：【30.5933609009,104.0560379028】，距离：【120075.0 米】，估算时间：【100.0 分钟】，途经红绿灯个数：【2 个】，预估打车费：【0.0 元】
        System.out.println("距离：" + d2 + " 米");
    }
}
