目录

摘要

1.半正矢公式(Haversine Formula)介绍

2.半正矢公式应用

3.半正矢公式计算

3.1 主要思路

3.2 计算步骤

3.2.1 平面向量计算方法

3.2.2 空间向量计算方法


摘要

写本文的出发点是需要在Qlik中根据经纬度计算地球上两点间的距离。我在社区上搜到了相关公式的分享,这个公式叫做“半正矢公式”。对于“半正矢”知之甚少的我,决定从头到尾将公式计算一遍,并通过这篇文章记录所有的步骤,希望它能对需要的人有所帮助。这也算是温习高中所学的三角函数了。

本文的部分图片源自其他网站,剩下的图都是通过GeoGebra制作的。这个工具非常方便,推荐大家使用。

(GeoGebra - the world’s favorite, free math tools used by over 100 million students and teachers)

1.半正矢公式(Haversine Formula)介绍

公式: Haversin(\theta )=sin^2{\left (\theta/2 \right ) }

(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”),所以:

 

最后得出: Haversin(\theta )=sin^2{\left (\theta/2 \right ) }

2.半正矢公式应用

回到应用场景,已知地球上的两个点A和B,现在我们想知道这两点之间的最短距离。地球可以近似看作为一个球体,那么AB间的最短距离就是过AB两点的大圆圆弧,这个大圆是地球的内切圆,半径和圆心点都于地球相同。

(ii)

设:A点坐标 = (Ø1, λ1); B点坐标 = (Ø2, λ2);

Ø = 纬度, λ = 经度

d = A 和 B 的最短距离

R = 地球半径 = 6371 km

sin^{2}\left ( \frac{\theta }{2} \right ) ​​​替换为 Haversin(θ)  可得:

 

过去的水手们可以查余弦函数、半正矢函数和半正矢函数的逆函数的数值表,从而求出距离d。只要有数值表,还是挺方便的。[1]


[1]https://plus.maths.org/content/lost-lovely-haversine

3.半正矢公式计算

3.1 主要思路

(iii)

如图 (iii), ⊙OAB 是地球的内切圆,圆心为O。

距离计算步骤:

  1. 计算AB,即点A和B之间的直线距离;
  2. 通过AB和地球半径R,计算∠AOB 的角度;
  3. 通过∠AOB 和R计算 \widehat{AB} ,即⊙ 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);

引入 sin(\frac{\theta }{2}) :

(v)

如图(v),OXY是一个圆,设r 为⊙OXY的半径,且r = 1;

OX = OY = r = 1, OZ是线段XY的垂线;

设∠XOY=θ,那么∠XOZ=∠YOZ=θ/2;

所以 XZ=sin(\frac{\theta }{2})  , 且 XY=2XZ=2sin(\frac{\theta }{2})

回到图 (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线段的长度已经计算出来,接下来就是最后一步计算 \widehat{AB}的弧长。

(vii)

 

如图(vii),⊙OAB 是地球的内接圆,圆心为O,OA = R.

设:AC = √a, ∠AOB = b, ∠OCA = 90°;

那么 AC = AB/2;

 ;

 ;

 ; 

   ;

 

​​​​​​​

   ;

 

sin^{2}\left ( \frac{\theta }{2} \right ) ​​​替换为 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博客_两个经纬度算距离公式及方法

半正矢公式(Haversine公式)

如何计算地球上两点的距离(附公式推导)_呆呆papa的博客-CSDN博客_地球两点距离

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐