是否有通用/标准/接受的方式来建模 GPS 实体(航点、轨迹)?

hel*_*ker 5 language-agnostic oop gps data-modeling

这个问题与地理空间信息系统的知识有些重叠,但我认为它属于这里而不是 GIS.StackExchange

有很多应用程序处理具有非常相似对象的 GPS 数据,其中大多数由GPX 标准定义。这些对象将是路线、轨迹、航点等的集合。一些重要的程序,如 GoogleMaps,以 KML 格式或多或少地序列化相同的实体。有许多其他在线地图应用程序(ridewithgps、strava、runkeeper,仅举几例)以不同的方式处理此类数据,但允许或多或少地对数据进行等效的“操作”。这些操作的示例是:

  • 用鼠标直接操作轨迹/轨迹点(包括在地图上绘制);
  • 基于时间和/或距离的合并和拆分;
  • 用 DEM/SRTM 高程替换 GPS 收集的高程;
  • 计算轨道部分的属性(总上升、平均速度、距离、经过的时间);

有一些小型库(如GpxPy)尝试对这些对象及其方法进行建模,以理想情况下允许封装的、可能与语言无关的库/API 的方式。

事实是:这个问题存在的时间足够长,足以让“普遍接受的标准”出现,不是吗?另一方面,大多数 GIS 软件非常专业地面向地理空间分析、地形和制图应用程序,而典型的旅行记录和旅行计划应用程序似乎更面向消费者爱好者,这可能解释了不同的分散方式项目/应用程序处理和建模问题。

因此,考虑到所有所说的,问题是:目前或正在计划中,是否有一种标准方法可以以面向对象的方式对最常用的 GPS/Tracklog 实体及其规范属性和方法进行规范建模?

有 GPX 模式,它非常接近我的想象,但它只包含对象和属性,不包含方法。

任何信息将不胜感激,谢谢!!

小智 4

据我所知,在存储/操作/处理“路由”数据方面,没有标准库、接口,甚至没有一套既定的最佳实践。我们在 Ride with GPS 上为解决这些问题付出了很多努力,我知道解决相关问题的其他网站也可以说同样的事情。我希望有一个标准,并且很乐意与某人合作制定一个标准。

GPX 还不错,而且似乎是一种标准……至少在您开始处理 GPX 文件并发现每个人都同时向该格式添加了自己的自定义扩展来处理心率、踏频、功率等数据之前是这样。此外,没有将路线点与轨迹点关联起来的标准方法。路线的“面包屑路径”表示为一系列 trkpt 元素,而路线点(例如“左转进入第四街”)则表示为一系列单独的 rtept 元素。理想情况下,您希望将给定的航向点与特定的航迹点关联起来,而不是仅仅为航向点提供纬度和经度。如果您的路径在同一条街道上进行多次循环,则可能会导致路线点沿路线的附加位置变得模糊。

KML 和 Garmin 的 TCX 格式与 GPX 类似,各有优缺点。最终这些格式实际上仅用于在程序之间传输数据的目的。它们没有解决如何在程序中表示数据或可以对数据执行什么类型的操作的问题。

We store our track data as an array of objects, with keys corresponding to different attributes such as latitude, longitude, elevation, time from start, distance from start, speed, heart rate, etc. Additionally we store some metadata along the route to specify details about each section. When parsing our array of track points, we use this metadata to split a Route into a series of Segments. Segments can be split, joined, removed, attached, reversed, etc. They also encapsulate the method of trackpoint generation, whether that is by interpolating points along a straight line, or requesting a path representing directions between the endpoints. These methods allow a reasonably straightforward implementation of drag/drop editing and other common manipulations. The Route object can be used to handle operations involving multiple segments. One example is if you have a route composed of segments - some driving directions, straight lines, walking directions, whatever - and want to reverse the route. You can ask each segment to reverse itself, maintaining its settings in the process. At a higher level we use a Map class to wire up the interface, dispatch commands to the Route(s), and keep a series of snapshots or transition functions updated properly for sensible undo/redo support.

路线操纵和生成是目标之一。其他人正在聚合摘要统计数据并构建数据以实现高效的可视化/交互。任何接收数据并生成折线图的系统都在某种程度上解决了这些问题。这里不完全是新领域。路线数据的一个有趣特征是,您通常可以为 x 轴选择两个变量:距起点的时间和距起点的距离。两者都是单调递增的,并且都提供有用但不同的数据解释。查看带有 x 轴距离的海拔图,将显示上下山的自行车骑行是对称的。使用时间的 x 轴,上坡部分相当宽。这不仅仅是在图表上可视化数据,它还转化为您在将数据处理为汇总统计数据时做出的决策。有些加权平均值以时间为基础,有些则以距离为基础。您最终想要的操作是最小值、最大值、加权(基于您选择的独立变量)平均值、过滤点和执行过滤的最小值/最大值/平均值的能力(仅使用您移动的点,忽略异常值等) )、不同的平滑函数(例如,帮助计算总海拔增益)、地图/归约功能的基本概念(我在 20-30 英里/小时之间花费了多少时间等),以及涉及一些插值的固定窗口移动平均值。如果您想确定最快的 10 分钟或最高平均心率的 10 分钟等,则后者是必要的。最后,您将需要一种简单有效的方法来执行您在轨迹点子集上运行的任何计算。

如果您有兴趣,可以在此处查看所有这些操作的示例:http://ridewithgps.com/trips/964148

可以将鼠标悬停在底部的图表上,拖动选择来放大。x 轴有一个在距离/时间之间切换的链接。在底部的左侧边栏上,您将看到最佳 30 秒和 60 秒的努力 - 这些努力是通过固定窗口移动平均值和插值完成的。在右侧边栏上,单击“指标”选项卡。拖动选择以放大图表上的某个部分,您将看到所有指标都会更新以反映您的选择。

乐意回答任何问题,或与任何人合作以某种标准或开放的方式实施其中一些想法。

这可能不是您正在寻找的答案,但我想我会提供一些关于我们如何在 Ride with GPS 中做事的细节,因为我们不知道您似乎正在寻找的任何真正的标准。

谢谢!