首頁  >  文章  >  web前端  >  javascript透過經緯度來計算兩地之間的距離

javascript透過經緯度來計算兩地之間的距離

不言
不言原創
2018-09-10 14:40:538025瀏覽

javascript如何計算兩個地方之間的距離?我相信會有很多種方法都可以實現,接下來的這篇文章就給大家來介紹javascript透過經緯度來計算兩地之間的距離。

最近工作需要,網路搜尋了下根據經緯度計算兩地距離的方法,發現要麼是幾何法,畫圖、作一堆輔助線,然後證明推理,要麼二話不說直接套公式。這篇文章介紹一個容易理解的方式來求這個距離。

想法

地球是個不規則的橢球體、為了簡單我們當作球體來計算。 
球體上兩地的最短距離就是經過兩點的大圓的劣弧長度。

思路如下:

弧長← 弦長(兩點距離) ← 兩點座標(直角座標) ← 經緯度

#計算

1. 座標轉換

設:

地球半徑為$R$

地心到E 0°  N 0°  的連線為x 軸

地心到E 90° N 0°  的連線為y 軸

地心到E 0°  N 90° 的連線為z 軸

#地球表面有一點$A $, 經度為$e$, 緯度為$n$, 單位為弧度

#則$A$ 的座標可表示為:

$$ x = R \cdot cos(n) \cdot cos(e)\\ y = R \cdot cos(n) \cdot sin(e)\\ z = R \cdot sin(n) $$

程式碼

const R = 6371
const {cos, sin, PI} = Math

let getPoint = (e, n) => {
    //首先将角度转为弧度
    e *= PI/180
    n *= PI/180
    reutrn {
        x: R*cos(n)*cos(e),
        y: R*cos(n)*sin(e),
        z: R*sin(n)
    }
}

2. 根據座標計算兩點距離

這個太簡單,跳過

#3.根據弦長求弧長

這個可以畫個圖,幫助理解:

javascript透過經緯度來計算兩地之間的距離

#現在已知弦長$c$ , 半徑$R$, 要求弧$r$ 的長度
這很簡單, 只要先求出$∠\alpha$ 的大小:

$$ \alpha = \arcsin(c/2/R)\\ r = 2\alpha \cdot R $$

代碼

const {asin} = Math
const R = 6371

r = asin(c/2/R)*2*R

最終程式碼

/**
 * 获取两经纬度之间的距离
 * @param {number} e1 点1的东经, 单位:角度, 如果是西经则为负
 * @param {number} n1 点1的北纬, 单位:角度, 如果是南纬则为负
 * @param {number} e2
 * @param {number} n2
 */
function getDistance(e1, n1, e2, n2){
    const R = 6371
    const { sin, cos, asin, PI, hypot } = Math
    
    /** 根据经纬度获取点的坐标 */
    let getPoint = (e, n) => {
        e *= PI/180
        n *= PI/180
        //这里 R* 被去掉, 相当于先求单位圆上两点的距, 最后会再将这个距离放大 R 倍
        return {x: cos(n)*cos(e), y: cos(n)*sin(e), z: sin(n)}
    }
    
    let a = getPoint(e1, n1)
    let b = getPoint(e2, n2)
    let c = hypot(a.x - b.x, a.y - b.y, a.z - b.z)
    let r = asin(c/2)*2*R
    return r
}

相關推薦:

根據經緯度計算兩地距離

#PHP根據兩點間的經緯度計算距離,php兩點經緯度計算

以上是javascript透過經緯度來計算兩地之間的距離的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

相關文章

看更多