文章目录
- 一、经度、纬度概念
- 二、地球周长计算
-
- 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?
-
两个坐标点分别为 :
-
(
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