经纬度工具类

记录一个经纬度工具类

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;

/**
 * 经纬度工具类
 * 提供与经纬度相关的实用方法,如计算两点之间的距离和判断一个点是否在另一个点的半径范围内。
 */
@Slf4j
public class LongitudeLatitudeUtils {

    /**
     * 根据经纬度获取两点之间的距离
     * 使用Haversine公式计算两个经纬度点之间的球面距离。
     * 
     * @param longitude1 地点1的经度
     * @param latitude1 地点1的纬度
     * @param longitude2 地点2的经度
     * @param latitude2 地点2的纬度
     * @return 两点之间的距离,单位为米
     */
    public static double distance(BigDecimal longitude1, BigDecimal latitude1, BigDecimal longitude2, BigDecimal latitude2) {
        final int R = 6371; // 地球半径,单位为公里
        double lon1 = longitude1.doubleValue();
        double lat1 = latitude1.doubleValue();
        double lon2 = longitude2.doubleValue();
        double lat2 = latitude2.doubleValue();

        // 将经纬度差值转换为弧度
        double latDistance = Math.toRadians(lat2 - lat1);
        double lonDistance = Math.toRadians(lon2 - lon1);

        // 使用Haversine公式计算两点之间的距离
        double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
                + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
                * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        // 将距离转换为米并返回
        return R * c * 1000;
    }

    /**
     * 判断地点1是否在地点2的半径内
     * 通过计算两点之间的距离,判断地点1是否在地点2的指定半径范围内。
     * 
     * @param longitude1 地点1的经度
     * @param latitude1 地点1的纬度
     * @param longitude2 地点2的经度
     * @param latitude2 地点2的纬度
     * @param radius 半径,单位为米
     * @return 如果地点1在地点2的半径范围内,则返回true,否则返回false
     */
    public static boolean isWithinRange(BigDecimal longitude1, BigDecimal latitude1, BigDecimal longitude2, BigDecimal latitude2, double radius) {
        double distance = distance(longitude1, latitude1, longitude2, latitude2);
        return distance <= radius;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值