前言
最近有个需求是根据经纬度获取用户之间的距离,最初使用的是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