从 GPS 读数更新折线轨迹的更好方法

Posted

技术标签:

【中文标题】从 GPS 读数更新折线轨迹的更好方法【英文标题】:Better way to update PolyLine track from GPS readings 【发布时间】:2016-12-13 12:27:47 【问题描述】:

在我的应用程序中,我有一个Service,它接收位置更新并将它们存储到数据库中。我还有一个Fragment,它显示数据库中所有记录的航点的MapViewPolyLine

在录制过程中,Service 会通知Fragment 新的航点,以便Fragment 可以更新PolyLine。问题是当用户离开应用程序时,应用程序Service 会一直记录到数据库的航点,但现在Fragment 没有得到更新,因为Fragment 已暂停。所以在onResume我新建了一个PolyLine,读取数据库中的所有航点并将它们添加到数据库中。

这一切都很好,但从性能的角度来看,创建一个新的PolyLine 并重新添加所有航点(可能有数千个!)并不是最佳选择。我想我可以重新添加尚未在PolyLine 中的任何新航点,但我想看看这里是否有人有替代解决方案?有没有办法让Fragment“活着”并更新它的PolyLine,即使应用程序在后台(只要服务正在运行)?或者有更好的方法吗?

【问题讨论】:

【参考方案1】:

重新创建折线可能是不可避免的,但如果性能成为问题,您应该考虑以下几点:

设置时间限制。重新创建折线时,仅获取最后一小时或一天的数据(测试,您将能够在此处确定最佳值),并提供一个选项延长该期限。这将使用户更了解数据需要一些时间来加载,并且应用程序将使用更多资源。

在保存数据的同时汇总数据。这应该会减少用于保存数据库中的点的磁盘空间(对于低端设备非常重要)并提高重建活动时的性能。这些是您可以采取哪些措施来减少数量的一些提示:

    检查后面的 2 个点,看看它们是否是一条直线。如果是这样,删除中间的。这应该会删除用户在车内或长途步行时记录的大量数据 检查最后一组点(5个或更多)是否在同一个区域,这样可以去掉很多数据。因此,如果用户只是在家中或工作场所散步,您只需为此节省一分,而不会丢失太多数据,这在大多数 (99%) 应用程序中应该不是问题。

【讨论】:

谢谢,这是一些很好的建议!当我注册我的位置更新监听器时,我已经在做#2(默认为 10m 最小距离)。直线检测是一个不错的方法,但不知道如何实现它 - 它需要某种容忍度...... @BadCash 我可以想到几种方法来实现这一目标。我能想到的最好的方法是计算中间点到由两个周围点创建的线的距离,并检查它是否小于您需要的误差范围确定的某个值。 再次感谢 :) 是的,这将是一种方法。我有另一个想法 - 如果我将 AmB 的路径长度(m = 中点)与直线路径 AB 的长度进行比较,如果第一个路径比直线路径在一定的公差范围内(长),它能算直吗? @BadCash 是的,这真是个好主意。顺便说一句,需要注意的是远距离角度的缓慢变化,例如高速公路上的缓慢转弯或其他东西(这也适用于我上面的解决方案)。如果发生这种情况,算法将通过认为错误是可以接受的而不是因为删除前一点引起的雪崩效应来聚合数据。因此,我还将添加点 A 和 B 之间的距离作为决定容错性的一个因素(点之间的长距离应该有较低的聚合机会)

以上是关于从 GPS 读数更新折线轨迹的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

GPS轨迹数据集免费下载资源整理

使用python计算从gps轨迹点行进的距离[关闭]

Python + Mapnik:关于如何渲染带有 gps 轨迹的地图的示例

GPS怎样进行轨迹回放

GPS定位器的行车轨迹回放可以查看多久之前的?

高德地图轨迹展示