计算两个经纬度之间的直线距离
前言
今天使用美团外卖时,发现可以按照距离对商家进行排序,就想研究一下地图上的两个点之间的距离是如何计算出来的。
原理
假设地球上有A(ja,wa),B(jb,wb)两点,根据经纬度计算球面距离的公式为
R 地球半径
arccos 反余弦函数
cos 余弦函数
sin 正弦函数
ja,jb A和B的经度
wa,wb A和B的纬度
公式的具体推导过程可以参考美团的这篇文章
实现
public class TestGetDistance {
//地球半径
private final static double EARTH_RADIUS = 6367;
public static void main(String[] args) {
System.out.println(getDistanceBetween(39.941, 116.45, 39.94, 116.451));//140.02855253140535
System.out.println(getDistanceBetween(39.96, 116.45, 39.94, 116.40));//4804.42115294124
System.out.println(getDistanceBetween(39.96, 116.45, 39.94, 117.30));//72444.54071515072
System.out.println(getDistanceBetween(39.26, 115.25, 41.04, 117.30));//263508.55921885674
}
/**
* 计算两个经纬度之间的距离
*
* @param lat1 第一个点的维度
* @param lon1 第一个点的精度
* @param lat2 第二个点的维度
* @param lon2 第二个点的精度
*/
public static double getDistanceBetween(double lat1, double lon1, double lat2, double lon2) {
lat1 = rad(lat1);
lon1 = rad(lon1);
lat2 = rad(lat2);
lon2 = rad(lon2);
//两点间距离 km,如果想要米的话,结果*1000就可以了
double d = EARTH_RADIUS * Math.acos(
Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1) + Math.sin(lat1) * Math.sin(lat2));
return d * 1000;
}
private static double rad(double d) {
return d * Math.PI / 180.0;
}
}
参考
地理空间距离计算优化
如何获取经纬度之间两点间真实距离(适用于GoogleMap,BaiduMap,Amap等)
请问如何计算两个经纬度之间的距离?
百度地图Api 根据两个坐标点计算距离
经纬度查询两点距离