计算移动设备的实际行驶距离 [已关闭]
我想计算移动设备(iOS 和 Android)的实际行驶距离。我知道通过谷歌地图API,我们可以找到2个坐标之间的最佳路线距离。但是我想计算距离,实际路径移动(在车辆中)已经覆盖。
我所知道的一个算法是在x秒后保存坐标,比如说在5或10秒之后,然后计算连续坐标之间的距离,总和会给出总距离。
我想讨论一下它的解决方案更好的方法,有没有更好的解决方案?
编辑:像耐克运行应用程序和Uber这样的应用程序如何工作?
我想计算移动设备(iOS 和 Android)的实际行驶距离。我知道通过谷歌地图API,我们可以找到2个坐标之间的最佳路线距离。但是我想计算距离,实际路径移动(在车辆中)已经覆盖。
我所知道的一个算法是在x秒后保存坐标,比如说在5或10秒之后,然后计算连续坐标之间的距离,总和会给出总距离。
我想讨论一下它的解决方案更好的方法,有没有更好的解决方案?
编辑:像耐克运行应用程序和Uber这样的应用程序如何工作?
------------------更新----------------------
你的问题有两个主要观点。
1)获取手机坐标(在此响应的第一部分中已处理)
2)计算这两个坐标之间的实际距离
恕我直言,微积分可以通过Web服务完成:仅基于两个坐标之间的距离进行计算可能会导致真正错误的结果。
下面是此类 Web 服务 https://graphhopper.com/#directions-api
演示应用程序:https://graphhopper.com/api/1/examples/
它基于交通流量(许多此类工具),因此您必须小心坐标的顺序,因为它可能会带来错误的结果。
这给出了一个很好的结果
对于相同的坐标,它可能导致截然不同的结果。
因此,对于坐标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:
它讨论了当应用程序处于后台时在iOS上跟踪用户位置。
然后,您必须将点转换为
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确保您获得一个在路上的位置。
对于安卓系统:
这可以很容易地帮助您在整个时间内获得用户的位置,这要归功于TrackerSettings对象
TrackerSettings settings =
new TrackerSettings()
.setUseGPS(true)
.setUseNetwork(true)
.setUsePassive(true)
.setTimeBetweenUpdates(30 * 60 * 1000)
.setMetersBetweenUpdates(100);
两种操作系统
根据每 X 秒拾取一个位置,您必须减少拾取位置数据之间的时间以提高准确性。
当您要在道路上下文中计算距离时,请在导航模式下设置位置管理器,此模式将为您提供道路上的坐标。
最后
如果你想提高距离微积分的准确性,你可以使用谷歌API:https://developers.google.com/maps/documentation/distance-matrix/intro
通过设置正确的模式参数:
可选参数
mode(默认为驾驶)— 指定计算距离时要使用的运输方式。有效值和其他请求详细信息在本文档的出行模式部分中指定。
我正在Andoriod上做类似的事情,但iOS的原理也是一样的:
onLocationChanged
Location.distanceTo()
您必须根据汽车中的里程表进行测试,并调整加速度计的阈值。