已知兩點經緯度計算球面距離的公式,一搜一大堆,形式如下:

可是至於這個公式為什么是這樣的,今天推導了一下,詳細推導過程如下。首先畫個圖(圖1),要不然空間想象能力差的話容易犯糊塗。首先對圖1做個大致的說明,紅色的半圓表示赤道,藍色的圓弧表示本初子午線(也就是經度為0的子午線)。球最上方是北極點,點A和點B分別為要計算的兩個點,坐標分別為A(jA,wA)和B(jB,wB)。

圖1 示意圖
再開始推導之前,我們需要在圖中繪制一些輔助線,便於后面的描述和推導。如圖1所示,A(jA,wA),B(jB,wB)兩點分別為球面上的兩點,坐標為經緯度表示。延A、B兩點分別做垂直於赤道平面的垂線交赤道面為C、D兩點。連接C、D兩點,然后過A做CD的平行線交BD與點E。至此,所有的輔助線繪制完畢。假設地球為一個規則的圓球,半徑為R(其實地球是一個橢球體,赤道的半徑比極地的半徑稍微大一點點)。
第一步:確定已知條件,

第二步:在直角
和直角
中有:
第三步:在平面ABCD中,有:
第四步:在直角
中,使用勾股定理可以得到AB的直線長度。如下:
第五步:這里需要引入一個公式(5),就是大名鼎鼎的余弦定理,假設三角形的三個角為A,B,C,則有:
把上面的公式(1)、(2)、(3)、(5)帶入(4)中,然后整理可以得到:

最后,通過整理得到AB之間的直線距離為:

第六步:我們已經知道AB的直線距離,那么AB的弧長距離可以先通過計算
中對應的圓心角
,然后用弧長公式計算出來。這里在
依舊使用余弦定理公式(5),經過變形可以得到:

把式(6)帶入式(7),化簡得到:
最終,我們得到了一個關於圓心角
的余弦值的公式:
第七步:知道圓心角
,計算弧長的公式很簡單,使用半徑乘以圓心角(弧度單位)即可:

所以最后我們就得到了球面上AB的距離應該是:
最后使用公式(10)就可以編寫代碼來計算球面上任意兩點間的最短距離了。這里使用的是一個規則的球來代替的橢球的,肯定會有誤差的,一般都用這個公式來進行計算。代碼就不寫了,也就一兩句話就出來了。最后需要注意的就是,需要把經緯度都化成弧度單位。
…………………………………………………華麗的分割線………………………………………………
……………………………………以下內容更新於2013年1月30日…………………………………………
昨天使用立體幾何的知識推導了一下球面兩點的距離公式,發現比較復雜,今天想到一個簡單的方法,使用空間直角坐標系來推導,很方便。首先我們需要建立一個空間坐標系:在赤道平面內,X軸由球心O指向本初子午線,Y軸在赤道平面內垂直於X軸,Z軸垂直於赤道平面朝向北極。還是假設AB兩點的經緯度坐標為:A(jA,wA),B(jB,wB)。由該坐標系的定義以及經緯度的定義可以把上面的AB兩點的坐標轉換為該坐標系中的坐標如下:

由兩點距離公式可以得到AB的直線距離為:
對於球面上的任意一個點(X,Y,Z),都有:
把上面的公式整理就可以得到(下面用到了一個積化和差公式):
好了,大功告成,是不是比用立體幾何要簡單的多。接下來就是用上面的弦長和弧長的關系來計算AB的弧長就可以了。
