今天使用美团外卖时,发现可以按照距离对商家进行排序,就想研究一下地图上的两个点之间的距离是如何计算出来的。

假设地球上有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 根据两个坐标点计算距离
经纬度查询两点距离