我正在玩iPhone SDK,我想在我的应用程序中显示当前的速度。有这么多应用程序可以做到非常精确,特别是对于低速运行或骑自行车。我见过的最好的是RunKeeper。
但是,在我的应用程序中,速度绝对不准确。在低速时它始终为空,并且只有在更高的速度下才会显示一些值,但它们很少更新,并且不太有用。
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
if (newLocation.timestamp > oldLocation.timestamp &&
newLocation.verticalAccuracy > 0.0f && // GPS is active
newLocation.horizontalAccuracy < 500.0f && // GPS is active
//newLocation.horizontalAccuracy < kCLLocationAccuracyHundredMeters && // good quality GPS signal
//newLocation.speed > 1.0f && // enough movment for accurate speed and course measurement
oldLocation != nil) // oldLocation is nil on the first reading
{
double speed = (newLocation.speed * 3.6);
[self updateDisplayWithSpeed:speed];
//double direction = newLocation.course;
}
}
有人有工作代码吗?或者你能告诉我我的错误吗?
答案 0 :(得分:7)
我会尝试以下方法。
请记住,您应根据场景的需要设置distanceFilter和desiredAccuracy:步行与乘车等不同。此外,当您从GPS请求高精度时,您必须始终丢弃由提供的第一个位置GPS并使用第二个作为起始位置。引用Apple文档:
您应该为此属性分配一个适合您的使用方案的值。换句话说,如果您只需要几公里内的当前位置,则不应指定kCLLocationAccuracyBest以获得准确性。确定更精确的位置需要更多时间和更多功率。 在请求高精度位置数据时,位置服务提供的初始事件可能没有您请求的准确性。定位服务尽快提供初始事件。然后,它会继续以您请求的准确度确定位置,并在数据可用时根据需要提供其他事件。
这是我的建议。
首先,使用GPS以至少一秒的间隔更新位置。低于此间隔时,速度值无用,因为它以米/秒为单位进行测量,并且由于之前的讨论,您不太可能在不到一秒的时间内获得高精度的有效更新。
其次,仅对位置坐标使用有意义的值:您应丢弃具有负horizontalAccuracy的值。这就是我在谈到好位置时所指的。
第三,您可以自己计算距离:使用getDistanceFrom()计算最后一个好位置和上一个好位置之间的距离,然后除以位置更新之间经过的秒数。这将为您提供每秒米的距离。我会尝试这样做,并将结果与Apple提供的速度进行比较。
答案 1 :(得分:3)
请在您的代码中尝试以下内容:
speedLabel.text = [NSString stringWithFormat:@"SPEED(Km/Hr): %f", [location speed]*3.6];
latitudeLabel.text = [NSString stringWithFormat:@"LATITUDE: %f", location.coordinate.latitude];
longitudeLabel.text = [NSString stringWithFormat:@"LONGITUDE: %f", location.coordinate.longitude];
CLLocationDistance meters = [location distanceFromLocation:orginalLoc];
distanceLabel.text = [NSString stringWithFormat:@"DISTANCE(M): %f", meters];