个性化阅读
专注于IT技术分析

GPS编程和开发历险记:地理空间教程

本文概述

这一切都始于十多年前的一次前往Žbevnica的徒步旅行。我带着新的GPS, 我的一个朋友将GPS连接到Windows ME手机。这次徒步旅行很棒, 但是当我们回到车上时, 我们惊讶地发现一个GPS声称我们已经走了6.2公里, 而另一个GPS声称已经走了6.7公里。一个声称我们的海拔增加量(即我们远足所有上坡部分的总和)为300m, 而另一个报告为500m。

作为一名程序员(最终是一名GIS程序员), 我立即被这个问题所吸引。我对自己说:”用一个简单的脚本就不那么难解决了。”毕竟, GPS轨迹只是(纬度, 经度, 海拔)形式的元组列表, 对吗?

好吧, 不是真的。

因此, 我开始游览迷人的GPS跟踪, 跟踪错误以及更一般的GIS编程世界。

地理空间信息系统(GIS)是一个庞大而复杂的领域, 包括地图投影和大地测量基准), 栅格和vecto数据处理以及遥感。对该领域的全面介绍将远远超出本文的范围。而且, 由于始终将重点放在特定问题上通常是将自己介绍给新领域的有用方法, 因此, 我将介绍一些我遇到的特定GIS挑战以及一些可能的解决方案;即:

  • 如何识别, 理解和以编程方式纠正GPS跟踪错误
  • 如何从GPS轨道计算和得出其他有用信息

对于初学者来说, GPS轨迹不仅是一系列(纬度, 经度, 海拔)元组。许多启用GPS的设备还将提供时间, 心率等元数据。一些GPS设备甚至会提供有关数据准确性的信息。亦称”精度稀释”。但是, 不幸的是, 大多数GPS设备-尤其是在市场上处于主导地位的低端设备-不会提供此信息, 因此, 我们面临着自行推断设备精度的挑战(并在可能的情况下进行相应的校正) )。

让我们从一种可能的算法开始, 以检测通常具有低质量GPS数据的低端GPS设备(例如大多数智能手机)。

仰角误差和特性

如果你生活在世界的某些地区, 那么当你使用智能手机录制轨迹时, 你可能已经注意到GPS海拔精度的一些奇怪之处。当你检查高程时, 它们始终被记录为比右高程更高或更低(按恒定值)。例如, 我住在克罗地亚的维斯扬(Višnjan), 而我的Android一直告诉我, 我实际上比实际海拔高出35-40米。

例如, 这是我几个月前进行的一次短途徒步旅行的GPS高程图:

该图说明了GIS编程中GPS高程精度的问题。

这里有两件事要注意。

首先, 该设备完全制作了记录的GPS数据第一部分中的”山坡”。该图似乎表明, 我们徒步旅行的最高点距起点仅几百米, 而实际上距此约4公里。

第二, 也许更重要(并且在图表上不可见)的是整个图表都不准确。一直以来, 据报道海拔高度大约比实际高30-40米, 我们将在本文中进一步详细讨论。

当我们检测到轨道存在这些错误时, 可以推断出该设备可能是低质量的GPS。

这些都是廉价GPS设备可能发生的事情。并且, 当我们检测到轨道存在这些错误时, 我们可以推断出该设备可能是低质量的GPS, 因此可以预期这些设备还存在其他错误-而不仅仅是海拔错误。

启动标高错误

GPS设备用于确定海拔高度的技术基本上有两种:” GPS高度”(由GPS卫星系统报告给设备)和”气压高度”(由设备根据气压读数计算得出)。都不是完美的。

GPS高度值可能会有很多小误差(通常在+/- 10m范围内), 如果我们稍后决定计算累积高程增益, 则这尤其成问题。另一方面, 气压高度不仅对高度敏感, 而且对天气条件也很敏感, 这可能会导致其自身的一系列误差。

因此, 某些设备采用混合方法, 即使用气压读数来记录高程, 而使用GPS读数来帮助(重新)校准这些值, 以帮助解决天气(压力)变化等问题。使用此类设备, 在开始跟踪时, 气压高程可能是完全错误的, 但是随后通过使用越来越多的GPS卫星数据对其进行重新校准, 高程数据变得更加可靠。因此, 遇到此类设备的情况并非罕见, 我们会在海拔图上看到”假山”启动错误。

持续的GPS高程不准确

为了解释海拔报告中始终存在的错误, 我们需要返回到小学地理。地理老师通常会解释地球不是一个球体而是一个椭球。如果实际上严格地做到这一点, 高度将很容易通过数学计算。但事实并非如此。地球是不规则的;实际上, 它更像是椭圆形的土豆, 而不是完美的椭圆形, 这意味着对于GIS开发, 你几乎需要针对地球上每个点的详细海拔数据集。在大地测量学中, 该参考椭球体(又称基准面)是一个数学上定义的表面, 它近似于大地水准面(地球的”特鲁尔”图)。

此外, 重要的是要认识到, 即使这些数据也仅是地球表面实际形状的近似值。有些在世界某些地区工作得更好, 而另一些在其他地区工作得更好。例如, 下面的图像(使用我的Ruby库生成)显示了地球与最常用的椭球模型之一(WGS84基准)有何不同。黑色部分代表上方地球的一部分, 白色代表下方地球的理想椭圆体(大陆和岛屿的轮廓以红色显示)。

该图表描述了由用于地理空间和GIS编程的Ruby库生成的地球表面。

你可以看到印度在WGS84椭圆体以下, 南部是绝对最小值(几乎-100米!), 欧洲在其上方。

由于低质量的GPS设备不使用任何此类基准, 因此它们实际上只是在假设完美的椭球体的情况下计算海拔高度。因此, 它们始终存在误差。

检测并纠正GPS高程错误

在GPS应用程序开发中, 可以使用”地球引力模型” EGM2008数据集(有时也称为”类星体起伏”数据集)来检测记录我们轨迹的设备是否存在此类错误。借助EGM2008, 我们可以估算出实际地球表面与理想椭球之间的差异。

使用EGM2008, 我们可以估算实际地球表面与理想椭球之间的差异。

但是要知道我们的GPS轨迹是否存在此错误, 我们还需要一件事-实际海拔。对此有帮助的公共数据库是航天飞机雷达地形任务(SRTM)。 SRTM是一个基于栅格的数据库, 它以大约每30m(在赤道处)的分辨率提供高程值(在美国, 在赤道处), 而在世界其他地区的分辨率为每90m。例如, 当计算上述轨道中的点的SRTM值时, 会出现不同的图形(蓝线):

GPS应用程序开发的绝佳工具是GIS高程值的SRTM数据库。

这里的一个小麻烦是图形的粗糙边缘, 但这很容易平滑。请注意, 通过平滑处理, 我​​们损失的精度几乎没有(如果有的话), 因为SRTM本身仅在等距位置提供离散点, 无论如何我们都需要在这些点之间进行插值。这是前面的图形的一个版本, 上面有红线叠加, 代表平滑的SRTM数据:

这是来自SRTM数据库的平滑GPS高程数据的图表。

顺便说一下, 使用我的GPS Python库可以轻松完成所有这些操作:

  • srtm.py:用于航天飞机雷达地形任务(SRTM)高程数据的python解析器
  • gpxpy:用于解析和处理GPX文件的简单python库(GPX, GPS交换格式, 是用于GPS数据的轻型XML数据格式)

对于Ruby用户, 还有我的Geoelevations.rb解析器库, 用于SRTM和EGM2008波动。

检测到这些异常后, 根据我们使用的软件类型, 我们可以(a)自己自动更正错误, 或者(b)仅仅通知用户在其高程数据中检测到不正确之处。

另外, 由于可以使用不同的算法以编程方式校正这些GPS高程误差, 因此我们可能希望为用户提供选择采用哪种算法的选项(例如, 用户是否希望我们仅使用平滑的SRTM数据用户”按原样”还是希望我们使用SRTM数据来帮助更正设备报告的海拔高度)。

平滑轨道并消除异常值

如果足球运动员要佩戴GPS设备并记录比赛情况, 那么结果将是一团糟。比赛场地将密集地铺满赛道, 赛道包括许多急转弯, 加速和减速。

幸运的是, 大多数使用GPS的人不会具有相同的模式-GPS轨迹线(和加速度)将相对平滑。在这种情况下, 我们的轨迹中的不稳定点可以被认为是由误差引起的, 因此可以使用平滑功能合理地消除这些异常值。

作为GIS开发人员, 最常见的平滑方法是遍历各个点并根据相邻坐标的值更改坐标。例如, 我们可以使用以下算法来更改每个纬度和经度:

points[n].latitude = points[n-1].latitude * 0.3 + points[n].latitude * .4 + points[n+1].latitude * .3
points[n].longitude = points[n-1].longitude * 0.3 + points[n].longitude * .4 + points[n+1].longitude * .3

系数越大, 对应的相邻点对当前点的修改位置的影响越大。在此示例中, 我使用的系数(0.3、0.4、0.3)有点严格, 但在大多数情况下, 你希望它们的总和等于1.0。 (例如, 一种更复杂的方法是使用点之间的距离, 然后, 点越近, 对应的系数就越大。)

这是带有许多随机错误的轨道示例:

GIS开发中最大的GPS跟踪挑战之一是具有大量随机错误的跟踪。

请注意, 轨道的走线方式不太好, 有很多急弯的锯齿状转弯, 有时甚至完全偏离了预期的路径。

经过几次”平滑”迭代后, 该轨道被转换为:

消除跟踪误差后,此程序中的GPS跟踪仍然不完美,但效果更好。

尽管效果好得多, 但它仍然是不完美的。请注意, 在某些地方(尤其是在路径的中间), 轨道仍会偏离道路。

你还可以尝试其他方法。在某些地区, 对于某些GPS应用程序, 你还可以使用OpenStreetMap(OSM)数据来尝试猜测正确的路径, 然后将点”捕捉”到此新行。尽管这通常会有所帮助, 但也可能是不完美的, 例如在OSM数据包含两条平行线(例如高速公路和附近道路)或许多闭合路径的情况下。

如果我们可以推断出这条路线是远足路线, 并且可以选择紧贴高速公路或附近的道路, 那么我们可以安全地假设远足是沿着道路而不是高速公路。

在这种情况下, 一种可能的解决方案是尝试使用本文中进一步讨论的一些技术来检测活动的类型。例如, 如果我们可以推断出这条路线是远足路线, 并且可以选择捕捉到高速公路或附近的道路, 那么我们可以安全地假设远足是沿着道路而不是高速公路。

还应注意, 尽管该示例说明了表面坐标(即经度/纬度)的平滑, 但是平滑可以是消除海拔或时间数据甚至心率和自行车踏频数据中的像差的同等有效技术。

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

  • 计算总高程增益。要计算轨道中的总高程增益, 仅将所有小的”跳跃”加总起来是不够的, 因为它们通常会包含小的误差。在进行总和之前先对高程进行平滑处理通常可以缓解此问题。
  • 离群值删除。在”平滑”之后, 可以更容易地检测到距离轨道太远的点。然后通常可以将这些假定为离群值, 并提示用户询问是否应将其删除。

该算法无法解决的问题是:在某些情况下, GPS将记录一条平滑的路径, 但是该路径将在某个方向上以恒定的差值”移动”。在这种情况下, 平滑处理可能会进一步平滑线条, 但无法纠正此移位错误。

我们所描述的简单化平滑技术的另一个不那么明显但重要的问题是, 变换会修改路径中的所有(或几乎所有)点, 即使这些点可能没有错误。尽管对于一般的GPS用户而言, 这种更简单的方法往往是一个合理的解决方案, 但是在GIS编程中当然可以采用更复杂的平滑算法。在某些情况下, 根据用户, 设备和应用程序的不同, 仅删除异常值而不进行任何平滑甚至会更好。

检测最大速度

如果我们具有路线上所有点的坐标和时间戳, 则检测轨道的最大速度非常简单。只需计算点之间的速度并找到最大值即可。似乎很简单。

但是请记住, 我们正在使用低端GPS设备, 我们并不完全信任数据, 这可能会对我们的计算产生重大影响。如果设备每5米记录一次位置, 并且在某个点上将该点错开10米就犯了一个错误, 那么该轨道的该部分可能比原来快3倍!

GIS开发领域中的一种常见方法是提取点之间的所有速度, 然后只删除最高的5%(即使用第95个百分位数), 希望消除的5%代表了大多数误差。但这是不科学的, 不能确保正确的结果。在尝试这项技术的过程中, 我尝试使用不同的百分数值, 发现有些值对于一种GPS设备效果很好, 有些则对其他GPS设备效果很好。有些适合远足, 而另一些适合骑自行车。但是在大多数情况下, 结果对我来说并不正确。

在尝试了许多算法之后, 对我有用的方法很简单:添加另一个过滤器以消除极端现象, 不仅按速度, 而且按距离, 如下所示:

  1. 按邻居之间的距离对点进行排序, 然后删除最上面的5%。
  2. (可选:)平滑轨道(水平和/或垂直)。
  3. 按邻居之间的速度对点进行排序, 然后删除最高的5%。

即使对于来自廉价GPS设备且具有随机错误的轨迹, 该算法也能产生相当可信的结果。

根据我的经验, 即使对于来自廉价GPS设备且具有随机误差的轨迹, 该算法也能产生相当可信的结果。

推导活动类型

在许多情况下, 平均速度足以确定活动类型。例如, 如果平均速度为5kmh, 则可能是步行/远足径, 而如果平均速度为30kmh, 则可能为自行车道, 依此类推。

但是, 如果平均速度为12公里/小时, 则无法确定用户是骑山地车还是跑步。在这种情况下, 最大速度有时可以帮助区分两种类型的活动。具体来说, 我们可以利用这样一个事实, 即跑步者很少会达到平均速度的两倍以上, 而骑自行车的人却经常这样做(例如, 在不太具有挑战性的道路上下坡)。

因此, 在跑步时可能会记录平均速度为12kmh且最大速度为18kmh的轨道, 而在山地自行车时可能会记录平均速度为12kmh且最大速度为30kmh的轨道。 (当然, 我们必须确保我们计算出的最大速度是正确的, 以便可靠地工作。)

可见天空的百分比:GPS错误检测的灵巧代理

每个GPS测量的精度(即纬度, 经度和海拔)在很大程度上取决于录制时可见的卫星数量。因此, 如果我们能以某种方式确定每次记录时”查看”了多少颗卫星, 我们可以将其用作近似记录准确性的一种方式。例如, 如果我们以某种方式知道所有需要的GPS卫星都在视线范围内, 那么我们可以假设相应GPS数据的准确性很高。相反, 如果我们以某种方式知道没有GPS卫星在视线中, 则可以假定数据容易出错。

但是, 在你太兴奋之前, 请考虑尝试解决此类GIS问题的复杂性。首先, 你需要知道你的设备能够与哪个GPS卫星系统进行通信。原来是美国的全球定位系统, 欧洲的伽利略系统和俄罗斯的GLONASS系统。某些设备可以与所有这些卫星类型一起使用, 但许多设备则不能。而且许多设备甚至都没有报告它们使用的系统。

但是, 有一种巧妙的方法可以避免这种复杂性, 并且可以大致估算出所看到的卫星数量:使用可见天空的百分比作为可见卫星数量的替代。更少可见的天空意味着我们的GPS可以通过更少的卫星”看到”(或看到)。但是, 我们如何计算地球上任何一点的可见天空的百分比?解决方案实际上非常简单:我们可以使用前面讨论的SRTM数据来计算周围的地平线。

例如, 如果你位于使用SRTM计算的贝娄谷特里格拉夫峰(斯洛文尼亚的最高峰)中, 则这是地平线:

使用GIS代码创建的Triglav下的山谷地平线的图像。

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

从中心点看, 该图像基本上由等距的高程图图层组成。蓝色区域越深, 海拔层越远;反之, 蓝色区域越亮, 海拔层越近。绘制的最高点代表地平线。如果GPS卫星在天空的下方, 则我们的设备可能看不到它。 (不过请注意, 尽管将图像绘制为扁平矩形, 但实际上, 你将需要一些球形几何知识, 才能正确计算地平线以下的区域。)

在山区远足等情况下, 此方法可能会很有用, 你可能会从深峡谷中(GPS接收效果较差)到山脊处(接收效果更好)。这可以作为有用的指示符, 指示曲目的哪些部分可能更容易出错。

要记住的另一件事是, 这并不是检测GPS高程错误的灵丹妙药。首先, 地球的大部分地区都不是山区, 即使在山区, 高估海拔也是我们的心理。在绝大多数居住区中, 可见天空的实际百分比大于75%。但是, 尽管如此, 这种方法在某些情况下还是有用的, 例如在山间徒步旅行时, 你可能会从深峡谷中(GPS接收效果较差)变为山脊(卫星接收效果可能会更好)。尽管此方法并不是绝对的衡量轨道错误的方法, 但它可以有效指示轨道的哪些部分比其他部分更容易出错。

本文总结

我们已经讨论了低端GPS设备可能会遇到的一些更常见的GPS跟踪错误类型。我们提供了导致它们的原因的理解, 以及一些用于纠正它们的GIS编程技术。

在某些情况下, 我们可以高度自信地纠正轨道。在其他情况下, 我们至少可以提醒用户注意出现问题的轨道部分。在我们不确定的情况下, 总是可以选择使用户自己修复航迹, 并借助航空影像和地图。我们的概率猜测可以帮助突出显示我们发现错误可能性更高的轨道部分。

在许多情况下, 我们概述的技术可以成为令人满意的” 80%解决方案”, 为低端GPS设备的用户提供合理水平的自动提高其GPS航迹精度的功能。

赞(0)
未经允许不得转载:srcmini » GPS编程和开发历险记:地理空间教程

评论 抢沙发

评论前必须登录!