【问题标题】:CoreLocation Accuracy Woes核心定位精度问题
【发布时间】:2010-11-12 04:52:58
【问题描述】:

我有一个位置管理器设置如下的程序:

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

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

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

提前致谢!

【问题讨论】:

    标签: iphone objective-c gps location core-location


    【解决方案1】:

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

    您不能简单地跳到 10 米的结果 - 将其称为“所需”精度而不是强制精度是有原因的。您必须给它时间来计算更准确的位置。

    【讨论】:

    • 出于某种原因,当我检查此属性 ([newLocation Horizo​​ntalAccuracy]) 时,LocationManager 只更新了两次,并且两次 newLocation 都相同。你知道这是什么原因吗?
    • 这是它当时能找到的最好结果。你并不总是能在十米之内得到结果——即使你在 iPhone 中有 GPS,有时在室内它也不得不求助于手机信号塔三角测量。
    【解决方案2】:

    我最近解决了这个问题并发现,通过巧妙地阅读文档终于发现,CoreLocation 在单独的线程中运行,因此您可以启动它,然后在它更新时检索事件.它在标题"Getting the User's Location" 下的文档中。所以这里是你开始更新的地方:

    - (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 接收器以节省能源。当然,如果超时,它需要一个超时时间和某种方式来存储和接受具有最佳水平精度的位置,但我还没有弄清楚如何做到这一点。

    【讨论】:

      【解决方案3】:

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

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

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

      这可能是你能得到的最好的。如果位置仍然不够准确,您可能希望让用户选择重试位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-10
        • 1970-01-01
        相关资源
        最近更新 更多