我正在 iPhone 中开发速度计应用程序。我使用 CLLocationManager(基于 GPS)来测量车辆的速度。但我没有得到准确的速度。我已经尝试了各种 stackoverflow 讨论中给出的所有过滤方法。但我没有得到任何改善。有时,速度会达到更大的值(>400kmph)。
我不知道出了什么问题。请向我建议任何代码以获得准确的速度。
提前致谢,
我关注了下面提到的堆栈溢出讨论
Measuring velocity via iPhone SDK
Optimizing CLLocationManager/CoreLocation to retrieve data points faster on the iPhone
Why is my CLLocation speed so inaccurate?
我目前已经实现了以下代码:
//locationManager declaration in ViewDidLoad
locManager=[[CLLocationManager alloc]init];
locManager.delegate =self;
[locManager startUpdatingLocation];
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSTimeInterval locationAge = abs([newLocation.timestamp timeIntervalSinceNow]);
if (locationAge > 5.0) return;
if (newLocation.speed < 0 || newLocation.horizontalAccuracy < 0) return;
if ((newLocation.horizontalAccuracy < (oldLocation.horizontalAccuracy - 10.0)) || (newLocation.horizontalAccuracy < 50.0)|| (newLocation.horizontalAccuracy <= 150.0))
{
if(oldLocation != nil)
{
CLLocationDistance distanceChange = [newLocation distanceFromLocation:oldLocation];
NSTimeInterval sinceLastUpdate = [newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp];
double calculatedSpeed;
calculatedSpeed = (distanceChange / sinceLastUpdate)*3.6; // to convert the speed into kmph.
}
}
}
最佳答案
即使您不喜欢内置的速度功能,也可以轻松推出自己的功能。
速度是距离随时间的变化,对吗?
如果您有两个 CLLocation
,您可以执行以下操作:
CLLocationDistance distance = [aLocation distanceFromLocation:bLocation];
distance
现在是这两点之间距离的 float (以米为单位)。这两个 CLLocations
也有 timestamp
属性,对吗?包含 NSDate 对象。嗯...
NSTimeInterval timediff = [aDate timeIntervalSinceDate:bDate];
timediff
是以秒为单位的差异。
因此,这些点之间的平均速度(以米每秒为单位)是 distance
除以 timediff
。您现在可以像获取位置更新的频率一样准确地计算瞬时速度。
我想这就是获取您所收到的 CLLocation 对象的 speed
属性所发生的一切。但是,嘿,如果您想更接近数学,那就继续吧。
从那里,您可以转换为您喜欢的任何单位。一英里有 1609.344 米。一小时有 3600 秒。
现在:这与任何纯粹基于 GPS 的速度计算一样有缺陷,因为您不会获得位置更新的完美间隔的刻度线,有时它们会出错。如果您失去 GPS 信号并且设备退回到手机信号塔三角测量,则可能会使您偏离某个地方的道路,并且看起来就像您绑在火箭包上到那里快。
关于iphone - 使用 CLLocationManager 时查找速度时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6264252/