根據(jù)經(jīng)緯度對球面距離的求解

摘要

本片文章主要是推導(dǎo)球面距離公式的過程,需要您了解一些高中數(shù)學(xué)的三角函數(shù)的基本公式,簡單的向量運(yùn)算,如果你還記得的話,或者有興趣的話可以接著往下看;事情的起因是在項(xiàng)目的代碼中看到有一段根據(jù)手機(jī)定位的經(jīng)緯度數(shù)據(jù)計(jì)算兩個(gè)地理位置的距離。

export function calcDistance(point1, point2) {
  if (!point1 || !point2) return null;
  const EARTH_RADIUS = 6378.137;
  const { longitude: lng1, latitude: lat1 } = point1;
  const { longitude: lng2, latitude: lat2 } = point2;
  const radLat1 = (lat1 * Math.PI) / 180.0;
  const radLat2 = (lat2 * Math.PI) / 180.0;
  const radDiff = radLat1 - radLat2;
  const b = (lng1 * Math.PI) / 180.0 - (lng2 * Math.PI) / 180.0;
  const distance =
    2 *
    Math.asin(
      Math.sqrt(
        Math.pow(Math.sin(radDiff / 2), 2) +
          Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)
      )
    );
  return distance * EARTH_RADIUS;
}

下面讓我來解釋一下上面這段代碼的意思,

球面坐標(biāo)系

假設(shè)地球半徑為R,經(jīng)度longitude用希臘字母\lambda表示;緯度latitude用希臘字母\varphi表示,那么P1的坐標(biāo)就是(\lambda_1,\varphi_1);而P2的坐標(biāo)就是(\lambda_2,\varphi_2),那么代碼的核心就是下面這個(gè)公式:

|P_1P_2|=2R\sqrt{\sin^2\frac{\Delta\varphi}{2}+\cos\varphi_1cos\varphi_2\sin^2\frac{\Delta\lambda}{2}}

其中
\Delta\varphi=\varphi_1-\varphi_2,\Delta\lambda=\lambda_1-\lambda_2

這個(gè)公式就是傳說中的的半正矢公式Haversine formula,然后我就很好奇為啥這個(gè)公式是這樣的,糾結(jié)這個(gè)公式是怎么來的,光是根據(jù)球面坐標(biāo)系和這個(gè)公式,并不能理解,它并不像歐幾里得空間上的距離那么直觀。

下面我們根據(jù)空間直角坐標(biāo)系來定義一下球面坐標(biāo)系,球面上的任意一點(diǎn)P(x,y,z)用經(jīng)緯度來轉(zhuǎn)換可以用下面的公式來表示:

\begin{equation} \left\{ \begin{array}{lr} x=R\cos{\varphi}\cos{\lambda}\\ y=R\cos{\varphi}\sin{\lambda}\\ z=R\sin{\varphi} \end{array} \right. \end{equation}

方法一:從弦長求大圓距離

用歐幾里得空間距離求解,對于球面上的兩點(diǎn)P_1(x_1,y_1,z_1)P_2(x_2,y_2,z_2)兩點(diǎn)之間的距離可以表示為:

|P_1P_2|=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2}

那么轉(zhuǎn)換成球面坐標(biāo)以后就是將球面公式(1)代入到歐式距離公式中,則就有:

|P_1P_2|^2=R^2[(\cos{\varphi_1}cos{\lambda_1}-\cos{\varphi_2}\cos{\lambda_2})^2+(\cos{\varphi_1}\sin{\lambda_1}-\cos{\varphi_2}\sin{\lambda_2})^2\\+(\sin{\varphi_1}-\sin{\varphi_2})^2]

等價(jià)于

|P_1P_2|^2=R^2[\cos^2{\varphi_1}\cos^2{\lambda_1}+\cos^2{\varphi_2}\cos^2{\lambda_2}-2\cos{\varphi_1}\cos{\varphi_2}\cos{\lambda_1}\cos{\lambda_2}\\ +\cos^2{\varphi_1}\sin^2{\lambda_1}+\cos^2{\varphi_2}\sin^2{\lambda_2}-2\cos{\varphi_1}\cos{\varphi_2}\sin{\lambda_1}\sin{\lambda_2}\\ +\sin^2{\varphi_1}+\sin^2{\varphi_2}-2\sin{\varphi_1}\sin{\varphi_2}]

等價(jià)于

|P_1P_2|^2=R^2[\cos^2{\varphi_1}+\cos^2{\varphi_2}+\sin^2{\varphi_1}+\sin^2{\varphi_2}\\ -2\cos{\varphi_1}\cos{\varphi_2}(\cos{\lambda_1}\cos{\lambda_2}+\sin{\lambda_1}\sin{\lambda_2})\\ -2\sin{\varphi_1}\sin{\varphi_2}]

等價(jià)于

|P_1P_2|^2=R^2[2-2\cos{\varphi_1}\cos{\varphi_2}\cos{(\lambda_1-\lambda_2)}-2\sin{\varphi_1}\sin{\varphi_2}]

等價(jià)于

|P_1P_2|^2=2R^2(1-\sin{\varphi_1}\sin{\varphi_2}-\cos{\varphi_1}\cos{\varphi_2}\cos{\Delta\lambda})

|P_1P_2|=\sqrt{2}R\sqrt{1-\sin{\varphi_1}\sin{\varphi_2}-\cos{\varphi_1}\cos{\varphi_2}\cos{\Delta\lambda}}

接下來我們把問題轉(zhuǎn)化到平面幾何上,參照下圖,|P_1P_2|的長度我們可以通過上門的公式求出,現(xiàn)在我們需要求出\stackrel{\frown}{|P_1P_2|},現(xiàn)在已知|OP_1|=|OP_2|=R,假設(shè)\angle P_1OP_2=\delta,那么\stackrel{\frown}{|P_1P_2|}=\delta R

球體在圓上的切片

由上圖顯然:

\sin{\frac{\delta}{2}}=\frac{|P_1Q|}{R}=\frac{|P_2Q|}{R}=\frac{|P_1P_2|}{2R}

這就等價(jià)于

\delta=2\arcsin{\frac{|P_1P_2|}{2R}}

所以

\delta=2\arcsin{\sqrt{\frac{{1-\sin{\varphi_1}\sin{\varphi_2}-\cos{\varphi_1}\cos{\varphi_2}\cos{\Delta\lambda}}}{2}}}

最終得到

\stackrel{\frown}{|P_1P_2|}=2R\arcsin{\sqrt{\frac{{1-\sin{\varphi_1}\sin{\varphi_2}-\cos{\varphi_1}\cos{\varphi_2}\cos{\Delta\lambda}}}{2}}}

以上是最大圓距離(Creat-circle distance)的一種表現(xiàn)形式。

方法二:用向量的余弦夾角公式求解大圓距離

用球面坐標(biāo)表示P_1(x_1,y_1,z_1)P_2(x_2,y_2,z_2)的坐標(biāo),可以得到

P_1(R\cos{\varphi_1}\cos{\lambda_1},R\cos{\varphi_1}\sin{\lambda_1},R\sin{\varphi_1})

P_2(R\cos{\varphi_2}\cos{\lambda_2},R\cos{\varphi_2}\sin{\lambda_2},R\sin{\varphi_2})

那么向量\overrightarrow{OP_1}和向量\overrightarrow{OP_2}的夾角\delta的余弦:

\cos{\angle P_1OP_2}=\cos{\delta}=\frac{\overrightarrow{OP_1}\cdot\overrightarrow{OP_2}}{|\overrightarrow{OP_1}||\overrightarrow{OP_2}|}

那么

\cos{\delta}=\frac{x_1*x_2+y_1*y_2+z_1*z_2}{R^2}

\cos{\delta}=\cos{\varphi_1}\cos{\varphi_2}\cos{\lambda_1}\cos{\lambda_2}+\cos{\varphi_1}\cos{\varphi_2}\sin{\lambda_1}\sin{\lambda_2}+\sin{\varphi_1}\sin{\varphi_2}

\cos{\delta}=\cos{\varphi_1}\cos{\varphi_2}[\cos{\lambda_1}\cos{\lambda_2}+\sin{\lambda_1}\sin{\lambda_2}]+\sin{\varphi_1}\sin{\varphi_2}

\cos{\delta}=\cos{\varphi_1}\cos{\varphi_2}\cos{(\lambda_1-\lambda_2)}+\sin{\varphi_1}\sin{\varphi_2}

\cos{\delta}=\cos{\varphi_1}\cos{\varphi_2}\cos{\Delta \lambda}+\sin{\varphi_1}\sin{\varphi_2}

由此可知

\delta=\arccos{(\cos{\varphi_1}\cos{\varphi_2}\cos{\Delta \lambda}+\sin{\varphi_1}\sin{\varphi_2})}

最終得到最大圓距離(Creat-circle distance)的另一種表現(xiàn)形式,一般網(wǎng)上找到的Creat-circle distance指的就是這個(gè)公式

\stackrel{\frown}{|P_1P_2|}=R\arccos{(\cos{\varphi_1}\cos{\varphi_2}\cos{\Delta \lambda}+\sin{\varphi_1}\sin{\varphi_2})}

注:這個(gè)公式的余弦函數(shù)在地球上距離較近的兩點(diǎn),有計(jì)算精度丟失的問題,因此在此基礎(chǔ)上我們可以利用余弦定理等價(jià)變換成另一種易于計(jì)算機(jī)較精確計(jì)算的公式,半正矢函數(shù)公式Haversine公式

方法三、用半正矢公式定義的距離

球體在圓上的切片

由余弦定理可知

|P_1P_2|^2=|OP_1|^2+|OP_2|^2-2|OP_1|\cdot|OP_2|\cdot \cos{\delta}

\cos{\delta}=\cos{\varphi_1}\cos{\varphi_2}\cos{(\lambda_1-\lambda_2)}+\sin{\varphi_1}\sin{\varphi_2}代入上式得到:

|P_1P_2|^2=2R^2-2R^2(\cos{\varphi_1}\cos{\varphi_2}\cos{\Delta\lambda}+\sin{\varphi_1}\sin{\varphi_2})

|P_1P_2|^2=2R^2-2R^2[\cos{\varphi_1}\cos{\varphi_2}(1-2\sin^2{\frac{\Delta\lambda}{2}})+\sin{\varphi_1}\sin{\varphi_2}]

|P_1P_2|^2=2R^2-2R^2[\cos{\varphi_1}\cos{\varphi_2}-2\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}+\sin{\varphi_1}\sin{\varphi_2}]

|P_1P_2|^2=2R^2-2R^2[\cos{\varphi_1}\cos{\varphi_2}+\sin{\varphi_1}\sin{\varphi_2}-2\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}]

|P_1P_2|^2=2R^2-2R^2[\cos{(\varphi_1-\varphi_2)}-2\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}]

|P_1P_2|^2=2R^2-2R^2[\cos{\Delta\varphi}-2\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}]

|P_1P_2|^2=2R^2-2R^2\cos{\Delta\varphi}+4R^2\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}

|P_1P_2|^2=2R^2(1-\cos{\Delta\varphi})+4R^2\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}

|P_1P_2|^2=4R^2\sin^2{\frac{\Delta\varphi}{2}}+4R^2\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}

由正弦定義可知:

\sin{\frac{\delta}{2}}=\frac{|P_1P_2|}{2R}

這等價(jià)于

\sin^2{\frac{\delta}{2}}=\frac{|P_1P_2|^2}{4R^2}

\sin^2{\frac{\delta}{2}}=\frac{|P_1P_2|^2}{4R^2}=\sin^2{\frac{\Delta\varphi}{2}}+\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}

\sin{\frac{\delta}{2}}=\sqrt{\sin^2{\frac{\Delta\varphi}{2}}+\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}}

所以

\delta=2\arcsin{\sqrt{\sin^2{\frac{\Delta\varphi}{2}}+\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}}}

最終得到

\stackrel{\frown}{|P_1P_2|}=2R\arcsin{\sqrt{\sin^2{\frac{\Delta\varphi}{2}}+\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}}}

這便是開篇代碼中用的Haversine公式推導(dǎo)的距離。

總結(jié)三個(gè)公式

對于球面上的兩個(gè)點(diǎn)P_1P_2,已知他們的經(jīng)度\lambda和維度\varphi,就會有以下三種距離

\stackrel{\frown}{|P_1P_2|}=2R\arcsin{\sqrt{\frac{{1-\sin{\varphi_1}\sin{\varphi_2}-\cos{\varphi_1}\cos{\varphi_2}\cos{\Delta\lambda}}}{2}}}

\stackrel{\frown}{|P_1P_2|}=R\arccos{(\cos{\varphi_1}\cos{\varphi_2}\cos{\Delta \lambda}+\sin{\varphi_1}\sin{\varphi_2})}

\stackrel{\frown}{|P_1P_2|}=2R\arcsin{\sqrt{\sin^2{\frac{\Delta\varphi}{2}}+\cos{\varphi_1}\cos{\varphi_2}\sin^2{\frac{\Delta\lambda}{2}}}}

其實(shí)正半矢公式是余弦公式的一個(gè)轉(zhuǎn)換,只是在相同緯度或者比較接近的兩個(gè)位置距離求解的情況下更適用于計(jì)算機(jī)的精確計(jì)算,因?yàn)椴蝗菀讈G失精度,但是由于摩爾定律,目前的64位的機(jī)器應(yīng)該表現(xiàn)的越來越好,具體是否有所改善有待于實(shí)驗(yàn)。說到底求解的過程其實(shí)就是,當(dāng)知道了兩點(diǎn)的經(jīng)度和緯度,然后求出球心到兩點(diǎn)形成的兩個(gè)向量的夾角,用夾角和地球半徑就求出了球面距離;還有一種思路就是,直接在直角坐標(biāo)系下求出兩點(diǎn)的歐式距離,然后利用畢達(dá)哥拉斯定理(裝逼說法,其實(shí)就是勾股定理)求出兩個(gè)向量的夾角,然后同理求出球面距離。

參考文獻(xiàn)

https://zh.wikipedia.org/wiki/%E5%A4%A7%E5%9C%86%E8%B7%9D%E7%A6%BB

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容