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

Ama*_*lam 6 gps android geolocation 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;
    }
Run Code Online (Sandbox Code Playgroud)

以下代码是如何使用它:

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();
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我从该LogCat得到以下输出:

Distance: 0, TimeDelta: 0 seconds,speed: 0 Accuracy: 5.0
Run Code Online (Sandbox Code Playgroud)

详细原因
目标消费者不应该拥有带有高质量GPS芯片的高质量设备,因此无法在设备移动时获得非常准确的修复.

因此我不想依赖于该Location.getSpeed()方法,因为我观察到它仅在精度在5~8米范围内时才给出速度值.

我在一般情况下获得的正常精度范围是10-15米,并getSpeed()没有给出任何速度.甚至hasSpeed()开始返回false.

我一直在修这个东西超过3天,任何帮助都会深深感激.

非常感谢提前!

Pie*_*our 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));
}
Run Code Online (Sandbox Code Playgroud)

(注意1000因素)