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因素)
| 归档时间: |
|
| 查看次数: |
9995 次 |
| 最近记录: |