GIS – 地理信息系统经纬度计算 ( 经度、纬度概念 | 地球周长计算 | 地球经线周长计算 | 经纬度相关计算 | 经纬度坐标距离计算公式 | 经纬度与实际距离换算 | 相关代码实现 )

文章目录

  • 一、经度、纬度概念
  • 二、地球周长计算
    • 1、地球半径、周长计算
    • 2、地球经线周长计算
    • 3、地球纬线周长计算
  • 三、经纬度相关计算
    • 1、经纬度坐标距离计算公式
    • 2、经纬度与实际距离换算
      • 1 米对应经度
      • 1 米对应纬度
    • 3、实际距离与经纬度换算
      • 1 度经度对应东西距离
      • 1 度纬度对应南北距离
  • 四、相关代码实现
    • 1、计算两个经纬度之间的距离
    • 2、距离与经纬度之间换算
    • 3、弧度与角度计算

一、经度、纬度概念


经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;

纬度 Latitude , 相当于 垂直 y 轴 的坐标 , 纬度的取值范围 -90 度 ~ + 90 度 ;

在这里插入图片描述

西经 和 南纬 是负数 ;

在这里插入图片描述

经度使用 W ( 东经 ) 和 E ( 西经 ) 表示 , 纬度 使用 N ( 北纬 ) 和 S ( 南纬 ) 表示 ,

北京 中心 坐标为 :

  • 北纬 39°54′20″ , 东经 116°25′29″
  • N 39°54′20″ , W 116°25′29″

二、地球周长计算


1、地球半径、周长计算

地球的半径为 :

6371000

=

6371

千米

6371000 米 = 6371 千米

6371000米=6371千米 ;

地球的周长为 :

2

π

×

6371000

=

40030173

2 pi imes 6371000 = 40030173 米

2π×6371000=40030173米

2、地球经线周长计算

经线 周长 计算 :

2

π

×

6371000

=

40030173

2 pi imes 6371000 = 40030173 米

2π×6371000=40030173米

经线 的 周长 , 就是 地球的 周长 ;

经线 是 南北走向的 , 任意一个经线 都要经过 南极 和 北极 ;

在这里插入图片描述

3、地球纬线周长计算

纬线 周长 计算 :

2

π

×

6371000

×

cos

?

α

2 pi imes 6371000 imes cosalpha 米

2π×6371000×cosα米

常用的 38 度 纬度 的地球周长为 :

2

π

×

6371000

×

cos

?

38

=

31544206

2 pi imes 6371000 imes cos 38 = 31544206 米

2π×6371000×cos38=31544206米

纬线 是 东西走向的 , 不同 纬度 的 纬线 长度是不同的 ,

  • 赤道附近的 纬线最长 , 等于地球周长 ;
  • 南北极位置的 纬线最短 , 为 0 ;

上述公式中

α

alpha

α 是纬度 度数 ;

纬度 的取值范围 -90 度 ~ + 90 度 , 函数曲线如下图所示 :

  • 在赤道位置 , 纬度为 0 度 ,

    cos

    ?

    0

    =

    1

    cos 0 = 1

    cos0=1 ;

  • 在 南极 / 北极 位置 , 纬度为 90 度 ,

    cos

    ?

    90

    =

    0

    cos 90 = 0

    cos90=0 ;

在这里插入图片描述

三、经纬度相关计算


1、经纬度坐标距离计算公式

经纬度坐标距离计算公式 :

S

=

2

arcsin

?

sin

?

2

a

2

+

cos

?

L

a

t

1

×

cos

?

L

a

t

2

×

sin

?

2

b

2

×

6378.137

S = 2 arcsin sqrt{ sin^2 frac{a}{2} + cos Lat1 imes cos Lat2 imes sin^2 frac{b}{2}} imes 6378.137

S=2arcsinsin22a?+cosLat1×cosLat2×sin22b?
?×6378.137

  • 两个坐标点分别为 :

    • (

      L

      a

      t

      1

      ,

      L

      n

      g

      1

      )

      ( Lat1 , Lng1 )

      (Lat1,Lng1) , Lat1 是 坐标点一 纬度 , Lng1 是 经度 ;

    • (

      L

      a

      t

      2

      ,

      L

      n

      g

      2

      )

      ( Lat2 , Lng2 )

      (Lat2,Lng2) , Lat2 是 坐标点一 纬度 , Lng2 是 经度 ;

  • a

    =

    L

    a

    t

    1

    ?

    L

    a

    t

    2

    a = Lat1 - Lat2

    a=Lat1?Lat2 , 是 两个坐标点的 纬度之差 ;

  • b

    =

    L

    n

    g

    1

    ?

    L

    n

    g

    2

    b = Lng1 - Lng2

    b=Lng1?Lng2 , 是 两个坐标点的 经度之差 ;

  • 地球半径为 6378.137 千米 ;

使用代码实现上述逻辑 :

public class LocationUtils {
    
    private static final double EARTH_RADIUS = 6371; // 地球平均半径,单位为公里
    
    public static double getDistance(double lat1, double lon1, double lat2, double lon2) {
        double radLat1 = Math.toRadians(lat1);
        double radLat2 = Math.toRadians(lat2);
        double a = radLat1 - radLat2;
        double b = Math.toRadians(lon1) - Math.toRadians(lon2);
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        s = Math.round(s * 1000) / 1000.0; // 保留三位小数
        return s;
    }
}

2、经纬度与实际距离换算

1 米对应经度

经度 ( 东西方向 ) 上 1 米 , 对应的度数是由当前的纬度决定的 ;

不同的 纬度 上 , 纬线 ( 东西方向 ) 的周长不一样 ;

赤道上 1 米对应的经度计算 :

赤道上 纬度为 0 度 , 东西方向的 纬线周长为 40030173 米 , 是最长的 ;

对应的计算过程如下 :

360

°

/

40030173

=

0.00000899

°

360° / 40030173 = 0.00000899°

360°/40030173=0.00000899°

38° 纬度 1 米对应的经度计算 :

38° 纬度 , 东西方向的 纬线周长为 31544206 米 ;

对应的计算过程如下 :

360

°

/

31544206

=

0.00001141

°

360° / 31544206 = 0.00001141°

360°/31544206=0.00001141°

1 米对应纬度

纬度 ( 南北方向 ) 上 1 米 , 对应的度数是固定的 ;

值为

360

°

/

40030173

=

0.00000899

°

360° / 40030173 = 0.00000899°

360°/40030173=0.00000899°

3、实际距离与经纬度换算

1 度经度对应东西距离

1 度经度对应东西距离 :

赤道位置的公式为 :

2

π

R

360

=

2

π

×

6731000

360

=

111194.926644558737

frac{2pi R}{360} = frac{2pi imes 6731000}{360} = 111194.926 644 558 737 米

3602πR?=3602π×6731000?=111194.926644558737米

  • R

    R

    R 为地球半径 ;

  • 地球周长为

    2

    π

    R

    2pi R

    2πR

  • 东西方向经度范围是 360 度 , 一度对应的距离就是周长处于 360 ;

非赤道位置的公式 :

2

π

R

360

×

cos

?

纬度

=

2

π

×

6731000

360

×

cos

?

纬度

frac{2pi R}{360} imes cos纬度 = frac{2pi imes 6731000}{360} imes cos纬度

3602πR?×cos纬度=3602π×6731000?×cos纬度

111194.926644558737

×

cos

?

纬度米

approx 111194.926 644 558 737 imes cos纬度 米

≈111194.926644558737×cos纬度米

38 度纬度位置 1 度经度对应的东西距离为 :

2

π

R

360

×

cos

?

38

°

=

2

π

×

6731000

360

×

cos

?

38

°

frac{2pi R}{360} imes cos 38° = frac{2pi imes 6731000}{360} imes cos 38°

3602πR?×cos38°=3602π×6731000?×cos38°

111194.926644558737

×

0.788010753607

approx 111194.926 644 558 737 imes 0.788010753607 米

≈111194.926644558737×0.788010753607米

87622.7979425

approx 87622.7979425 米

≈87622.7979425米

1 度纬度对应南北距离

1 度纬度对应南北距离 公式 :

2

π

R

360

×

cos

?

纬度

=

2

π

×

6731000

360

×

cos

?

纬度

frac{2pi R}{360} imes cos纬度 = frac{2pi imes 6731000}{360} imes cos纬度

3602πR?×cos纬度=3602π×6731000?×cos纬度

111194.926644558737

×

cos

?

纬度米

approx 111194.926 644 558 737 imes cos纬度 米

≈111194.926644558737×cos纬度米

四、相关代码实现


1、计算两个经纬度之间的距离

public class LocationUtils {
    
    private static final double EARTH_RADIUS = 6371; // 地球平均半径,单位为公里
    
    public static double getDistance(double lat1, double lon1, double lat2, double lon2) {
        double radLat1 = Math.toRadians(lat1);
        double radLat2 = Math.toRadians(lat2);
        double a = radLat1 - radLat2;
        double b = Math.toRadians(lon1) - Math.toRadians(lon2);
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
                Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        s = Math.round(s * 1000) / 1000.0; // 保留三位小数
        return s;
    }
}

2、距离与经纬度之间换算

public class LocationUtils {

    public static final double EARTH_RADIUS = 6371.393;

    public static Double km2Degree(Double km){
        return (180 / EARTH_RADIUS / Math.PI) * km;
    }

    public static Double degree2Km(Double degree){
        return EARTH_RADIUS / 180 * Math.PI * degree;
    }
}

3、弧度与角度计算

public class LocationUtils {

    /**
     * 将角度转换为弧度
     * @param degree
     * @return
     */
    public static double deg2rad(double degree) {
        return degree / 180 * Math.PI;
    }

    /**
     * 将弧度转换为角度
     * @param radian
     * @return
     */
    public static double rad2deg(double radian) {
        return radian * 180 / Math.PI;
    }
}

参考链接 :

  • https://blog.csdn.net/qq_25598453/article/details/90446387
  • https://codeleading.com/article/54392199618/
  • https://blog.csdn.net/weixin_44248637/article/details/128467003
  • https://blog.csdn.net/qq_42221334/article/details/81479800