package com.younike.common.utils.geodesy;

import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GeodeticCurve;
import org.gavaghan.geodesy.GlobalCoordinates;


/**
 * Geodesy 工具类
 * 2021-8-6 Another
 */
public class GeodesyUtils {

    /**
     * 计算 两个经纬度之间的距离
     * @param startLongitude 出发地经度
     * @param startLatitude 出发地纬度
     * @param endLongitude 目的地经度
     * @param endLatitude 目的地纬度
     * @param ellipsoid 坐标系（例：WGS84、Sphere）
     * @return 米
     */
    public static double getDistanceMeter(double startLongitude, double startLatitude, double endLongitude, double endLatitude, Ellipsoid ellipsoid) {
        GlobalCoordinates source =new GlobalCoordinates(startLatitude, startLongitude);
        GlobalCoordinates target =new GlobalCoordinates(endLatitude, endLongitude);

        // 创建GeodeticCalculator，调用计算方法，传入坐标系、经纬度用于计算距离
        GeodeticCurve geoCurve =new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, source, target);

        return geoCurve.getEllipsoidalDistance();
    }

    /**
     * 计算 两个经纬度之间的距离
     * @param startLongitude 出发地经度
     * @param startLatitude 出发地纬度
     * @param endLongitude 目的地经度
     * @param endLatitude 目的地纬度
     * @param ellipsoid 坐标系（例：WGS84、Sphere）
     * @return 米
     */
    public static String getDistance(double startLongitude, double startLatitude, double endLongitude, double endLatitude, Ellipsoid ellipsoid) {
        GlobalCoordinates source =new GlobalCoordinates(startLatitude, startLongitude);
        GlobalCoordinates target =new GlobalCoordinates(endLatitude, endLongitude);

        // 创建GeodeticCalculator，调用计算方法，传入坐标系、经纬度用于计算距离
        GeodeticCurve geoCurve =new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, source, target);
        double ellipsoidalDistance = geoCurve.getEllipsoidalDistance();

        return conversionDistance(ellipsoidalDistance);
    }

    /**
     * 根据 传入的米数 转化（1000米下显示米，1000米上显示千米）
     * @param ellipsoidalDistance
     * @return
     */
    public static String conversionDistance(double ellipsoidalDistance) {
        String distance = "";
        // 四舍五入取整
        long round = Math.round(ellipsoidalDistance);
        if (round <= 1000) {
            distance = round + "m";
        } else {
            // 米转化成千米
            double kilometer = Math.round(round/100d)/10d;
            distance = kilometer + "km";
        }

        return distance;
    }

}
