2011-05-17 102 views
0

我知道这个问题已经被问了很多,但还没有达到我的满意。我正在尝试使用Android设备的GPS来计算速度。很多人似乎都回应说只需使用Location对象的getSpeed()函数。不过,据我所知,getSpeed()只适用于GPS接收器芯片内置速度传感器的某些设备。我想不管这我的应用程序工作,所以我用以下haversine公式:从2点计算速度

private double CalculateHaversineMI(double lat1, double long1, double lat2,double long2) { 
    double dlong = (long2 - long1) * (Math.PI/180.0f); 
    double dlat = (lat2 - lat1) * (Math.PI/180.0f); 
    double a = Math.pow(Math.sin(dlat/2.0), 2) 
     + Math.cos(lat1 * (Math.PI/180.0f)) 
     * Math.cos(lat2 * (Math.PI/180.0f)) 
     * Math.pow(Math.sin(dlong/2.0), 2); 
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    double d = 3956 * c; 

    return d; 
} 

现在我想要做的是找出如何从这种计算速度。任何人都可以帮助我吗?

回答

3

我能看到的是你的函数返回球体上2点之间的正确路径距离 - 它是d。但是,只有在球体上有两个彼此不接近的点时(意味着它们的分离角度不是很小,1度的中心角对应于约111 km的距离),才需要这个公式)。如果他们彼此接近(对于移动人员和低速车辆来说就是这种情况),那么你就不需要这个公式。您可以用直线简单且非常准确地近似球体上的弧线,然后计算变得微不足道。

  • 定期在GPS位置采样。计算获得的最后位置的距离。为此,您可以使用android.location.Location中的distanceTo()函数。
  • 通过将距离除以2次测量之间的时间来计算速度。
  • 平均计算速度可以获得更准确的结果,但要确保您不会对速度变化失去敏感度。因此,您需要对平均样本数进行一些权衡。
0

计算距离。现在您可能还记得,速度=距离/时间,因此您需要捕捉时间以及位置。

在另一个说明中,您正在使用的公式是OTT方式,用于您正在尝试执行的操作。根据你所穿越的路径比地球的周长要小得多的事实,你最好进行一些近似。然后你可以得到一个更简单的公式。