计算移动设备的实际行驶距离 [已关闭]

2022-09-01 04:30:14

我想计算移动设备(iOS 和 Android)的实际行驶距离。我知道通过谷歌地图API,我们可以找到2个坐标之间的最佳路线距离。但是我想计算距离,实际路径移动(在车辆中)已经覆盖。

我所知道的一个算法是在x秒后保存坐标,比如说在5或10秒之后,然后计算连续坐标之间的距离,总和会给出总距离。

我想讨论一下它的解决方案更好的方法,有没有更好的解决方案?

编辑:像耐克运行应用程序和Uber这样的应用程序如何工作?


答案 1

------------------更新----------------------

你的问题有两个主要观点。

1)获取手机坐标(在此响应的第一部分中已处理)

2)计算这两个坐标之间的实际距离

恕我直言,微积分可以通过Web服务完成:仅基于两个坐标之间的距离进行计算可能会导致真正错误的结果。

下面是此类 Web 服务 https://graphhopper.com/#directions-api

演示应用程序:https://graphhopper.com/api/1/examples/

它基于交通流量(许多此类工具),因此您必须小心坐标的顺序,因为它可能会带来错误的结果。

对于以正确顺序排列的两个点的示例:enter image description here

这给出了一个很好的结果

但是,如果您给出错误的顺序(具有相同的坐标)enter image description here

对于相同的坐标,它可能导致截然不同的结果。

因此,对于坐标ABCD(按chrnological顺序),您需要执行以下操作:

A->B->C C->D

Graphhopper似乎能够做离线距离微积分

这是iOS和Android上的lib

https://github.com/graphhopper/graphhopper-ios/

https://github.com/graphhopper/graphhopper/tree/master/android

---------------------------------------------------

您必须定义应用程序的工作方式。前景还是背景?

正如在其他响应中所说,您必须每X秒获取一次用户位置。然后计算距离。

对于 iOS:

  1. 您可以使用本网站上的信息:http://mobileoop.com/

它讨论了当应用程序处于后台时在iOS上跟踪用户位置。

  1. 这是github:https://github.com/voyage11/Location

然后,您必须将点转换为

CLLocationDistance distance = [aCLLocationA distanceFromLocation:aCLLocationB];

您也可以 https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html 检查此(来自Apple文档):

确保位置管理器的暂停位置自动更新属性设置为“是”。当此属性设置为 YES 时,Core Location 会在有意义时(例如,当用户不太可能移动时)暂停位置更新(并关闭位置硬件)。(核心位置在无法获得位置修复时也会暂停更新。

为位置管理器的 activityType 属性分配适当的值。此属性中的值可帮助位置管理员确定何时可以安全地暂停位置更新。对于提供逐向汽车导航的应用,将该属性设置为 CLActivityTypeAutomotiveNavigation 会导致位置管理器仅在用户在一段时间内未移动明显距离时才暂停事件。

CLActivityTypeAutomotiveNavigation确保您获得一个在路上的位置。

对于安卓系统:

  1. 您可以使用此项目:https://github.com/quentin7b/android-location-tracker

这可以很容易地帮助您在整个时间内获得用户的位置,这要归功于TrackerSettings对象

TrackerSettings settings =
        new TrackerSettings()
            .setUseGPS(true)
            .setUseNetwork(true)
            .setUsePassive(true)
            .setTimeBetweenUpdates(30 * 60 * 1000)
            .setMetersBetweenUpdates(100);
  1. 要在Android上查找两点之间的距离,您可以选中以下内容:获取两个地理点之间的距离

两种操作系统

根据每 X 秒拾取一个位置,您必须减少拾取位置数据之间的时间以提高准确性。

当您要在道路上下文中计算距离时,请在导航模式下设置位置管理器,此模式将为您提供道路上的坐标。

最后

如果你想提高距离微积分的准确性,你可以使用谷歌API:https://developers.google.com/maps/documentation/distance-matrix/intro

通过设置正确的模式参数:

可选参数

mode(默认为驾驶)— 指定计算距离时要使用的运输方式。有效值和其他请求详细信息在本文档的出行模式部分中指定。


答案 2

我正在Andoriod上做类似的事情,但iOS的原理也是一样的:

  1. 对于每个 GPS 样本,请检查其准确性。如果它超过某个阈值(比如20米) - 忽略它。
  2. 请记住,即使移动设备是静态的,不同的GPS样本也会根据精度为您提供不同的位置。一辆汽车在红绿灯下长时间静止不动,将显示您已经前进了几十米,因此请添加一种方法来检测手机是否静态。我通过读取加速度计来实现这一点 - 如果两个读数之间的增量大于某个阈值 - 设备正在移动。如果它太小 - 忽略GPS。
  3. 如果您打算在汽车中使用它,则可以在GPS有新读数时读取GPS(在Android中使用该方法)。如果您将其用于跑步/步行,请注意您的速度很慢 - 两个连续的读数将相对接近,但由于GPS的准确性,您可以在它们之间获得相当大的距离。可以通过增加两个连续读数之间的时间或忽略其中一些读数(即仅考虑每个第10个读数)来修复它。onLocationChanged
  4. 使用哈弗正弦公式计算两个连续读数之间的距离。在Android中,可以使用该方法完成。Location.distanceTo()

您必须根据汽车中的里程表进行测试,并调整加速度计的阈值。


推荐