球面两点之间的距离计算
在便捷的交通中,我们的出行很时候都需要依赖于导航系统,对于短距离的移动,我们可以把地面当成一个平面进行简单的计算两点之间距离。但是,如果我们需要跨国、跨洲进行远距离的出行时候,平面计算已经不能满足我们生活的需要,因为地球是一个球体,例如我们需要去到南美洲,我们选择从西方向前行可以到达,从东方向也可以到达,但是我们到达目的地的最短距离只有一条,这个时候我们就该考虑一下球面两点的距离计算了。这个时候就要从二维计算切换到三位空间的计算
我们先看一下百度百科对“坐标系统”和“球面三角”的描述
坐标系统,是描述物质存在的空间位置(坐标)的参照系,通过定义特定基准及其参数形式来实现。坐标是描述位置的一组数值,按坐标的维度一般分为一维坐标(公路里程碑)和二维坐标(笛卡尔平面直角坐标、高斯平面直角坐标)、三维坐标(大地坐标、空间直角坐标)。为了描述或确定位置,必须建立坐标系统,坐标只有存在于某个坐标系统才有实际的意义与具体的位置。
地球是一个球体,球面上的位置,是以经纬度来表示,它称为“球面坐标系统”或“地理坐标系统”。在球面上计算角度距离十分麻烦,而且地图是印刷在平面纸张上,要将球面上的物体画到纸上,就必须展平,这种将球面转化为平面的过程,称为“投影”。
在进行计算时候,我们有两种计算方式
1、Haversine公式:采用了正弦函数
2、distance公式:采用余弦函数计算
两种计算方式的对比:
distance公式计算两点间距离很短时(比如地球表面上相距几百米的两点),余弦函数会得出0.999…的结果, 会导致较大的舍入误差。Haversine公式采用了正弦函数,即使距离很小,也能保持足够的有效数字。 采用计算机来计算时,两个公式的区别不大。 不过还是推荐采用Haversine公式。
haversin(d/R) = haversin(φ2 - φ1) + cos(φ1) cos(φ2) haversin(⊿λ)
其中:
haversin(θ) = sin(θ/2)^2 = (1- cos(θ))/2
R为地球半径,可取平均值 6371.137km
φ1, φ2 表示两点的纬度;
Δλ 表示两点经度的差值。
分享一段PHP的计算实现: