我想计算移动(iOS和Android)的实际行进距离.我知道通过谷歌地图API,我们可以找到2个坐标之间的最佳路线距离.但我想计算距离,实际路径移动(在车辆中)已覆盖.
我知道的一个Algo是在x秒后保存坐标,比如在5或10秒后,然后计算连续坐标之间的距离,总和将给出总距离.
我想讨论其解决方案的更好方法,有没有更好的解决方案?
编辑:像耐克运行应用程序和优步的应用程序如何工作?
------------------ 更新 ----------------------
你的问题有两个重点.
1)获取电话坐标(已在此响应的第一部分处理)
2)计算这两个坐标之间的实际距离
恕我直言,微积分可以通过网络服务完成:仅基于两个坐标之间距离的计算可能导致真正错误的结果.
这是一个这样的Web服务的例子 https://graphhopper.com/#directions-api
演示应用程序:https://graphhopper.com/api/1/examples/
它基于交通流量(这些工具很多)所以你必须小心坐标的顺序,因为它可能带来错误的结果.
例如,正确的顺序是两点:
这给出了很好的结果
但是如果你给错了订单(使用相同的坐标)
对于相同的坐标,它可能导致极其不同的结果.
因此,对于坐标ABCD(按照时间顺序),您需要执行以下操作:
A-> B B-> C C-> D.
Graphhopper似乎能够进行离线距离演算
这是iOS和Android上的lib
https://github.com/graphhopper/graphhopper-ios/
https://github.com/graphhopper/graphhopper/tree/master/android
-------------------------------------------------- -
您必须定义应用的工作方式.前景或背景?
如其他回复中所述,您必须每隔X秒获取一次用户位置.然后计算距离.
对于iOS:
您可以使用本网站上的信息:http://mobileoop.com/
它讨论了当应用程序处于后台时跟踪iOS上的用户位置.
这是github:https://github.com/voyage11/Location
然后你必须转换点,谢谢
CLLocationDistance distance = [aCLLocationA distanceFromLocation:aCLLocationB];
您也可以查看(来自Apple doc)https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html:
确保位置管理器的pausesLocationUpdatesAutomatically属性设置为YES.当此属性设置为YES时,只要有意义,Core Location就会暂停位置更新(并关闭位置硬件),例如当用户不太可能正在移动时.(核心位置在无法获取位置修复时也会暂停更新.)
为位置管理器的activityType属性分配适当的值.此属性中的值有助于位置管理员确定何时可以安全地暂停位置更新.对于提供逐向导航汽车导航的应用程序,将属性设置为CLActivityTypeAutomotiveNavigation会导致位置管理器仅在用户未在一段时间内移动较长距离时暂停事件.
CLActivityTypeAutomotiveNavigation确保您获得在路上的位置.
对于Android:
您可以使用此项目:https: //github.com/quentin7b/android-location-tracker
借助TrackerSettings对象,这可以轻松帮助您获得用户的位置
TrackerSettings settings = new TrackerSettings() .setUseGPS(true) .setUseNetwork(true) .setUsePassive(true) .setTimeBetweenUpdates(30 * 60 * 1000) .setMetersBetweenUpdates(100);
要查找Android上两点之间的距离,您可以检查: 获取两个地理点之间的距离
两个OS
根据每X秒拾取一次的位置,您必须缩短选择位置数据之间的时间,以提高准确性.
由于您要计算道路环境中的距离,请在导航模式下设置位置管理器,此模式为您提供在路上的坐标.
最后
如果您想提高距离演算的准确性,可以使用Google API:https: //developers.google.com/maps/documentation/distance-matrix/intro
通过设置正确的模式参数:
可选参数
mode(默认为Driving) - 指定计算距离时要使用的传输模式.有效值和其他请求详细信息在本文档的"旅行模式"部分中指定.
我在Andoriod上做类似的事情,但iOS的主要内容也是如此:
对于每个GPS样本,请检查其准确性.如果超过某个阈值(比如20米) - 忽略它.
请记住,即使移动设备是静态的,根据准确性,不同的GPS样本也会为您提供不同的位置.一辆车在红绿灯处静止很长时间,会显示你已经推进了几十米,所以添加一种方法来检测手机是否静止.我通过读取加速度计实现了这一点 - 如果两个读数之间的差值大于某个阈值 - 设备正在移动.如果它太小 - 忽略GPS.
如果您打算在汽车中使用它,只要有新的读数,您就可以阅读GPS(在Android中使用该onLocationChanged
方法).如果你将它用于跑步/步行,请考虑到你的速度很慢 - 两个连续的读数将相对接近,但由于GPS的准确性,你可以获得相当大的距离.它可以通过增加两个连续读数之间的时间来固定,或者通过忽略其中一些读数来固定(即仅考虑每个第10次读数).
使用Haversine公式计算两个连续读数之间的距离.在Android中,可以使用该Location.distanceTo()
方法完成.
您必须根据汽车里程表对其进行测试,并调整加速度计的阈值.
通过以下策略的组合,您可以获得更高的准确性.
如其他答案中所述,您可以使用GPS 每X秒(例如10秒)存储移动设备的位置,并测量点之间的连续时间.
此外,当用户快速转弯时,请务必使用磁传感器值读取,因此在这种情况下,请将"位置存储之间的时间"减少到1-2秒(精度需要)
最后一步,使用地图数据(例如Google地图等)确保正确跟踪(如果在路上).
然后总结所有值以获得准确的距离.
PS我只提供了有关策略的信息,因为我不确定它在Android(或iOS)中的实现.
希望这可以帮助 :)
4年前,我刚刚创建了一个名为Landsurvayor的应用程序,用于计算Google Map上绘制的两个地理点的实际距离.我不知道这可能对您有所帮助,但有一个名为Haversine公式的公式可以计算两个地理点之间的实际距离.您可以尝试一下,看看它是否对您有用.以下是Haversine公式的示例代码:
public double CalculationByDistance(double initialLat, double initialLong, double finalLat, double finalLong){ int R = 6371; // km double dLat = toRadians(finalLat-initialLat); double dLon = toRadians(finalLong-initialLong); lat1 = toRadians(lat1); lat2 = toRadians(lat2); double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); return R * c; } public double toRadians(deg) { return deg * (Math.PI/180) }
有关Haversine公式的更多信息:https://en.wikipedia.org/wiki/Haversine_formula
还有另一个简单的Android SDK内置方法来计算两个lat之间的距离,lng:
Location locationA = new Location("point A"); locationA.setLatitude(latA); locationA.setLongitude(lngA); Location locationB = new Location("point B"); locationB.setLatitude(latB); LocationB.setLongitude(lngB); distance = locationA.distanceTo(locationB) ;
我希望它可以帮助你.