近来工作需要,网上搜刮了下依据经纬度盘算两地间隔的要领,发明要么是多少法,绘图、作一堆辅助线,然后证实推理,要么二话不说直接套公式。这篇文章引见一种轻易明白的体式格局来求这个间隔。
0b00 思绪
地球是个不规则的椭球体、为了轻便我们看成球体来盘算。
球体上两地的最短间隔就是经由两点的大圆的劣弧长度。
思绪以下:
弧长 ← 弦长(两点间隔) ← 两点坐标(直角坐标) ← 经纬度
0b01 盘算
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. 依据弦长求弧长
这个能够画个图,协助明白:
如今已知弦长 $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
0b10 终究代码
/**
* 猎取两经纬度之间的间隔
* @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
}