如何等到位置完全找到? (核心位置)

时间:2010-12-27 16:25:11

标签: iphone cocoa-touch core-location

我的应用内有问题。我试图找到用户的位置以达到最佳精确度,以确定他们的邮政编码。目前我有一个按钮,当按下该按钮时,会启动一个名为locateMe的方法。

-(IBAction)locateMe; {
self.locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];

然后我实施了didUpdateToLocation:

-(void)locationManager:(CLLocationManager *)manager 
       didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation; { 

       NSLog(@"Found location! %f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
 }

我以前在didUpdateToLocation做过更复杂的事情,但是当我测试了一些东西时,我意识到它发现的第一个位置至少不准确。所以,我把NSLog调用放在那里,它给了我类似于下面的输出......

Found location! 39.594093,-98.614834
Found location! 39.601372,-98.592171
Found location! 39.601372,-98.592171
Found location! 39.611444,-98.538196
Found location! 39.611444,-98.538196

正如您所看到的,它首先给了我一个不正确的值,这导致我的应用程序出现问题,因为它没有给出正确的位置。

所以,这是我的问题。有什么方法可以等待位置经理找到最准确的位置吗?

提前致谢!

编辑:我想要这样的事情:

if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) {
}

但它永远不会被召唤!

5 个答案:

答案 0 :(得分:9)

我看不出你的期望如何发挥作用。无法保证您获得具有特定准确度的位置。您假设您最终会获得一个具有所需报告准确度的位置,而这种位置不一定会发生。 LocationManager将向您发送一系列位置更新,这些更新通常但不一定总是越来越准确。不幸的是,您不能要求设备接收足够强大的信号,以便为您提供任意精度的位置,并且设备无法预测未来会说“这是我将获得的最准确的位置”

您可以尝试存储在某个时间间隔内报告的所有位置,或者直到报告的准确度似乎稳定,并接受在几秒钟之后您可能无法获得明显更准确的位置。然后,您可以使用最后报告的位置,或者所有位置的最准确或加权中心点,或者您认为合理的任何内容。

鉴于您说这将用于执行反向地理编码以获取邮政编码,我不得不想知道为什么这是一个问题。即使是最精细的位置也可能会触及用户当前的邮政编码,即使是最精确的也不会完全正确,所以如果您的用户可以看到,您仍然希望允许用户更正。

答案 1 :(得分:5)

核心位置通常会调用didUpdateToLocation,并在前一个会话期间检测到位置。因此,您可以跳过它发送给您的第一个位置。如果您根据此数据计算用户速度,则应该了解该行为。在这种情况下,通常以100英里每小时的速度行人。 :)

如果您要提交带有地理坐标的评论或照片,请在用户输入以编写评论屏幕时开始接收地理坐标。而他会输入一条消息 - 检测到的位置变得非常准确。

答案 2 :(得分:2)

所以你真的可以看到发生了什么,尝试NSLog'ging newLocation对象的horizo​​ntalAccuracy属性。你会发现每次击中它的位置都在缩小。

这意味着当您的位置管理员为您提供更新时,您可以测试水平精度,并丢弃那些对您的使用来说太不准确的那些。

答案 3 :(得分:1)

NSLog()oldLocation属性,我认为它应该(或不应该?)为nil。并且如果出现故障,您可以隐藏userLocation:

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    mapView.showsUserLocation = NO;
}

//编辑:desiredAccuracy说didUpdateToLocation只有在远离旧位置时才会被调用。如果将desiredAccuracy设置为100m,则只有当用户离开旧位置100m时才会调用它。

答案 4 :(得分:1)

保存应用程序的启动(或唤醒)时间,并丢弃位置管理器中比应用程序启动时间早的任何结果。 CLLocation上有日期戳。