作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Tomo克拉伊纳地区
验证专家 在工程

Tomo是一个拥有13年以上经验的Java, Android和Golang开发人员. 他曾在电信和银行系统工作.

以前在

infobip
分享

这一切都是从一次徒步旅行开始的 Žbevnica 10个以上 年前. 我带着我的新全球定位系统(GPS),我的一个朋友也连接了全球定位系统(GPS) 转到Windows ME手机. 徒步旅行很棒, 但当我们回到车里, 我们惊讶地发现,一个全球定位系统(GPS)声称我们已经走了.2公里,而另一个报告6公里.7km. 一个声称我们的高度增益(1).e.,和 在我们徒步的所有上坡部分中,有300米,而另一个报告是500米.

作为一名程序员(最终成为一名程序员) 地理信息系统的程序员),我立刻对这个问题产生了兴趣. 我对自己说,这应该 很难用一个简单的脚本来修复.毕竟,全球定位系统(GPS)轨道只是一个元组列表,形式是 (纬度、经度、海拔),对吧?

嗯,不完全是.

就这样,我开始了一段迷人的全球定位系统(GPS)追踪世界之旅, 跟踪错误, 和, 更一般的, 地理信息系统编程.

地理空间信息系统(地理信息系统)是一个庞大而复杂的领域, 包括地图投影和大地测量基准), 栅格和矢量数据处理, 和远程 传感. 对这个领域的全面介绍远远超出了本文的范围. 因为专注于一个特定的问题通常是一种介绍自己进入一个新领域的有用方式, I’ll present a few specific 地理信息系统 challenges I encountered 和 some possible solutions; namely:

  • 如何识别,理解,并通过编程纠正全球定位系统(GPS)跟踪错误
  • 如何从全球定位系统(GPS)轨迹中计算和推导额外的有用信息

首先,全球定位系统(GPS)跟踪是 只是一系列的 (纬度、经度、海拔) 元组. 许多具有gps功能的设备也将提供元数据,如时间、心脏 速率,等等. 一些全球定位系统(GPS)设备甚至会提供有关数据准确性的信息 is; a.k.a., “稀释的 精度”. 但, 不幸的是, 大多数全球定位系统(GPS)设备——尤其是主导市场的低端设备——不会提供这些信息,我们只能这样做 挑战在于我们自己推断出设备的准确性(并在理想情况下进行相应修正), 在可能的情况下).

让我们从一种可能检测低端全球定位系统(GPS)设备的算法开始 (像大多数智能手机一样),这些手机通常只有低质量的全球定位系统(GPS)数据.

仰角误差和特性

如果你生活在世界上的某些地方,你可能会注意到一些事情 当你用智能手机记录轨迹时,全球定位系统(GPS)的高程精度很奇怪. 当你检查时 它们的海拔高度一致地记录为更高或更低(由a 恒定值)比右标高高. 例如,我住在Višnjan (克罗地亚),我的安卓一直告诉我,我大约35-40米 高于实际标高.

举个例子,这是我短途徒步旅行的全球定位系统(GPS)高程图 个月前:

该图显示了地理信息系统编程中全球定位系统(GPS)高程精度的问题.

这里需要注意两点.

首先, 第一部分记录的全球定位系统(GPS)数据中的“山”为 完全由设备制造. 然而,图表似乎表明,我们徒步旅行的最高点离起点只有几百米, 实际上是在4公里之后.

其次,也许更重要的是 在图中可见)就是这样 整个图表是不准确的. 报道的海拔高度值一直比实际高大约30-40米, 我们将在本文中进一步详细讨论.

当我们能检测到轨迹有这些错误时, 我们可以推断这个设备可能是一个低质量的全球定位系统(GPS).

这些都是廉价的全球定位系统(GPS)设备可能发生的事情. 当我们能检测到轨迹有这些错误时, 我们可以推断,该设备可能是一个低质量的全球定位系统(GPS),因此可以预期还有其他错误-不仅仅是仰角误差-这是这种设备常见的.

启动仰角错误

全球定位系统(GPS)设备基本上采用两种技术来确定海拔:“全球定位系统(GPS)高度”(由全球定位系统(GPS)卫星系统报告给设备)和“气压高度”(由设备根据气压读数计算)。. 两者都不完美.

全球定位系统(GPS)高度值可能有许多小误差(通常在+/- 10m范围内), 如果我们以后决定计算累积海拔增益,哪个问题会特别大. 气压高度, 另一方面, 不仅对海拔高度敏感还对天气状况敏感, 它会引入自己的一套不准确性.

因此,有些设备采用混合方法, 使用气压读数来记录海拔高度,但使用全球定位系统(GPS)读数来帮助(重新)校准这些值, 以帮助解释天气(压力)的变化等等. 有了这样的设备, 启动轨道时, 气压标高可能完全错误, 然后用越来越多的全球定位系统(GPS)卫星数据重新校准它, 高程数据变得更加可靠. 因此,这类设备遇到我们之前在海拔图上观察到的“假山”启动错误并不罕见.

持续的全球定位系统(GPS)高程不准确

解释高度报告的一致性错误, 我们需要回到小学地理. 地理老师通常解释说地球不是一个球体,而是一个圆 椭球体. 事实上,如果这是严格正确的,那么用数学方法计算海拔就很容易了. 但事实并非如此. The 地球 is irregular; in 真正的ity, it’s more like a 形似椭球的马铃薯 而不是完美的椭球体, 这意味着在地理信息系统开发中,你需要地球上几乎每个点的详细海拔数据集. In 大地测量学,这个参考椭球体(a.k.a. 基准面(Datum)是一个数学定义的表面,它近似于 大地水准面这是地球“更真实”的形象.

此外,重要的是要认识到,即使是这些数据也仅仅是 近似 地球表面的实际形状. 有些在世界上的某些地方效果更好,而另一些在其他地方效果更好. 作为示例,下面的图像(使用 我的Ruby库) 显示了地球与最常用的一种不同之处 椭球模型 WGS84 基准). 黑色部分代表地球上方的部分, 白色代表下面的部分地球, 理想椭球体(大陆和岛屿等高线用红色表示).

这张图表描绘了地球表面, 由Ruby库生成,用于地理空间和地理信息系统编程.

你可以看到印度在WGS84椭球之下,南部是绝对最小的(几乎是-100米)!),而欧洲则在其之上.

因为低质量的全球定位系统(GPS)设备不使用任何这样的基准, 他们只是在假设一个完美椭球体的情况下计算高程. 因此,它们始终不准确.

检测和纠正全球定位系统(GPS)高程误差

在全球定位系统(GPS)应用开发中, 检测记录我们轨迹的设备是否有这些类型的错误,可以使用 地球引力模型EGM2008 数据集, 有时也被称为“大地水准面波动”数据集. 有了EGM2008,我们可以做到 近似于实际地球表面的差值 理想的椭球体.

与EGM2008, 我们可以近似地求出实际地球表面与理想椭球面的差.

但是要知道 我们的 全球定位系统(GPS)跟踪有这个误差我们还需要一个东西 真正的 海拔高度. 可以帮助实现这一目的的公共数据库是 航天飞机雷达 地形调查团(SRTM). SRTM是 基于栅格的数据库,以大约每30米(赤道)的分辨率为美国提供高程值,而世界其他地区则以每90米的分辨率提供高程值. 例如, 在计算上述轨迹中点的SRTM值时, 一个不同的图表(蓝线)出现了:

地理信息系统高程值的SRTM数据库是开发全球定位系统(GPS)应用程序的一个很好的工具.

这里的一个小烦恼是图形的粗糙边缘,但这很容易平滑. 注意,通过平滑,我们损失很少(如果有的话)精度, 因为SRTM本身只提供等距位置的离散点, 在任何情况下我们都需要插入. 这是前一张图的一个版本,用红线覆盖表示平滑的SRTM数据:

这是来自SRTM数据库的全球定位系统(GPS)高程数据的平滑图表.

所有这些都可以很容易地完成,顺便说一句,使用我的全球定位系统(GPS) Python库:

  • srtm.py用于航天飞机雷达地形任务(SRTM)高程数据的python解析器
  • gpxpy:用于解析和操作GPX文件的简单python库(GPX全球定位系统(GPS)交换格式是一种用于全球定位系统(GPS)数据的轻量级XML数据格式。

Ruby用户,还有我的 Geo海拔高度s.Rb解析器库 SRTM和EGM2008波动.

检测到这些异常之后, 这取决于我们使用的软件类型, 我们可以(a)自己自动纠正错误或(b)简单地通知用户在他们的高程数据中检测到不准确.

也, 因为有不同的算法可以用来对这些全球定位系统(GPS)高程误差进行编程校正, 我们可能想让用户选择使用哪种算法(e).g., 用户是希望我们“原样”使用平滑的SRTM数据,还是希望我们使用SRTM数据来帮助纠正设备报告的海拔高度?.

平滑轨迹并去除异常值

如果一个足球运动员戴上全球定位系统(GPS)设备记录比赛,那么 由此产生的轨道将是一团乱. 比赛场地将被密集地填满 赛道上有很多急转弯,加速和减速.

幸运的是,大多数情况下,人们使用全球定位系统(GPS)不会有相同的 模式- 全球定位系统(GPS)轨道线(和加速度)将相对平滑. 在这种情况下, 轨道上的不稳定点可以假定是由误差引起的,因此可以用平滑函数合理地去除这些异常点.

作为地理信息系统开发人员,平滑最常用的方法是遍历点和 改变 基于相邻坐标值的坐标. 例如,我们可以使用如下算法更改每个纬度和经度:

点[n].纬度=点[n-1].纬度* 0.3 +分[n].纬度* .4 +分[n+1].纬度* .3
点[n].经度=点[n-1].经度* 0.3 +分[n].经度* .4 +分[n+1].经度* .3

系数越大,对应相邻点的影响越大 O当前点的修改位置. 我在这个例子中使用的系数是(0.3, 0.4, 0.3)有些武断,但在大多数情况下,你会希望它们的和等于1.0. (一种更复杂的方法, 例如, 是用点与点之间的距离, 点越近, 相应的系数越大.)

下面是一个带有许多随机错误的轨道的例子:

在地理信息系统开发中,全球定位系统(GPS)跟踪最大的挑战之一是具有大量随机误差的跟踪.

请注意,轨迹与路径不一致, 有很多急转弯和锯齿形转弯, 有时会完全偏离预期的道路.

经过几次“平滑”迭代后,相同的轨道被转换为:

在平滑跟踪误差之后, 全球定位系统(GPS)跟踪在这个程序仍然是不完善的, 但更好的.

虽然这已经好了很多,但不可否认,它仍然不完美. 请注意,仍然有一些地方(特别是在路径的中间),轨道仍然偏离道路.

你还可以尝试其他方法. 在某些地区,对于某些全球定位系统(GPS)应用程序,您还可以使用 OpenStreetMap (OSM) 数据试图猜测正确的路径,然后将点“snap”到这条新线上. 虽然这通常是有用的, 它也可能不完美, 例如OSM数据包含两条平行线(例如高速公路和附近的道路)或许多紧密路径的情况.

如果我们能推断出这条路是徒步旅行的, 并且可以选择快速进入高速公路或附近的小路, 我们可以放心地假设徒步旅行是沿着小路而不是高速公路.

在这种情况下, 一个可能的解决方案是尝试检测活动的类型, 使用本文中进一步讨论的一些技术. 如果我们能推断出, 例如, 这条路是一条徒步路线,可以选择走高速公路或附近的小路, 我们可以放心地假设徒步旅行是沿着小路而不是高速公路.

还要注意的是,虽然这个例子演示了曲面坐标的平滑(i.e., 经度/纬度), 对于消除高程或时间数据中的像差,平滑可以是同样有效的技术, 甚至在心率和自行车节奏数据中.

平滑的其他好处和用途的例子包括:

  • 计算总高程增益. 为了计算轨迹中的总海拔增益,仅仅将所有上山的小“跳跃”相加是不够的,因为它们通常包含小误差. 在进行求和之前,将标高平滑通常可以帮助缓解这个问题.
  • 离群值删除. “平滑”后,离轨道太远的点更容易被检测到. 这些通常会被认为是异常值,并提示用户是否应该删除它们.

这种算法有一个不足之处:在某些情况下,全球定位系统(GPS)会记录一条平滑的路径, 但是路径会在某个方向上被一个常数差“移动”. 在这种情况下,平滑可能会进一步平滑线条,但不会纠正这种移位错误.

另外一个不太明显的, 然而,重要的, 我们所描述的简单平滑技术的问题是,转换修改了路径中的所有(或几乎所有)点, 即使是那些可能没有错的. 虽然这种简单的方法对于普通的全球定位系统(GPS)用户来说是一种合理的解决方案, 更复杂的平滑算法当然适用于地理信息系统编程. 在某些情况下, 它甚至可以更好地删除异常值,而不执行任何平滑取决于用户, 设备, 和应用程序.

检测最大速度

如果我们有路线上所有点的坐标和时间戳,检测轨道的最大速度是相当简单的. 只需计算点之间的速度并找到最大值. 看起来简单.

但请记住, 我们处理的是低端全球定位系统(GPS)设备,我们不完全相信数据, 哪些会对我们的计算产生重大影响. 如果一个设备每5米记录一个位置,在一个点上出现了10米的错误 那么这部分赛道可能会比原来快3倍!

在地理信息系统开发世界中,一种常见的方法是提取点之间的所有速度, 然后去掉最上面的5% (i.e. 使用第95个百分位数),希望消除的5%代表大多数错误. 但这显然是不科学的,也不能保证正确的结果. 在我的实验中, 我尝试了不同的百分位数值,发现有些值适用于一种全球定位系统(GPS)设备,有些适用于其他设备. 有些适合徒步旅行,有些适合骑自行车. 但在大多数情况下,结果并非如此 感觉 对我来说.

在尝试了很多算法之后 做了 我的工作很简单:做加法 另一个过滤极端的方法,不仅通过速度,还通过距离,如下所示:

  1. 分类分 通过距离 邻居之间,去掉前5%的人.
  2. (可选)平滑轨道(水平和/或垂直).
  3. 分类分 的速度 邻居之间,去掉前5%的人.
这个算法产生了相当可信的结果, 即使是来自廉价全球定位系统(GPS)设备的随机误差追踪.

根据我的经验, 这个算法产生了相当可信的结果, 即使是来自廉价全球定位系统(GPS)设备的随机误差追踪.

演绎活动类型

在许多情况下,平均速度足以确定活动类型. 如果平均速度是5公里每小时, 例如, 这可能是一条步行/远足路线, 而如果平均速度是30公里每小时, 这可能是一条自行车道, 等等.......

但是如果平均速度是12km / h,你就不能确定用户是在骑山地自行车还是在跑步. 在这种情况下, 最大 速度有时可以帮助区分两种类型的活动. 具体地说, 我们可以利用这样一个事实:跑步者很少能达到平均速度的两倍以上, 骑自行车的人经常这样做.g.,同时沿着一条不太具有挑战性的路径下坡).

相应的, 跑步时可能录得平均时速12公里、最高时速18公里的轨迹, 而山地车的平均速度为12km / h,最高速度为30km / h. (当然, 我们必须确保计算出的最大速度是正确的, 为了使它可靠地工作.)

可见天空的百分比:全球定位系统(GPS)错误检测的一个聪明的代理

每次全球定位系统(GPS)测量的精度(i.e. 纬度,经度,和 高度)很大程度上取决于卫星的数量 在记录时可见. 所以如果我们能确定每次录音时有多少颗卫星在“视野中”, 我们可以用它来近似记录的准确性. 如果我们知道, 例如, 所有需要的全球定位系统(GPS)卫星都已就位, 我们可以假设相应的全球定位系统(GPS)数据具有很高的精度. 相反, 如果我们知道视野中没有全球定位系统(GPS)卫星, 我们可以假设数据容易出错.

但是,在您过于兴奋之前,请考虑尝试解决此类地理信息系统问题的复杂性. 首先, 你需要知道你的设备能够与哪个全球定位系统(GPS)卫星系统通信. 这是美国的原版 全球定位系统,欧洲人 Gallileo和俄国人 格洛纳斯 系统. 有些设备可以与所有这些卫星类型一起工作,但许多设备不能. 而且许多设备甚至不报告它们使用的是哪个系统.

但有一种聪明的方法可以绕过这种复杂性,粗略地估算出观测到的卫星数量: 使用可见天空的百分比作为可见卫星数量的代理. 更不可见的天空意味着我们的全球定位系统(GPS)可以被更少的卫星“看到”(或被看到). 但是我们如何计算可见天空在任意一点上的百分比 地球? 解决方法其实很简单:我们可以计算周围的地平线 我们使用前面讨论的SRTM数据.

例如,这是地平线,如果你在特里格拉夫下面的山谷 (斯洛文尼亚最高峰),使用SRTM计算得出:

特里格拉夫下面山谷的地平线图像,使用地理信息系统代码创建.

(对于那些感兴趣的人,可以找到我创建这个图像的代码 在这里.)

这幅图像基本上是由从中心点看的等距高程图层组成的. 蓝色区域越深, the more distant the 海拔高度 layer; the lighter the blue area, 海拔层越近. 画出的最高点代表地平线. 如果全球定位系统(GPS)卫星在天空的这条线以下,我们的设备可能无法看到(或被看到)它. (注意, 虽然, 尽管图像被绘制成扁平的矩形, 在现实中,你需要一些基本的球面几何知识来正确地计算地平线以下的面积.)

这种方法在一些情况下是很有用的,比如爬山,你可能会从一个深峡谷(全球定位系统(GPS)信号不好)到一个山脊(信号很好)。. 这可能是一个有用的指标,表明您的轨道的哪些部分可能更容易出错.

另一件要记住的事情是,这不是解决问题的灵丹妙药 全球定位系统(GPS)仰角误差检测. 首先,地球的大部分地区都不是山 而且,即使他们是,也是在我们的 心理学高估海拔; 的实际百分比 在绝大多数有人居住的地区,可见天空的面积大于75%. 但尽管如此, 这种方法在某些情况下是有用的, 比如爬山,你可能会从一个深峡谷(全球定位系统(GPS)接收能力差)到一个山脊(卫星接收能力强) 可能要好得多). 虽然这种方法并不能绝对衡量轨迹有多少误差, 它可以作为一个有用的指示器,指示你的轨迹的哪些部分可能比其他部分更容易出错.

总结

我们已经讨论了低端全球定位系统(GPS)设备可能出现的一些更常见的全球定位系统(GPS)跟踪错误. 我们提供了对导致它们的原因的理解,以及一些用于纠正它们的地理信息系统编程技术.

在某些情况下,我们可以高度自信地纠正轨道. 在其他情况下,我们至少可以提醒用户注意音轨中出现问题的部分. 在我们不确定的情况下, 总是有选项允许用户自己修复轨道, 借助航空图像和地图. 我们的概率猜测可以帮助突出显示我们检测到错误概率较高的轨道部分.

在很多情况下, 我们概述的技术可以提供令人满意的“80%解决方案”。, 为低端全球定位系统(GPS)设备的用户提供合理水平的自动改进其全球定位系统(GPS)轨迹的精度.

聘请Toptal这方面的专家.
现在雇佣
Tomo克拉伊纳地区

Tomo克拉伊纳地区

验证专家 在工程

毛孔č,克罗地亚

2014年2月5日成为会员

作者简介

Tomo是一个拥有13年以上经验的Java, Android和Golang开发人员. 他曾在电信和银行系统工作.

作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

以前在

infobip

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

Toptal开发者

加入总冠军® 社区.