根据经纬度计算两地之间的距离

根据经纬度计算两地之间的距离经纬度计算距离 haversine 公式

大家好,欢迎来到IT知识分享网。

地球赤道周长:40075.02千米 ,地球平均半径:6371.393千米,圆周率:3.9793(以上是百度的结果)

Haversine公式(半正矢公式)

原理分析

Python代码

import math R = 6371.393 Pi = math.pi jingduA, weiduA= 116., 39. jingduB, weiduB = 121., 31. a = (math.sin(math.radians(weiduA/2-weiduB/2)))2 b = math.cos(weiduA*Pi/180) * math.cos(weiduB*Pi/180) * (math.sin((jingduA/2-jingduB/2)*Pi/180))2 L = 2 * R * math.asin((a+b)0.5) # 因为地球平均半径用的是千米,所以最后结果的单位也是千米 print(L) 

SQL

最近涉及到用sql计算距离,来填补一下。以下代码Oracle和MySQL都能执行

-- 最后结果的单位是米  with tmp as( select 103.20887 lng1, 30. lat1, 104. lng2, 31. lat2, acos(-1) pi from dual ) select d.lng1, d.lat1, d.lng2, d.lat2 ,2**asin(sqrt(sin(d.deltaLat/2)*sin(d.deltaLat/2)+cos(d.lat1*pi/180)*cos(d.lat2*pi/180)*sin(d.deltaLng/2)*sin(d.deltaLng/2))) as dist_asin ,*acos(sin(d.lat1*pi/180)*sin(d.lat2*pi/180)+cos(d.lat1*pi/180)*cos(d.lat2*pi/180)*cos(d.deltaLng)) as dist_acos from ( select c.lng1,c.lat1, c.lng2, c.lat2, c.pi, (c.lat1*pi/180-c.lat2*pi/180) as deltaLat,(c.lng1*pi/180-c.lng2*pi/180) as deltaLng from tmp c ) d; 

向量法求两地距离

原理分析

以地心为原点,建立空间直角坐标系:

X轴为地心到(经度:0°、纬度:0°)的向量

Y轴为地心到(经度:90°、纬度:0°)的向量
Z轴为地心到(纬度:90°)的向量

经纬度与空间直角坐标系的对应关系 地球两地间距离的示意图
根据经纬度计算两地之间的距离 根据经纬度计算两地之间的距离

由此可以得到由经纬度到空间直角坐标系的对应关系:

x = cos ⁡ ( 纬度 ) cos ⁡ ( 经度 )  , y = cos ⁡ ( 纬度 ) sin ⁡ ( 经度 )  , z = sin ⁡ ( 纬度 ) x = \cos(纬度)\cos(经度) \ ,y = \cos(纬度) \sin(经度) \ ,z = \sin(纬度) x=cos(纬度)cos(经度) y=cos(纬度)sin(经度) z=sin(纬度)

假设地球为理想球体:半径大约3959英里(6371.393千米) 。这个数字是地心到地球表面所有各点距离的平均值,平均半径=(赤道半径×2+极半径)/3。

其中 θ \theta θ是圆心角度数(角度制),R是半径,L是圆心角弧长, α \alpha α是圆心角度数(弧度制)。 α = π θ / 180 \alpha = \pi \theta/180 α=πθ/180

Python代码

import math R = 6371.393 Pi = math.pi # A地 jingduA, weiduA= 116., 39. xA = math.cos(math.radians(weiduA))*math.cos(math.radians(jingduA)) yA = math.cos(math.radians(weiduA))*math.sin(math.radians(jingduA)) zA = math.sin(math.radians(weiduA)) # B地 jingduB, weiduB = 121., 31. xB = math.cos(weiduB*Pi/180) * math.cos(jingduB*Pi/180) yB = math.cos(weiduB*Pi/180) * math.sin(jingduB*Pi/180) zB = math.sin(weiduB*Pi/180) # 开始计算 cosalpha = (xA*xB+yA*yB+zA*zB)/((xA*xA+yA*yA+zA*zA)*(xB*xB+yB*yB+zB*zB))0.5 alpha = math.acos(cosalpha) L = alpha * R # 单位是千米 print(L) 

知识补充

  • 在经线上纬度差1度对应的实际距离是111.2018千米
  • 在赤道上经度差1度对应的实际距离是111.3195千米
  • 在除赤道外的其他纬线上,经度差1度对应的实际距离是111.3195*cos纬度

总结,对于日常的学习生活来说,相差一度取111km、圆周率用3.14就够了,不必太过较真。

球坐标系与直角坐标系的转换

在这里插入图片描述

x = r sin ⁡ θ cos ⁡ ϕ y = r sin ⁡ θ sin ⁡ ϕ z = r cos ⁡ θ ⟺ r = x 2 + y 2 + z 2 θ = arccos ⁡ ( z r ) = arcsin ⁡ ( x 2 + y 2 r ) = arctan ⁡ ( x 2 + y 2 z ) ϕ = arccos ⁡ ( x r sin ⁡ θ ) = arcsin ⁡ ( y r sin ⁡ θ ) = arctan ⁡ ( y x ) \begin{aligned} \begin{aligned} x & =r\sin\theta \cos\phi \\ y & =r\sin\theta \sin\phi \\ z & =r\cos\theta \end{aligned} \uad \Longleftrightarrow \uad \begin{aligned} r & =\sqrt{x^2+y^2+z^2} \\ \theta & =\arccos(\frac{z}{r})=\arcsin(\frac{\sqrt{x^2+y^2}}{r})=\arctan(\frac{\sqrt{x^2+y^2}}{z}) \\ \phi & =\arccos(\frac{x}{r\sin\theta})=\arcsin(\frac{y}{r\sin\theta})=\arctan(\frac{y}{x}) \end{aligned} \end{aligned} xyz=rsinθcosϕ=rsinθsinϕ=rcosθrθϕ=x2+y2+z2
=arccos(rz)=arcsin(rx2+y2
)=arctan(zx2+y2
)
=arccos(rsinθx)=arcsin(rsinθy)=arctan(xy)

径向距离 r ∈ [ 0 , + ∞ ] , 倾角 ( 天顶角 ) θ ∈ [ 0 , π ] , 方位角 ϕ ∈ [ 0 , 2 π ] 径向距离r \in [0,+\infty ],\ 倾角(天顶角)\theta \in [0,\pi ],\ 方位角\phi \in [0,2\pi] 径向距离r[0+] 倾角(天顶角)θ[0π] 方位角ϕ[02π]




免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/133597.html

(0)
上一篇 2025-07-21 18:20
下一篇 2025-07-21 18:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信