地球兩點的距離

獲取地球兩點的距離

最近在作小程序的時候遇到要計算兩點之間的距離,但小程序沒有相關的方法,只好本身來了.小程序

背景知識

地球的半徑

地球雖然是個橢圓,但也極像個正圓(相差大概20千米),因此就按正圓來算了,半徑是6371.393千米.函數

弧長公式

L = 弧度 * R = 圓心角度數 × π × R / 180spa

餘弦定律

2abcosC=a^2+b^2-c^2
c^2 = a^2+b^2-2abcosCcode

模型

圖片描述

思路

  1. 假設求A,B兩點的距離,半徑已經知道了,
  2. 如今只需求∠AOB弧度.
  3. 但∠AOB弧度能夠經過AB的長度得到

運算過程

根據上面的圖算 blog

假設A座標(JA,WA),B座標(JB,WB).
即∠AOC = WA, ∠BOD = WB. 圖片

根據三角形函數 it

AC = sin(WA) R, BD = sin(WB) R
因此 BE = BD - ACio

由於∠COD = (JB - JA), 根據餘弦定律
CO = cos(WA) R, DO = cos(WB) R
因此 AE = CD = 根號[CO^2 + DO^2 - 2 CO DO * cos(∠COD)]function

根據勾股定律
AB^2 = AE^2 + BE^2class

由於∆AOB是等腰三角形,三線合一,GO爲垂直平分線
AB^2 = 2R^2 - 2R^2 * cosC;
cosC = [2R^2 - AB^2] / 2R^2;
簡化的
∠AOB弧度 = acos[sin(WA)sin(WB) + cos(WA)cos(WB)cos(JB-JA)]

L = ∠AOB弧度 * R

代碼

function _Radian(num) {
    return num * Math.PI / 180;
}

function CalculateDistance(lata, lnga, latb, lngb) {
    var earthR = 6371.393;
    var WA, WB;
    WA         = _Radian(lata);
    WB         = _Radian(latb);

    var lngMinus  = Math.abs(lngb - lnga) > 180? 360 - Math.abs(lngb - lnga): Math.abs(lngb - lnga);
    var lngRadian = _Radian(lngMinus);
    var ANGLE     = Math.sin(WA) * Math.sin(WB) + Math.cos(WA) * Math.cos(WB) * Math.cos(lngRadian);
    var L         = Math.acos(ANGLE) * earthR;
    return L;
}

用_Radian發角度轉化爲弧度. 由於取兩點的最小值,因此但經度之間差大於180時,再用360 - 經度差,取最小經度差.

相關文章
相關標籤/搜索