通过经纬度计算两点距离

准备工作
<dependency>
      <groupId>org.gavaghan</groupId>
      <artifactId>geodesy</artifactId>
      <version>1.1.3</version>
</dependency>
示例调用
public static Float getDistance(Float lon1, Float lat1, Float lon2, Float lat2) {
    // 创建第一个地理坐标点
    GlobalCoordinates source = new GlobalCoordinates(lat1, lon1);
    
    // 创建第二个地理坐标点
    GlobalCoordinates target = new GlobalCoordinates(lat2, lon2);
    
    // 创建一个地理计算器并计算地理曲线
    GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target);
    
    // 获取椭球面距离
    double distance = geoCurve.getEllipsoidalDistance();
    
    // 将距离转换为 BigDecimal 并保留两位小数
    BigDecimal distanceBig = new BigDecimal(distance).setScale(2, RoundingMode.UP);
    
    // 将距离从米转换为千米并再次保留两位小数
    distanceBig = distanceBig.multiply(new BigDecimal("0.001")).setScale(2, RoundingMode.UP);
    
    // 将 BigDecimal 距离转换为 Float 类型并返回
    return Float.parseFloat(String.valueOf(distanceBig));
}

封装工具类
public class DistanceUtils {
    /**
     * 根据经纬度计算距离
     *
     * @param lon1 经度1
     * @param lat1 纬度1
     * @param lon2 经度2
     * @param lat2 纬度2
     * @return 距离 (km)
     */
    public static String getDistance(String lon1, String lat1, String lon2, String lat2) {
        GlobalCoordinates source = new GlobalCoordinates(Double.parseDouble(lat1), Double.parseDouble(lon1));
        GlobalCoordinates target = new GlobalCoordinates(Double.parseDouble(lat2), Double.parseDouble(lon2));
        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target);
        double distance = geoCurve.getEllipsoidalDistance();
        BigDecimal distanceBig = new BigDecimal(distance).setScale(2, RoundingMode.UP);
        distanceBig = distanceBig.multiply(new BigDecimal("0.001")).setScale(2, RoundingMode.UP);
        return distanceBig.toString().concat("km");
    }
    public static Double getDistance(Double lon1, Double lat1, Double lon2, Double lat2) {
        GlobalCoordinates source = new GlobalCoordinates(lat1, lon1);
        GlobalCoordinates target = new GlobalCoordinates(lat2, lon2);
        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target);
        double distance = geoCurve.getEllipsoidalDistance();
        BigDecimal distanceBig = new BigDecimal(distance).setScale(2, RoundingMode.UP);
        distanceBig = distanceBig.multiply(new BigDecimal("0.001")).setScale(2, RoundingMode.UP);
        return Double.parseDouble(String.valueOf(distanceBig));
    }
    public static Float getDistance(Float lon1, Float lat1, Float lon2, Float lat2) {
        GlobalCoordinates source = new GlobalCoordinates(lat1, lon1);
        GlobalCoordinates target = new GlobalCoordinates(lat2, lon2);
        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target);
        double distance = geoCurve.getEllipsoidalDistance();
        BigDecimal distanceBig = new BigDecimal(distance).setScale(2, RoundingMode.UP);
        distanceBig = distanceBig.multiply(new BigDecimal("0.001")).setScale(2, RoundingMode.UP);
        return Float.parseFloat(String.valueOf(distanceBig));
    }

//    public static void main(String[] args) {
//        String lon1 = "119.6438888888889";
//        String lat1 = "37.966944444444444";
//        String lon2 = "119.63916666666667";
//        String lat2 = "37.9675";
//        System.out.println(getDistance(lon1, lat1, lon2, lat2));
//    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值