我正在开发一款应用程序,它更像是朋友之间的时移赛。
我需要计算移动车辆的速度,我不想使用Location.getSpeed()
方法。 (在底部详细解释为什么我不想使用它)
我正在尝试使用Latitude and Longitude帮助计算速度,这是我需要帮助的地方。
所需的帮助:我想知道的是:
我使用以下代码:
这为我提供了两个LatLng点之间的距离:
long getDistanceBetweenPoints(double lat1, double lng1, double lat2, double lng2 ){
double dLat = Math.toRadians(lat2 - lat1);
double dLon = Math.toRadians(lng2 - lng1);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
+ Math.cos(Math.toRadians(lat1))
* Math.cos(Math.toRadians(lat2)) * Math.sin(dLon / 2)
* Math.sin(dLon / 2);
double c = 2 * Math.asin(Math.sqrt(a));
long distanceInMeters = Math.round(6371000 * c);
return distanceInMeters;
}
以下代码是如何使用的:
if(lastLat == -1 && lastLng == -1){
lastLat = location.getLatitude();
lastLng = location.getLongitude();
lastTimeStamp = location.getTime();
return;
}
long distanceInMeters = getDistanceBetweenPointsAndSetTotal(lastLat, lastLng, location.getLatitude(), location.getLongitude());
long timeDelta = (location.getTime() - lastTimeStamp)/1000;
long speed = 0;
if(timeDelta > 0){
speed = (distanceInMeters/timeDelta);
}
Log.d("Calculations","Distance: "+distanceInMeters+", TimeDelta: "+timeDelta+" seconds"+",speed: "+speed+" Accuracy: "+location.getAccuracy());
lastLat = location.getLatitude();
lastLng = location.getLongitude();
lastTimeStamp = location.getTime();
当我运行它时,我从该LogCat得到以下输出:
Distance: 0, TimeDelta: 0 seconds,speed: 0 Accuracy: 5.0
详细原因
目标消费者不应该拥有高质量的GPS芯片设备,因此无法在设备移动时获得非常准确的修复。
因此我不想依赖Location.getSpeed()
方法,因为我观察到它仅在精度在5~8米范围内时才给出速度值。
我在一般情况下获得的正常精确度范围是10-15米,getSpeed()
没有给出任何速度。即使hasSpeed()
开始返回false。
我一直在修这个东西超过3天,对此的任何帮助都将深表感谢。
非常感谢提前!
答案 0 :(得分:12)
我开发了MyTrails,这是一款Android映射和跟踪应用,就像我一样,我最初使用谷歌认为适合包含在Android中的粗略位置API。
当GPS芯片没有足够好的修正来计算基于掺杂效应的速度时,hasSpeed()为假。即使它确实如此,如果速度低于5公里/小时左右,我通常也不会相信速度。
我处理速度计算的方法是使用粗略的低通滤波器:我每秒记录一个跟踪点(相隔至少5米,基于LocationManager.requestLocationUpdates()
,并计算最近的速度,我去返回一些样本以获得相距足够的距离(但不超过30秒),并执行您正在进行的平均。
我使用Location.distanceBetween()进行实际距离计算。请注意,它在一个非常小的(但不幸的)数量的设备上失败,所以你所拥有的半影方法可能是更好的选择。你可能想检查它,我有什么
/**
* Gets distance in meters, coordinates in RADIAN
*/
private static double getDistance(double lat1, double lon1, double lat2, double lon2) {
double R = 6371000; // for haversine use R = 6372.8 km instead of 6371 km
double dLat = lat2 - lat1;
double dLon = lon2 - lon1;
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1) * Math.cos(lat2) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
//double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return 2 * R * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
// simplify haversine:
//return 2 * R * 1000 * Math.asin(Math.sqrt(a));
}
(注意1000因素)
答案 1 :(得分:1)
我同意皮埃尔的意见,同时你也在考虑结果。如果这些点相距不够远,那么你的四舍五入可能只提供0.我没有看到如何定义舍入公差。 我总是以米为单位计算 - 它让事情变得更容易。我建议您在代码中遵循SI标准单位。 您的输出还显示timeDelta为零,因此实际上没有计算距离。
答案 2 :(得分:1)
如果算法正确吗?
距离计算看起来像正确的半正弦公式。 (对于小距离有更快的公式(并且你只使用很小的距离),但是半影将起作用)
我应该用厘米计算而不是米吗?
切勿使用厘米,使用SI单位,速度单位为米/秒。只需使用米作为浮点(双)。
Ios,我正在开发一个跟踪应用程序,似乎与Location类的getSpeed()nethod更友好相关。
但我(再次?)警告你要以低速使用速度。如果您的速度无效,则只需停止计算或在应用中将其标记为无效。 如果GPS芯片无法提供有效的速度,那么它有充分的理由这样做,而且你是否会做得更好是一个有趣的问题。 在低速时,GPS倾向于随机跳转到真实位置,跳跃5-30米。 您的自我计算速度很可能显示设备(不)移动的速度。 尝试修复您的应用程序,它不需要低速时的速度。
答案 3 :(得分:1)
OMG .....
检查此方法 - 它允许您计算2个地理点之间的距离,只需将其除以您的时间。它应该比你的更精确,因为它以更好的近似值计算距离(WGS83而不是使用sin,cos和其他东西)。
总体而言,一般的想法是将所有数据保存在m,s,kg等普通单位中,并仅为向用户显示数据进行更改。