All Downloads are FREE. Search and download functionalities are using the official Maven repository.

spring.turbo.util.DistanceUtils Maven / Gradle / Ivy

package spring.turbo.util;

import org.springframework.lang.Nullable;

import java.math.BigDecimal;
import java.math.RoundingMode;

import static java.lang.Math.*;

/**
 * 基于经纬度的距离计算工具
 *
 * @author 应卓
 * @since 3.2.4
 */
public final class DistanceUtils {

    /**
     * 私有构造方法
     */
    private DistanceUtils() {
    }

    /**
     * 计算两个点之间的距离
     *
     * @param lat1 第一点纬度
     * @param lon1 第一点经度
     * @param lat2 第二点纬度
     * @param lon2 第二点经度
     * @param unit 距离单位
     * @return 距离
     * @see DistanceUnit
     */
    public static double distance(double lat1, double lon1, double lat2, double lon2, DistanceUnit unit) {
        return distance(lat1, lon1, lat2, lon2, unit, Integer.MIN_VALUE, null);
    }

    /**
     * 计算两个点之间的距离
     *
     * @param lat1         第一点纬度
     * @param lon1         第一点经度
     * @param lat2         第二点纬度
     * @param lon2         第二点经度
     * @param unit         距离单位
     * @param scale        保留小数点后位数
     * @param roundingMode roundingMode
     * @return 距离
     * @see DistanceUnit
     */
    public static double distance(double lat1, double lon1, double lat2, double lon2, DistanceUnit unit, int scale,
                                  @Nullable RoundingMode roundingMode) {

        double theta = lon1 - lon2;
        double dist = sin(deg2rad(lat1)) * sin(deg2rad(lat2))
                + cos(deg2rad(lat1)) * cos(deg2rad(lat2)) * cos(deg2rad(theta));
        dist = acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60 * 1.1515;

        dist = switch (unit) {
            case MILES -> dist;
            case KILOMETERS -> dist * 1.609344;
            case NAUTICAL_MILES -> dist * 0.8684;
        };

        if (roundingMode == null) {
            return dist;
        } else {
            return BigDecimal.valueOf(dist).setScale(scale, roundingMode).doubleValue();
        }
    }

    private static double deg2rad(double deg) {
        return (deg * PI / 180.0);
    }

    private static double rad2deg(double rad) {
        return (rad * 180.0 / PI);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy