Talk is cheap, show me the code.
import lombok.extern.slf4j.Slf4j;
/**
* 根据经纬度,计算2点之间的直线距离。
* 距离较近的场景,可以使用,误差较小。
* 距离较远的场景,要考虑具体的业务场景。
* 因为这个只是计算直线距离,和实际的路线不同,所以要结合场景,看是否适用
*/
@Slf4j
public class CalCulateDistanceUtils {
/**
* 地球半径(这里取的是平均半径)
*/
private static final double EARTH_RADIUS = 6.371229 * 1e6;
/**
* @param lng1 地点A的经度
* @param lat1 地点A的纬度
* @param lng2 地点B的经度
* @param lat2 地点B的纬度
* @return 返参 double 单位千米(km)
*/
public static double calculateDistance(double lng1, double lat1, double lng2, double lat2) {
double x = (lng2 - lng1) * Math.PI * EARTH_RADIUS * Math.cos(((lat1 + lat2) / 2) * Math.PI / 180) / 180;
double y = (lat1 - lat2) * Math.PI * EARTH_RADIUS / 180;
// 默认是米,除以1000,返回千米
return Math.hypot(x, y) / 1000;
}
public static void main(String[] args) {
// 信阳的经度
Double lng1 = 114.097708;
// 信阳的纬度
Double lat1 = 32.167521;
// 佳木斯的经度
Double lng2 = 130.324123;
// 佳木斯的纬度
Double lat2 = 46.812022;
// 运行后,控制台打印:佳木斯到信阳的距离:2142.6376176855483千米
log.info("佳木斯到信阳的距离:{}千米", calculateDistance(lng1, lat1, lng2, lat2));
}
}