有没有一种通用/标准/公认的方式来建模GPS实体(航点、轨迹)?

5
这个问题与地理空间信息系统的知识有所重叠,但我认为它属于这里而不是GIS.StackExchange。
目前有许多应用程序处理GPS数据,并使用GPX标准定义了大量非常相似的对象。这些对象包括路线、轨迹、航点等。一些重要的程序(如GoogleMaps)以KML格式序列化了更多或更少相同的实体。还有许多其他在线地图应用程序(例如ridewithgps、strava、runkeeper等),它们以不同的方式处理此类数据,但允许进行更多或更少等效的“操作”。这些操作的示例包括:
  • 使用鼠标直接操作轨迹/轨迹点(包括在地图上绘制);
  • 基于时间和/或距离合并和分割;
  • 用DEM/SRTM高程替换GPS采集的高程;
  • 计算轨迹部分的属性(总上升、平均速度、距离、经过时间等);
有一些小型库(例如GpxPy)试图以理想的方式对这些对象及其方法进行建模,从而允许封装、可能是语言无关的库/API。
事实是:这个问题已经存在了很长时间,是否已经出现了“通用公认标准”呢?另一方面,大多数GIS软件非常专业化,面向地理空间分析、地形和制图应用,而典型的旅行记录和旅行规划应用似乎更偏向于消费者爱好者,这可能解释了不同项目/应用程序处理和建模问题的相当分散的方式。
因此,考虑到所有已经说过的事情,问题是:目前或计划中是否有一种标准的方式来以面向对象的方式规范地建模最常用的GPS/Tracklog实体及其规范属性和方法?
有GPX模式,它非常接近我所想象的,但它只包含对象和属性,没有方法。
任何信息将非常感激,谢谢!

为什么要用SRTM替换GPS高程? - Seth
1
@Seth 这是一种相当常见的操作,存在于一些桌面和在线应用程序中。有时,由于接收因素(天空可见性、天气、植被、干扰),所注册的高度比轨迹的(公开可用的)数字高程模型(DEM)不可靠得多。此外,有时您手动绘制轨迹,因此您的轨迹点尚未具有高度,然后您可以使用某些高度服务(例如Google Elevation API)插入它们。 - heltonbiker
有道理,我以为你是用SRTM替换卫星获取的高程。 - Seth
@Seth 至少有一个网络服务(STRAVA)可以在轨迹中检测到不良的高程接收,并提供用 DEM 数据替换的选项。 - heltonbiker
1
我在GIS StackExchange上问了一个类似的问题。没有最佳答案,但有一些有用的线索:http://gis.stackexchange.com/questions/23464/is-there-a-good-gps-track-analysis-library - Nelson
@Nelson,你的链接问题像镜子一样反映了我的感受。如果我有一些消息,我会尝试从你的博客联系你!此外,在RideWithGPS客户支持论坛上正在进行一场很好的讨论:https://ridewithgps.zendesk.com/forums/21035931-feature-requests - heltonbiker
2个回答

4
据我所知,在存储/操作/处理“路线”数据方面,没有标准库、接口或甚至已经建立的最佳实践。我们在Ride with GPS上花费了很多精力解决这些问题,我相信其他解决相关问题的网站也是如此。我希望有一个标准,并且很愿意与他人合作制定一个标准。
GPX还可以,并且似乎是一种标准...至少在你开始处理GPX文件并发现每个人都同时添加了自己的自定义扩展格式来处理数据(例如心率、踏频、功率等)之前。此外,没有一种标准的方法将路由点与轨迹点关联起来。你的路径的“面包屑路径”表示为一系列trkpt元素,而课程点(例如“向左转到第四街”)则表示为一系列rtept元素。理想情况下,你希望将给定的课程点与特定的轨迹点关联起来,而不仅仅是给课程点一个纬度和经度。如果你的路径在同一条街道上进行了几次循环,就会在哪里沿着路径附加课程点引入一些歧义。
KML和Garmin的TCX格式类似于GPX,具有各自的优缺点。最终,这些格式只能用于在程序之间传输数据。它们没有解决如何在你的程序中表示数据或可以对数据执行哪些类型的操作的问题。
我们将轨迹数据存储为对象数组,其中键对应不同属性,如纬度、经度、海拔高度、从起点开始的时间、距离、速度、心率等。此外,我们还存储了一些元数据以指定有关每个部分的详细信息。在解析我们的轨迹点数组时,我们使用此元数据将路线拆分为一系列段。段可以拆分、连接、删除、附加、反转等。它们还封装了轨迹点生成的方法,无论是沿着直线插值点还是请求表示端点之间方向的路径。这些方法允许相当简单的实现拖放编辑和其他常见操作。Route对象可用于处理涉及多个段的操作。例如,如果你有一个由段组成的路线-一些驾驶方向、直线、步行方向等-并且想要翻转路线,你可以要求每个段反转自己,在此过程中保持其设置。在更高级别上,我们使用Map类连接接口、分派命令到Route(s),并保持一系列快照或转换函数适当更新以支持合理的撤消/重做支持。
路由操纵和生成是其中之一的目标。另外一个目标是聚合汇总统计数据并构建数据以进行高效的可视化/交互。这些问题在任何接收数据并生成折线图的系统中都已经得到了一定程度的解决。这里并不是新领域。路径数据的一个有趣特征是,你通常会有两个变量可供选择作为x轴:起始时间和起始距离。两者都是单调递增的,并且都提供有用但不同的数据解释。使用距离作为x轴查看海拔的图表将显示一个上下起伏的自行车骑行路线对称。使用时间作为x轴,上坡部分则显得更宽。这不仅仅是关于在图表上可视化数据,它也转化为你在处理数据成汇总统计数据时所做的决策。有些加权平均值是基于时间的,有些是基于距离的。你最终需要的操作包括最小值、最大值、基于你选择的自变量的加权(average),过滤点并执行过滤的最小/最大/平均值(仅使用你在移动时的点,忽略异常值等),不同的平滑功能(例如辅助计算总爬升高度),基本的映射/减少功能概念(我在20-30mph之间花了多少时间等),以及涉及某些插值的固定窗口移动平均值。如果你想识别你最快的10分钟或平均心率最高的10分钟等,后者是必要的。最后,你会需要一种简单而有效的方法来执行你正在运行的轨迹点子集上的任何计算。
如果您感兴趣,可以在此处查看所有这些内容的示例:http://ridewithgps.com/trips/964148 底部的图表可以用鼠标悬停,拖动选择进行缩放。x轴有一个链接,可在距离/时间之间切换。在左侧边栏底部,您将看到最佳30和60秒努力 - 这些是使用插值的固定窗口移动平均值完成的。在右侧边栏中,单击“指标”选项卡。拖动选择以放大图表中的某个部分,您将看到所有指标都会更新以反映您的选择。
很乐意回答任何问题,或与任何人合作制定一些标准或开放实现这些想法的方式。
这可能不完全是您寻找的答案,但我们在Ride with GPS中如何处理事情的细节可能会有所帮助,因为我们不知道任何真正的标准,就像您似乎正在寻找的那样。
谢谢!

1
很重要的一点是,我是一个铁杆骑行爱好者,最开始使用手绘地形图纸进行自行车越野旅行,然后通过GPS辅助骑行找到“路线”,接着是Google Earth和Google Maps辅助骑行(通过脚本创建方向),因此我想说,你们在RideWithGPS上的工作真是开创性的。目前没有任何其他产品可以比得上它全面的功能。正如这里所看到的,骑行爱好者们都非常喜欢它:http://bicycles.stackexchange.com/a/12777/2355 - heltonbiker
此外,这个问题基本上传达了我的感受,我相信也传达了你的感受。发帖人可能是一个不错的交流对象:http://gis.stackexchange.com/q/23464/8254 - heltonbiker
非常感谢提供的链接,我会在那里进行评论。我们还使用自己定制的方法快速读取DEM中的高程(用于路线规划和替换具有错误数据的骑行高程)。使用库的唯一问题是需要选择一种语言。我们大多数情况下使用JavaScript,因为它可以在浏览器中运行,而且我们还可以在服务器上运行相同的代码库,以确保获得平均速度、总距离等摘要统计信息的相同结果。 - Zack Ham
我想你会使用Javascript(我使用Python)。我最近与自己达成的协议是创建一个独立于语言的GPS_Objects API(目前仅供个人使用,未来计划在GitHub上发布)。然后,Track.simplify(tolerance)Track.join_tracksegments()在Python或Javascript中调用时将具有完全相同的签名和相同的效果。然后,(理想的,柏拉图式的,规范化的)API可以被编程到任何面向对象的语言中,而不是在某种任意的语言中。 - heltonbiker
我觉得这听起来很棒。即使你只是想找个人来交流想法或者寻求反馈,我也很愿意参与其中。我的Github账号是zackham,邮箱是zack@ridewithgps.com - Zack Ham
我发现了一些关于ISO发布的规范文件的有趣资料,看看我的回答吧! - heltonbiker

1
经过深入研究,我觉得有义务为记录和帮助未来寻找相关信息的人提到两个实体在该主题上所做的几乎详尽的工作:ISO和OGC。
从国际标准化组织(ISO)来看,“TC 211 - 地理信息/测绘学”部分几乎包含了所有内容。
从开放地理空间联盟(OGC)来看,他们的摘要规范非常广泛,既是ISO的冗余补充,又是互补的。
我不确定它是否包含与所提出的应用程序(GPS轨迹和航点分析和操作)相关的对象方法,但这些文件中包含的核心概念相当坚实。UML是他们选择的模式表示法。

ISO 6709是一个规范,用于指定在数据交换中使用的坐标表示,包括纬度和经度。此外,它还指定了使用除纬度和经度之外的坐标类型来表示水平点位置。它还指定了可以与水平坐标相关联的高度和深度的表示方法。表示包括度量单位和坐标顺序。

ISO 19107规定了描述地理要素空间特征的概念模式以及与这些模式一致的一组空间操作。它处理向量几何和拓扑,最多三个维度。它定义了标准的空间操作,用于访问、查询、管理、处理和交换嵌入到最多三个轴的坐标空间中的最多三个拓扑维度的空间(几何和拓扑)对象的地理信息数据。


如果我发现了新的内容,我会回来编辑这篇文章,并在可能的情况下添加链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接