两个 GPS 坐标之间的距离要怎么算
两个 GPS 坐标说白了就是两对数字——各自一个经度一个纬度,很容易就想把它们当成平面网格上的两个点来处理:把经纬度分别相减,平方,加起来,再开方。这个捷径是错的,而且错得不止是差一点四舍五入那么简单。经纬度是量在一个球面上的角度,不是平面上的位置,真正的距离计算从第一步起就得把这一点考虑进去。
先说结论
把两组经纬度换算成距离,标准做法是用一个大圆距离公式——多数徒步和地图类软件实际用的是 haversine 公式——把两个点当成球面上的点,先算出沿着这个球面走过去的最短弧长,再乘以地球的半径得到实际距离。这个公式先把两个坐标都转成弧度,然后按固定的顺序跑一串三角函数,最后返回的是两点之间的直线距离——不是沿着某条步道或某条路走过去的距离,只是一个地点到另一个地点之间最直接的那段间隔。
为什么平面捷径行不通
纬度 1 度在地球上任何地方对应的距离大致相同,大约 111 公里。经度 1 度就不是这样了:在赤道附近同样是 111 公里左右,但越靠近南北极就越缩小到接近零,因为经线是向两极收拢的。要是不管三七二十一,把纬度和经度的一度都当成同一回事来算,离开热带地区之后算出来的结果就会开始偏离真实距离——纬度低的地方偏差小一点,往南北极去偏差就越来越大。用勾股定理走捷径,前提是假设有一张方格网,网格里不管哪个方向 1 度都是 1 度,可经纬度本来就不是照这个假设长出来的。
大圆距离公式绕开了这个问题,因为它压根没把坐标当成网格上的位置来处理。它直接在坐标本来所在的那个曲面上,用角度本身来计算,所以不需要再另外根据纬度高低做一次修正。
这个计算实际需要什么
不管是哪个版本的公式,起点都是同样的四个数字:第一个点的经纬度,第二个点的经纬度——在其他一切开始之前,先把它们从角度换算成弧度。接下来是一串固定顺序的正弦、余弦、反正切运算,算出一个角度:从地心看过去,这两个点之间张开的角度。把这个角度乘以地球的平均半径,就得到一个实际距离,单位随半径给定的单位而定。
这个计算只需要这两组坐标本身,别的什么都不需要。不需要知道中间还有哪些点,不需要海拔,也不需要知道两点之间的地面上有什么——它纯粹是球面上两个位置之间的一个函数。
两个点靠得很近时,用简化算法就够了
完整的球面三角学在长距离时才真正要紧,因为那种情况下两点之间地球的弯曲程度已经大到不能忽略。步道上相邻的两个点——相隔几米,间隔几秒钟记录——彼此靠得足够近,实际上可以把它们之间那一小片地表当成平的来看待。只针对当时所在纬度修正一下经度 1 度实际对应的距离,用这样一个简单的平面近似算法算出来的答案,跟大圆距离公式的结果之间的差距,比 GPS 接收器本身的误差还要小。不少徒步记录软件在点与点之间实际跑的正是这个简化版本,因为算起来更省,而在徒步这个距离尺度上又不会丢掉任何有意义的东西。
一次山行的总距离说到底就是这个
一条记录下来的轨迹并不是一次距离计算的结果——它是把这同一个两点间计算,在轨迹里每一对相邻的点之间各跑一遍,再把所有结果加起来。一趟每秒记录一次、走了一个小时的山行,大概有 3600 个点,也就差不多有这么多个首尾相连的小段距离计算,每一段只覆盖几米。山行结束时显示的总距离,就是把它们全部加起来的结果,这也是为什么它是一个不断累加的数字,而不是一次性测出来的数值——只有等每一对相邻的点都跑完了这个计算,这个总数才算存在。
同样的道理,这也是一段水平距离,而不是沿坡面走过的距离,因为公式用的只有经度和纬度,从头到尾都没看过海拔这一栏。同样的坐标,走一段陡坡和走一段平路算出来的距离是一样的,因为这个计算本来就没有任何一步会去读海拔。
容易搞错的地方
- 把两个坐标直接相减当成距离——坐标的差是一个角度,不是距离,要把它正确换算成距离,还得知道这两个点具体在地球上的什么位置。
- 直接对经纬度用勾股定理——这只在平面上成立,而经纬度描述的是球面上的位置,离赤道越远,这么算出来的误差就越大。
- 跑三角函数之前忘了把角度换算成弧度——大多数公式的实现都默认输入是弧度,直接喂进去角度的原始数值,算出来的结果看着像那么回事,实际上不是真正的距离。
- 以为结果里包含了海拔差——大圆距离测的是沿地表的距离,跟山行总距离用的是同一套水平方向的算法,所以同样两点之间,陡坡和平路量出来的距离完全一样。
TrailCam 在这里做的事
TrailCam 在记录一段路线的整个过程中,会持续跑这同一个两点间的计算,把每一小段距离不断加进山行进行中显示的那个总距离里。GPX 1.1 导出文件里保留了每个记录点未经四舍五入的原始经度、纬度和海拔,所以如果你想自己核对,完全可以拿着这份文件把同一个距离重新算一遍。GPX 导出属于可选的 TrailCam Pro,App 本身免费下载。
常见问题
- GPS 距离计算最常用的公式是什么?
- 多数徒步、地图和 GIS 软件用的是 haversine 公式。它把两个坐标都当成球面上的点,返回的是大圆距离——沿地表走的最短路径,而不是穿过地面的直线距离。
- 能不能直接把两组经纬度相减得到距离?
- 不能。两个坐标的差是一个角度,要把这个角度换算成实际距离,还得看这两个点具体在地球上的哪个位置,因为经度 1 度对应的实际距离越靠近赤道越大,越远离赤道越小。
- 两个 GPS 坐标之间的距离计算,算没算上海拔变化?
- 默认没有。标准的大圆距离计算只用经度和纬度,这也是为什么一次山行记录下来的总距离是一个水平方向的数字,不会因为爬了一段陡坡就跟着变大。
记录你自己的轨迹
TrailCam 是一款 iPhone 上的 GPS 轨迹记录 App,会把沿途拍的视频、照片和语音钉在你拍下它的那个位置,并支持导出成 GPX 1.1 或 CSV。免费下载。