在没有getSpeed()方法的情况下计算导航应用程序的速度

时间:2014-01-28 16:04:07

标签: android geolocation gps android-location android-navigation

我正在开发一款应用程序,它更像是朋友之间的时移赛。

我需要计算移动车辆的速度,我不想使用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天,对此的任何帮助都将深表感谢。

非常感谢提前!

4 个答案:

答案 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 .....

Location

检查此方法 - 它允许您计算2个地理点之间的距离,只需将其除以您的时间。它应该比你的更精确,因为它以更好的近似值计算距离(WGS83而不是使用sin,cos和其他东西)。

总体而言,一般的想法是将所有数据保存在m,s,kg等普通单位中,并仅为向用户显示数据进行更改。