摘要:最近工作需要,網(wǎng)上搜索了下根據(jù)經(jīng)緯度計(jì)算兩地距離的方法,發(fā)現(xiàn)要么是幾何法,畫(huà)圖作一堆輔助線,然后證明推理,要么二話不說(shuō)直接套公式。球體上兩地的最短距離就是經(jīng)過(guò)兩點(diǎn)的大圓的劣弧長(zhǎng)度。
最近工作需要,網(wǎng)上搜索了下根據(jù)經(jīng)緯度計(jì)算兩地距離的方法,發(fā)現(xiàn)要么是幾何法,畫(huà)圖、作一堆輔助線,然后證明推理,要么二話不說(shuō)直接套公式。這篇文章介紹一種容易理解的方式來(lái)求這個(gè)距離。
0b00 思路地球是個(gè)不規(guī)則的橢球體、為了簡(jiǎn)便我們當(dāng)作球體來(lái)計(jì)算。
球體上兩地的最短距離就是經(jīng)過(guò)兩點(diǎn)的大圓的劣弧長(zhǎng)度。
思路如下:
弧長(zhǎng) ← 弦長(zhǎng)(兩點(diǎn)距離) ← 兩點(diǎn)坐標(biāo)(直角坐標(biāo)) ← 經(jīng)緯度0b01 計(jì)算 1. 坐標(biāo)轉(zhuǎn)換
設(shè)
地球半徑為 $R$
地心到 E 0° N 0° 的連線為 x 軸
地心到 E 90° N 0° 的連線為 y 軸
地心到 E 0° N 90° 的連線為 z 軸
地球表面有一點(diǎn) $A$, 經(jīng)度為 $e$, 緯度為 $n$, 單位為弧度
則 $A$ 的坐標(biāo)可表示為:
$$ 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) => { //首先將角度轉(zhuǎ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. 根據(jù)坐標(biāo)計(jì)算兩點(diǎn)距離
這個(gè)太簡(jiǎn)單,跳過(guò)
3. 根據(jù)弦長(zhǎng)求弧長(zhǎng)這個(gè)可以畫(huà)個(gè)圖,幫助理解:
現(xiàn)在已知弦長(zhǎng) $c$, 半徑 $R$, 要求弧 $r$ 的長(zhǎng)度
這很簡(jiǎn)單, 只需先求出 $∠alpha$ 的大小 :
$$ alpha = arcsin(c/2/R) r = 2alpha cdot R $$
代碼const {asin} = Math const R = 6371 r = asin(c/2/R)*2*R0b10 最終代碼
/** * 獲取兩經(jīng)緯度之間的距離 * @param {number} e1 點(diǎn)1的東經(jīng), 單位:角度, 如果是西經(jīng)則為負(fù) * @param {number} n1 點(diǎn)1的北緯, 單位:角度, 如果是南緯則為負(fù) * @param {number} e2 * @param {number} n2 */ function getDistance(e1, n1, e2, n2){ const R = 6371 const { sin, cos, asin, PI, hypot } = Math /** 根據(jù)經(jīng)緯度獲取點(diǎn)的坐標(biāo) */ let getPoint = (e, n) => { e *= PI/180 n *= PI/180 //這里 R* 被去掉, 相當(dāng)于先求單位圓上兩點(diǎn)的距, 最后會(huì)再將這個(gè)距離放大 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 }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97277.html
摘要:計(jì)算精度與谷歌地圖的距離精度差不多,相差范圍在米以下。以上代碼大部分來(lái)自網(wǎng)上收集,經(jīng)過(guò)驗(yàn)證過(guò)的,可以使用 根據(jù)經(jīng)緯度計(jì)算距離公式 showImg(https://segmentfault.com/img/bV6zX2?w=437&h=76); 圖片來(lái)自互聯(lián)網(wǎng) 對(duì)上面的公式解釋如下: Lung1 Lat1表示A點(diǎn)經(jīng)緯度, Lung2 Lat2表示B點(diǎn)經(jīng)緯度; a=Lat1 – Lat2...
摘要:計(jì)算精度與谷歌地圖的距離精度差不多,相差范圍在米以下。以上代碼大部分來(lái)自網(wǎng)上收集,經(jīng)過(guò)驗(yàn)證過(guò)的,可以使用 根據(jù)經(jīng)緯度計(jì)算距離公式 showImg(https://segmentfault.com/img/bV6zX2?w=437&h=76); 圖片來(lái)自互聯(lián)網(wǎng) 對(duì)上面的公式解釋如下: Lung1 Lat1表示A點(diǎn)經(jīng)緯度, Lung2 Lat2表示B點(diǎn)經(jīng)緯度; a=Lat1 – Lat2...
摘要:前言最近在幫朋友商家寫(xiě)小程序,所以看了不少關(guān)于小程序的知識(shí),總結(jié)一下計(jì)算距離這條線。 前言 最近在幫朋友(商家)寫(xiě)小程序,所以看了不少關(guān)于小程序的知識(shí),總結(jié)一下計(jì)算距離這條線。 思路 一共有兩種方法,各有利弊:1.利用小程序的wx.getLocation 方法得到用戶的經(jīng)緯度,然后用已知的商家的經(jīng)緯進(jìn)行計(jì)算;2.利用騰訊地圖位置服務(wù)calculateDistance直接計(jì)算 先熟悉下兩...
閱讀 1670·2021-10-13 09:39
閱讀 2099·2021-09-07 10:20
閱讀 2678·2019-08-30 15:56
閱讀 2945·2019-08-30 15:56
閱讀 932·2019-08-30 15:55
閱讀 625·2019-08-30 15:46
閱讀 3494·2019-08-30 15:44
閱讀 2552·2019-08-30 11:15