java根据经纬度计算距离

前言

最近有个需求是根据经纬度获取用户之间的距离,最初使用的是Redis中的GEO ,但是计算出来的距离和预期的偏差较大,所以寻求了另外的一种方式,通过geodesy来计算两个经纬度之间的距离,如果大家有谁使用了redis方式计算成功了欢迎评论给我,让我学习一下。

首先引入依赖
<dependency>
  <groupId>org.gavaghan</groupId>
  <artifactId>geodesy</artifactId>
  <version>1.1.3</version>
</dependency>
距离计算工具类
import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GeodeticCurve;
import org.gavaghan.geodesy.GlobalCoordinates;

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

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 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));

    }

}
测试

运行main方法

结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值