最近工做须要,网上搜索了下根据经纬度计算两地距离的方法,发现要么是几何法,画图、做一堆辅助线,而后证实推理,要么二话不说直接套公式。这篇文章介绍一种容易理解的方式来求这个距离。javascript
地球是个不规则的椭球体、为了简便咱们看成球体来计算。
球体上两地的最短距离就是通过两点的大圆的劣弧长度。java
思路以下:spa
弧长 ← 弦长(两点距离) ← 两点坐标(直角坐标) ← 经纬度
设code
则 $A$ 的坐标可表示为:blog
$$ x = R \cdot cos(n) \cdot cos(e)\\ y = R \cdot cos(n) \cdot sin(e)\\ z = R \cdot sin(n) $$ip
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) } }
这个太简单,跳过get
这个能够画个图,帮助理解:it
如今已知弦长 $c$, 半径 $R$, 要求弧 $r$ 的长度
这很简单, 只需先求出 $∠\alpha$ 的大小 :io
$$ \alpha = \arcsin(c/2/R)\\ r = 2\alpha \cdot R $$function
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 }