我正在开发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.
}
}
}
答案 0 :(得分:4)
即使您不喜欢内置的速度内容,也可以轻松推出自己的速度。
速度是一段时间的距离,对吧?
如果你有两个CLLocation
,你可以这样做:
CLLocationDistance distance = [aLocation distanceFromLocation:bLocation];
distance
现在是这两个点之间距离的浮点数,以米为单位。这两个CLLocations
也有timestamp
个属性,对吧?包含NSDate对象。嗯......
NSTimeInterval timediff = [aDate timeIntervalSinceDate:bDate];
timediff
是以秒为单位的差异。
因此,这些以米为单位的点之间的平均速度为distance
超过timediff
。您现在可以准确计算瞬时速度,就像您获得位置更新的频率一样。
我想这就是获得你正在接受的CLLocation对象的speed
属性所发生的一切。但是,嘿,你想要更接近数学,直接前进。
从那里,您可以转换为您喜欢的任何单位。一英里有1609.344米。一小时有3600秒。
现在:这和任何纯粹的基于GPS的速度计算一样有缺陷,因为你不会得到位置更新的完美间隔标记,有时它们会出错。如果你丢失GPS信号并且设备回到了蜂窝塔三角测量,那么它可能会让你在某个地方离开路面,看起来你就像绑在火箭包上那样在那里快。