目錄
摘要
1.半正矢公式(Haversine Formula)介紹
2.半正矢公式應(yīng)用
3.半正矢公式計(jì)算
3.1 主要思路
3.2 計(jì)算步驟
3.2.1 平面向量計(jì)算方法
3.2.2 空間向量計(jì)算方法
摘要
寫本文的出發(fā)點(diǎn)是需要在Qlik中根據(jù)經(jīng)緯度計(jì)算地球上兩點(diǎn)間的距離。我在社區(qū)上搜到了相關(guān)公式的分享,這個(gè)公式叫做“半正矢公式”。對(duì)于“半正矢”知之甚少的我,決定從頭到尾將公式計(jì)算一遍,并通過這篇文章記錄所有的步驟,希望它能對(duì)需要的人有所幫助。這也算是溫習(xí)高中所學(xué)的三角函數(shù)了。
本文的部分圖片源自其他網(wǎng)站,剩下的圖都是通過GeoGebra制作的。這個(gè)工具非常方便,推薦大家使用。
(GeoGebra - the world’s favorite, free math tools used by over 100 million students and teachers)
1.半正矢公式(Haversine Formula)介紹
公式:?
(i)
如圖 (i), OAC是一個(gè)圓,O是其圓心,A和C是圓上的點(diǎn),r 是⊙OAC的半徑。
設(shè):r = 1, 那么 OA = OC = r =1;
過點(diǎn)A做一條垂線,交線段OC于點(diǎn)B,∠OBA=90°。
設(shè):∠AOB=θ;
因此,AB = sinθ, OB = cosθ, BC = 反正弦 = 1 – cosθ.
所謂的半正矢就是“一半的反正弦”(Haversine = “half reversed sin”),所以:
?
最后得出:
2.半正矢公式應(yīng)用
回到應(yīng)用場(chǎng)景,已知地球上的兩個(gè)點(diǎn)A和B,現(xiàn)在我們想知道這兩點(diǎn)之間的最短距離。地球可以近似看作為一個(gè)球體,那么AB間的最短距離就是過AB兩點(diǎn)的大圓圓弧,這個(gè)大圓是地球的內(nèi)切圓,半徑和圓心點(diǎn)都于地球相同。
(ii)
設(shè):A點(diǎn)坐標(biāo) = (?1, λ1); B點(diǎn)坐標(biāo) = (?2, λ2);
? = 緯度, λ = 經(jīng)度
d = A 和 B 的最短距離
R = 地球半徑 = 6371 km
把 ???替換為 Haversin(θ)? 可得:
?
過去的水手們可以查余弦函數(shù)、半正矢函數(shù)和半正矢函數(shù)的逆函數(shù)的數(shù)值表,從而求出距離d。只要有數(shù)值表,還是挺方便的。[1]
[1]https://plus.maths.org/content/lost-lovely-haversine
3.半正矢公式計(jì)算
3.1 主要思路
(iii)
如圖 (iii), ⊙OAB 是地球的內(nèi)切圓,圓心為O。
距離計(jì)算步驟:
- 計(jì)算AB,即點(diǎn)A和B之間的直線距離;
- 通過AB和地球半徑R,計(jì)算∠AOB 的角度;
- 通過∠AOB 和R計(jì)算 ,即⊙ OAB上AB的弧長(zhǎng),這個(gè)弧長(zhǎng)就是最短距離。
3.2 計(jì)算步驟
3.2.1 平面向量計(jì)算方法
?(iv)
與第2節(jié)相同,設(shè):
A點(diǎn)坐標(biāo) = (?1, λ1); B點(diǎn)坐標(biāo) = (?2, λ2);
? = 緯度,λ = 經(jīng)度;
d = AB間的最短距離;
R = 地球半徑 = 6371 km;
O = 地球球心;
N = 北極點(diǎn);
點(diǎn)C和E與點(diǎn)A在同一條經(jīng)度線上;
點(diǎn)D和F與點(diǎn)B在同一條經(jīng)度線上;
點(diǎn)D 與點(diǎn)A在同一條緯度線上;
點(diǎn)C 與點(diǎn)B在同一條緯度線上;
點(diǎn)E和F又是在赤道上,點(diǎn)A所在經(jīng)度線與點(diǎn)B所在經(jīng)度線相較于北極點(diǎn)。
可得:
C點(diǎn)坐標(biāo) = (?2, λ1); D點(diǎn)坐標(biāo) = (?1, λ2);
E點(diǎn)坐標(biāo) = (0, λ1); F點(diǎn)坐標(biāo) = (0, λ2);
引入 ?:
(v)
如圖(v),OXY是一個(gè)圓,設(shè)r 為⊙OXY的半徑,且r = 1;
OX = OY = r = 1, OZ是線段XY的垂線;
設(shè)∠XOY=θ,那么∠XOZ=∠YOZ=θ/2;
所以 XZ=? , 且 XY=2XZ= 。
回到圖 (iv), ∠AOC = ?2 – ?1;
因?yàn)?OA = OC =R,所以 AC =? ;
同理,BD = AC;EF = ;
點(diǎn)O’ 是點(diǎn)A和點(diǎn)D所在圓的圓心,O’A 長(zhǎng)度等于圓的半徑。
過點(diǎn)A做一條垂線,相交OE于G,∠AOG = ∠AOE = ?1;
所以 : ?;
由于 ∠GOO’ = ∠AGO = 90°,OG = O’A,所以 O’A = ;
∠AO’D = λ2 – λ1, 可得 AD = ;
同理, BC =? ;
知道AD和BC的長(zhǎng)度后,我們?cè)诘妊菪蜛DBC中就可以計(jì)算AB的長(zhǎng)度了。
?(vi)
在等腰梯形ADBC中,過點(diǎn)A做一條垂線相交BC于點(diǎn)E。
那么:
;
; ?
;
?;
現(xiàn)在,AB線段的長(zhǎng)度已經(jīng)計(jì)算出來,接下來就是最后一步計(jì)算 的弧長(zhǎng)。
(vii)
?
如圖(vii),⊙OAB 是地球的內(nèi)接圓,圓心為O,OA = R.
設(shè):AC = √a, ∠AOB = b, ∠OCA = 90°;
那么 AC = AB/2;
?;
?;
?;?
? ?;
?
???????
? ?;
?
把 ???替換為 Haversin(θ)? : ?
與第二節(jié)的公式一致,計(jì)算完畢。
或者我們可以用正切函數(shù)tan:
? ???????
???????
???????
???????
這與Qlik 社區(qū)分享的計(jì)算公式一致[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 空間向量計(jì)算方法
如通過空間向量計(jì)算距離,我們需要把經(jīng)緯度的坐標(biāo)轉(zhuǎn)換為三維空間坐標(biāo)。
如圖 (viii),我們建立了一個(gè)坐標(biāo)系,Z軸就是地軸所在的軸,平面XOY是赤道所在的平面,平面XOZ是本初子午線所在的平面。A點(diǎn)是地球上任意一點(diǎn)。
設(shè):A點(diǎn)坐標(biāo) = (?1, λ1),R是地球半徑;
A 點(diǎn)的空間坐標(biāo) = (X1, Y1, Z1)
?(viii)
過A點(diǎn)做一條垂線相交平面XOY于A’點(diǎn),則:
?;
X1 = OC, Y1 = CA’, Z1 = A’A
因此, ;
同理,我們有一點(diǎn) B (?2, λ2),則? ;
那么:
???????
?設(shè) ,那么我們可通過余弦定理計(jì)算θ 的值:
? ???????
???????
?把cos(θ) 替換為 Haversin(θ),結(jié)果與上文等價(jià)。
參考文章
Haversine formula to find distance between two lat... - Qlik Community - 234630
Lost but lovely: The haversine | plus.maths.org
地理空間距離計(jì)算及優(yōu)化(根據(jù)兩個(gè)點(diǎn)經(jīng)緯度計(jì)算距離)_ArthurKingYs的博客-CSDN博客_兩個(gè)經(jīng)緯度算距離公式及方法
半正矢公式(Haversine公式)文章來源:http://www.zghlxwxcb.cn/news/detail-409196.html
如何計(jì)算地球上兩點(diǎn)的距離(附公式推導(dǎo))_呆呆papa的博客-CSDN博客_地球兩點(diǎn)距離文章來源地址http://www.zghlxwxcb.cn/news/detail-409196.html
到了這里,關(guān)于根據(jù)經(jīng)緯度計(jì)算地球上兩點(diǎn)之間的距離——Haversine公式介紹及計(jì)算步驟的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!