6

我有一个带有这样设置的位置管理器的程序:

self.locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; 
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;

我需要精度在十米以内,但是,需要调用 didUpdateToLocation 委托方法几次才能找到该精度的位置。我将如何延迟此方法的调用或仅指示何时达到所需的准确性以继续执行该程序。

现在它尝试继续返回第一个位置。即使是第二次位置更新也没有预期的那么准确。

提前致谢!

4

3 回答 3

7

由于每个委托调用都包含一个准确度数字,因此只需从该方法返回,直到达到您想要的准确度(警告:这可能永远不会发生)。

你不能简单地跳到十米的结果——它被称为“期望”精度而不是强制精度是有原因的。你必须给它时间来计算更精确的位置。

于 2009-07-20T03:35:03.573 回答
4

我最近解决了这个问题,并最终通过巧妙地阅读文档发现 CoreLocation 在单独的线程中运行,因此您可以启动它,然后在它更新时检索事件。它位于“获取用户位置”标题下的文档中。所以这里是你开始更新的地方:

- (void)startStandardUpdates
{
    if (nil == locationManager)
        locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    locationManager.distanceFilter = none;
    [locationManager startUpdatingLocation];
}

如果您将委托设置为“self”,它将向定义 start 方法的同一类发送事件,因此您只需添加以下内容即可检索事件:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
    fromLocation:(CLLocation *)oldLocation
{
    if (newLocation.horizontalAccuracy < 30.0)
    {
        NSLog(@"latitude %+.6f, longitude %+.6f\n",
                newLocation.coordinate.latitude,
                newLocation.coordinate.longitude);
        [manager stopUpdatingLocation];
    }
}

这样它将继续接收事件,然后关闭 GPS 接收器以节省能源。当然,如果超时,它需要一个超时时间和某种方式来存储和接受具有最佳水平精度的位置,但我还没有弄清楚如何做到这一点。

于 2011-04-12T05:34:47.103 回答
2

一种策略是启动一个足够长的时间来修复(这也是用户可以接受的)

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

启动位置管理器提供更新。当计时器到期(或您获得可接受的准确性)时,停止更新并使用该位置。

这可能是你将得到的最好的。如果位置仍然不够准确,您可能希望为用户提供再次尝试位置的选项。

于 2009-08-11T22:00:30.953 回答