目录
摘要
写本文的出发点是需要在Qlik中根据经纬度计算地球上两点间的距离。我在社区上搜到了相关公式的分享,这个公式叫做“半正矢公式”。对于“半正矢”知之甚少的我,决定从头到尾将公式计算一遍,并通过这篇文章记录所有的步骤,希望它能对需要的人有所帮助。这也算是温习高中所学的三角函数了。
本文的部分图片源自其他网站,剩下的图都是通过GeoGebra制作的。这个工具非常方便,推荐大家使用。
(GeoGebra - the world’s favorite, free math tools used by over 100 million students and teachers)
1.半正矢公式(Haversine Formula)介绍
公式:
(i)
如图 (i), OAC是一个圆,O是其圆心,A和C是圆上的点,r 是⊙OAC的半径。
设:r = 1, 那么 OA = OC = r =1;
过点A做一条垂线,交线段OC于点B,∠OBA=90°。
设:∠AOB=θ;
因此,AB = sinθ, OB = cosθ, BC = 反正弦 = 1 – cosθ.
所谓的半正矢就是“一半的反正弦”(Haversine = “half reversed sin”),所以:
最后得出:
2.半正矢公式应用
回到应用场景,已知地球上的两个点A和B,现在我们想知道这两点之间的最短距离。地球可以近似看作为一个球体,那么AB间的最短距离就是过AB两点的大圆圆弧,这个大圆是地球的内切圆,半径和圆心点都于地球相同。
设:A点坐标 = (Ø1, λ1); B点坐标 = (Ø2, λ2);
Ø = 纬度, λ = 经度
d = A 和 B 的最短距离
R = 地球半径 = 6371 km
把 替换为 Haversin(θ) 可得:
过去的水手们可以查余弦函数、半正矢函数和半正矢函数的逆函数的数值表,从而求出距离d。只要有数值表,还是挺方便的。[1]
[1]https://plus.maths.org/content/lost-lovely-haversine
3.半正矢公式计算
3.1 主要思路
(iii)
如图 (iii), ⊙OAB 是地球的内切圆,圆心为O。
距离计算步骤:
- 计算AB,即点A和B之间的直线距离;
- 通过AB和地球半径R,计算∠AOB 的角度;
- 通过∠AOB 和R计算 ,即⊙ OAB上AB的弧长,这个弧长就是最短距离。
3.2 计算步骤
3.2.1 平面向量计算方法
(iv)
与第2节相同,设:
A点坐标 = (Ø1, λ1); B点坐标 = (Ø2, λ2);
Ø = 纬度,λ = 经度;
d = AB间的最短距离;
R = 地球半径 = 6371 km;
O = 地球球心;
N = 北极点;
点C和E与点A在同一条经度线上;
点D和F与点B在同一条经度线上;
点D 与点A在同一条纬度线上;
点C 与点B在同一条纬度线上;
点E和F又是在赤道上,点A所在经度线与点B所在经度线相较于北极点。
可得:
C点坐标 = (Ø2, λ1); D点坐标 = (Ø1, λ2);
E点坐标 = (0, λ1); F点坐标 = (0, λ2);
引入 :
(v)
如图(v),OXY是一个圆,设r 为⊙OXY的半径,且r = 1;
OX = OY = r = 1, OZ是线段XY的垂线;
设∠XOY=θ,那么∠XOZ=∠YOZ=θ/2;
所以 XZ= , 且 XY=2XZ= 。
回到图 (iv), ∠AOC = Ø2 – Ø1;
因为 OA = OC =R,所以 AC = ;
同理,BD = AC;EF = ;
点O’ 是点A和点D所在圆的圆心,O’A 长度等于圆的半径。
过点A做一条垂线,相交OE于G,∠AOG = ∠AOE = Ø1;
所以 : ;
由于 ∠GOO’ = ∠AGO = 90°,OG = O’A,所以 O’A = ;
∠AO’D = λ2 – λ1, 可得 AD = ;
同理, BC = ;
知道AD和BC的长度后,我们在等腰梯形ADBC中就可以计算AB的长度了。
(vi)
在等腰梯形ADBC中,过点A做一条垂线相交BC于点E。
那么:
;
;
;
;
现在,AB线段的长度已经计算出来,接下来就是最后一步计算 的弧长。
(vii)
如图(vii),⊙OAB 是地球的内接圆,圆心为O,OA = R.
设:AC = √a, ∠AOB = b, ∠OCA = 90°;
那么 AC = AB/2;
;
;
;
;
;
把 替换为 Haversin(θ) :
与第二节的公式一致,计算完毕。
或者我们可以用正切函数tan:
这与Qlik 社区分享的计算公式一致[2]。
[2] https://community.qlik.com/t5/QlikView-App-Dev/Haversine-formula-to-find-distance-between-two-lat-long-points/m-p/234630
3.2.2 空间向量计算方法
如通过空间向量计算距离,我们需要把经纬度的坐标转换为三维空间坐标。
如图 (viii),我们建立了一个坐标系,Z轴就是地轴所在的轴,平面XOY是赤道所在的平面,平面XOZ是本初子午线所在的平面。A点是地球上任意一点。
设:A点坐标 = (Ø1, λ1),R是地球半径;
A 点的空间坐标 = (X1, Y1, Z1)
(viii)
过A点做一条垂线相交平面XOY于A’点,则:
;
X1 = OC, Y1 = CA’, Z1 = A’A
因此, ;
同理,我们有一点 B (Ø2, λ2),则 ;
那么:
设 ,那么我们可通过余弦定理计算θ 的值:
把cos(θ) 替换为 Haversin(θ),结果与上文等价。
参考文章
Haversine formula to find distance between two lat... - Qlik Community - 234630
Lost but lovely: The haversine | plus.maths.org
地理空间距离计算及优化(根据两个点经纬度计算距离)_ArthurKingYs的博客-CSDN博客_两个经纬度算距离公式及方法