如何在android中行走时计算距离?
Posted
技术标签:
【中文标题】如何在android中行走时计算距离?【英文标题】:how to calculate distance while walking in android? 【发布时间】:2014-04-13 02:39:15 【问题描述】:我正在为我的应用开发一个演示,其中有两个按钮,分别命名为“开始”和“停止”。当用户点击“开始”时,他将开始行走。我想要做的是,当用户点击“STOP”时,演示将计算他在“START”和“STOP”之间的距离。如果用户按“开始”并按“停止”而没有采取任何步骤,则它必须显示 0km 或 0m。我不知道我应该如何开始这个;请提出建议。
【问题讨论】:
【参考方案1】:在您的应用中请求 GPS 权限。点击开始时,记录 GPS 坐标。停止同样做。你现在有两个坐标。然后,您可以应用距离公式来获得总行驶距离。
编辑:
至于 cmets 中澄清的案例,我认为您需要研究的是 android 的motion sensors。您可能需要做出很多假设或要求您的用户在实际使用之前校准您的应用。
假设您知道用户的步速因素。使用运动传感器,计算用户“走路”的时间(显然,没有简单的方法来确定您的用户是真的在走路还是只是在摇晃手机)。将其与用户的步速因子相乘,您就可以大致了解用户完成了多少步行。
【讨论】:
GPS 是否足够准确,可以跟踪几英尺的距离。 感谢 skytreader,我也想过这样做,但问题是,如果我从 A 点开始并在步行 3 公里后在 A 点结束,那么我的起点和终点坐标将相同并且它会返回应用距离公式我 0 公里 我没有做过很多 GPS 编程,但是 AFAIK,这取决于 很多 因素。准确度主要取决于手机的硬件本身以及您使用的 GPS 服务/卫星。 @rahul 对于您所描述的情况,您可以合理地处理它。每当用户移动时,您都可以获得位置,并尝试为每次位置变化重新计算距离,而不是计算开始和结束时的距离。当用户按下停止时,您应该停止计算距离。 @Gaurav 谢谢,这似乎是我的问题的解决方案【参考方案2】:尝试为此使用传感器,我认为您不应该使用 GPS,因为它可能不太准确。 请参阅以下开源计步器项目了解您所说的内容。
Pedometer library
如果您想使用传感器,将使用更多指定代码更新此答案。
【讨论】:
恰恰相反,使用传感器测量距离是极其不准确的。使用 GPS 会更好……当然! 实际上我看到以下应用程序对我有用。 play.google.com/store/apps/details?id=de.j4velin.pedometer @Merlevede 我通过 gps 和网络提供商几次。但碰巧它给出的结果非常不准确。所以我在通过几个计步器应用程序后建议使用传感器。我想听听你的意见关于这个。 我在下面阅读了 Navjot 的回答,我认为这些应用程序使用传感器来检测基于脉冲或峰值的一步。这可能是可行的。另一方面,我谈到了使用纯加速器数据测量距离的几次尝试,但事实证明它非常不准确。检查here 和here @HarshalBenake:在最新的 API 19 (KitKat 4.4) 中添加了步进传感器。而且我不确定是否完成了反向移植。在这种情况下,使用此功能的应用程序只能在具有最新 API 的设备上运行(特别是 Nexus 5)。在我看来,缺点很大。【参考方案3】:一种方法是使用加速度计数据。在用户按下开始按钮后,您的应用程序应持续记录加速度计数据。每当用户迈出一步时,您都会观察到数据中的峰值。对此数据应用过滤器,您将能够以合理的准确度检测所采取的步骤数。将它乘以步长,您应该得到行进距离的近似值。将用户的身高作为输入参数。步长约为 0.45* 人的身高。由于这种方法独立于 GPS,它也可以在室内工作。 编辑: 您需要使用所有三个轴的加速度计值,以使其完全独立于设备方向。您可以使用 x^2 + y^2 + z^2
【讨论】:
此解决方案存在一个问题。如果您以恒定速度行驶,则加速度为 0,因此加速度计不会获取任何读数。 @jnovacho 这与您在一个特定方向上的行驶速度无关。当你迈出一步时,手机在你口袋里的加速度突然发生变化(主要是在Z轴,也有在X和Y轴)。不是因为你走路的速度,而是因为你向前迈了一步,这是一个突然的动作。 @jnovacho - 您提到的情况会在用户保持设备静止并移动时发生。当用户将设备放在口袋中时,由于用户的腿部运动,在加速度值中会发现一种模式。 @UtkarshMankad 还有一个图案——更小,但仍然可见——握住它时,因为整个身体随着每一步而上下移动。 @基金莫妮卡的诉讼,你是对的,身体上下移动。为避免在身体上下移动时计步,您可以验证模式。例如,float accelationSquareRoot = (x * x + y * y + z * z) / (SensorManager.GRAVITY_EARTH * SensorManager.GRAVITY_EARTH);然后在 if 语句中使用它的值,例如 if(accelationSquareRoot >2.0) //do count your step here 。 . . .【参考方案4】:public double getDistance(double lat1, double lon1, double lat2, double lon2)
double latA = Math.toRadians(lat1);
double lonA = Math.toRadians(lon1);
double latB = Math.toRadians(lat2);
double lonB = Math.toRadians(lon2);
double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
(Math.sin(latA) * Math.sin(latB));
double ang = Math.acos(cosAng);
double dist = ang *6371;
return dist;
【讨论】:
尝试添加cmets关于如何实现而不是只给出代码【参考方案5】:有不同的方法可以做到这一点:
-
GPS:每 X 秒(比如 10 秒)不断增加 2 个点之间的 GPS 距离。检查 Android Location.distanceTo 或 distanceBetween。检查My Tracks app,它是开源的。 GPS 在室内不可用,如果用户非常频繁地改变方向(每 1-2 秒读取一次)会出现错误
加速度计:查找使用加速度计进行步数检测的代码/库。距离来自加速度的双重积分,这里的误差会很快增加。
步数检测器:内置于Nexus 5。谷歌必须尽可能地处理加速度计错误。这是基于硬件的计算,消耗的电池更少,但目前大多数手机都不可用。
您也可以查看Pedestrian dead reckoning
【讨论】:
【参考方案6】:评论“此解决方案存在一个问题。如果您以恒定速度行驶,加速度为 0,因此加速度计不会获取任何读数。- jnovacho 16 秒前” (对不起,没有足够的声望直接评论)
当你加速时,保存加速,然后计算你的行走速度。每当加速度变化时停止速度计算并重新开始。如果你停下来,你应该会收到一个负加速,然后你必须计算你是刚刚减速还是完全停止。但这只是数学:)
【讨论】:
【参考方案7】:我使用的是 Gps 方法。 通过以下步骤: 单击开始按钮时,将获取起点的纬度和经度,并使用适当的 TripId 将其存储在我的 dto 中。
点击停止按钮:
TripDto dto = service.GetStartLatLong(TripIdA);
double lat = Double.valueOf(dto.getStartLati());
double lon = Double.valueOf(dto.getStartLongi());
Location locationa = new Location("point A");
locationa.setLatitude(lat);
locationa.setLongitude(lon);
double distance = location.distanceTo(locationa);
location.distanceTo() 方法返回的距离以米为单位。
【讨论】:
虽然我迟到了,但这适用于直线运动。【参考方案8】:您可以使用位置管理器使用开始按钮找到当前位置的纬度和经度,并将其存储在变量中。然后使用相同的方法找到终点的纬度和经度。使用这个找到它们之间的距离 -
https://www.geeksforgeeks.org/program-distance-two-points-earth/#:~:text=For%20this%20divide%20the%20values,is%20the%20radius%20of%20Earth.
【讨论】:
【参考方案9】:如果您的轨迹不是直接方式(曲线或锯齿形),那么您应该每 3-10 秒使用一次检查位置 别人在我之前说(x 秒)。
【讨论】:
以上是关于如何在android中行走时计算距离?的主要内容,如果未能解决你的问题,请参考以下文章
如何在android中的谷歌地图上绘制路线并计算多个标记之间的距离