记录一个经纬度工具类
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;
}
}