从2点计算速度
问题描述:
我知道这个问题已经被问了很多,但还没有达到我的满意。我正在尝试使用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;
}
现在我想要做的是找出如何从这种计算速度。任何人都可以帮助我吗?
答
我能看到的是你的函数返回球体上2点之间的正确路径距离 - 它是d
。但是,只有在球体上有两个彼此不接近的点时(意味着它们的分离角度不是很小,1度的中心角对应于约111 km的距离),才需要这个公式)。如果他们彼此接近(对于移动人员和低速车辆来说就是这种情况),那么你就不需要这个公式。您可以用直线简单且非常准确地近似球体上的弧线,然后计算变得微不足道。
- 定期在GPS位置采样。计算获得的最后位置的距离。为此,您可以使用
android.location.Location
中的distanceTo()
函数。 - 通过将距离除以2次测量之间的时间来计算速度。
- 平均计算速度可以获得更准确的结果,但要确保您不会对速度变化失去敏感度。因此,您需要对平均样本数进行一些权衡。
答
计算距离。现在您可能还记得,速度=距离/时间,因此您需要捕捉时间以及位置。
在另一个说明中,您正在使用的公式是OTT方式,用于您正在尝试执行的操作。根据你所穿越的路径比地球的周长要小得多的事实,你最好进行一些近似。然后你可以得到一个更简单的公式。