如何在Android中行走时计算距离?

时间:2014-03-10 05:23:21

标签: android distance calculator

我正在为我的应用程序开发一个演示,其中有两个按钮,分别命名为“START”和“STOP”。当用户点击“开始”时,他将开始行走。我想要做的是,当用户点击“STOP”时,演示将计算他在“START”和“STOP”之间的距离。如果用户按下“START”并按下“STOP”而不执行任何步骤,则必须显示0km或0m。我不知道如何开始这个;请提出建议。

9 个答案:

答案 0 :(得分:18)

有不同的方法可以做到这一点:

  1. GPS :每X秒(比如10秒)继续添加2点之间的GPS距离。检查Android Location.distanceTo或distanceBetween。查看My Tracks应用,它是开源的。 GPS在室内不可用,如果用户频繁改变方向(每1-2秒读取一次),则会出现错误。
  2. 加速度计:使用加速度计查找用于步进检测的代码/库。距离来自加速度的双重整合,错误可以很快加起来。
  3. 步进检测器:内置于Nexus 5。谷歌必须尽可能地处理加速度计误差。这是基于硬件的计算,耗电量较少但截至目前大多数手机都没有。
  4. 您还可以查看Pedestrian dead reckoning

答案 1 :(得分:13)

一种方法是使用加速度计数据。用户按下“开始”按钮后,您的应用应连续记录加速计数据。每当用户迈出一步时,您将在数据中观察到峰值。对此数据应用过滤器,您应能够以合理的准确度检测所采取的步骤数。将其乘以步长,您应该得到行进距离的近似值。将用户的高度作为输入参数。步长约为0.45 *一个人的身高。由于这种方法独立于GPS,因此它也适用于室内。 编辑: 您需要使用所有三个轴的加速度计值使其完全独立于设备方向。您可以使用x ^ 2 + y ^ 2 + z ^ 2

答案 2 :(得分:6)

在您的应用中询问GPS权限。点击开始时,记录GPS坐标。做同样的停止。你现在有两个坐标。然后,您可以应用距离公式来获得行进的总距离。

修改

至于评论中澄清的情况,我认为你需要研究的是Android的motion sensors。您可能需要做出很多假设,或者要求用户在实际使用前校准您的应用程序。

假设您了解用户的节奏因素。使用运动传感器,计算用户“走路”的时间长度(显然,没有简单的方法来确定您的用户是实际走路还是只是摇动手机)。将其与用户的节奏因子相乘,您就可以非常清楚地了解用户的步行量。

答案 3 :(得分:3)

评论"此解决方案存在一个问题。如果您以恒定速度行驶,加速度为0,因此加速度计不会读取任何读数。 - 16秒前的jnovacho" (对不起,没有足够的声誉可以直接评论)

当你加速时,保存加速度,然后计算你走的速度。每当加速度改变并重新开始时停止计算速度。如果你停下来,你应该得到一个负面的加速,然后你必须计算你是否只是放慢速度或完全停止。但那仅仅是数学:)

答案 4 :(得分:3)

我选择了Gps方法。 通过以下步骤: 点击开始按钮,获取起点的纬度和经度,并将其存储在我的dto中并使用正确的TripId。

点击停止按钮:

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()方法返回的距离以米为单位。

答案 5 :(得分:2)

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;
}

答案 6 :(得分:1)

尝试使用传感器,我觉得你不应该使用GPS,因为它可能不那么准确。 请参阅以下开源计步器项目,了解您所说的内容。

Pedometer library

如果您想使用传感器,将使用更多指定的代码更新此答案。

答案 7 :(得分:0)

您可以使用位置管理器使用 START 按钮找到当前位置的纬度和经度,并将其存储在变量中。然后使用相同的方法找到终点的纬度和经度。使用这个找到它们之间的距离 -

https://www.geeksforgeeks.org/program-distance-two-points-earth/#:~:text=For%20this%20divide%20the%20values,is%20the%20radius%20of%20Earth

答案 8 :(得分:0)

如果您的轨迹不是直接的方式(曲线或之字形),那么您应该每 3-10 秒使用一次检查位置 别人在我之前说(x 秒)。