Точность CoreLocation - PullRequest
       7

Точность CoreLocation

6 голосов
/ 20 июля 2009

У меня есть программа с менеджером местоположения, настроенная так:

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

Мне нужна точность с точностью до десяти метров, однако требуется несколько вызовов метода делегата didUpdateToLocation, чтобы найти местоположение с такой точностью. Как мне отложить вызов этого метода или просто указать, когда будет достигнута желаемая точность для продолжения работы с программой.

Прямо сейчас он пытается продолжить работу с первым возвращенным местоположением. Даже второе обновление местоположения не так точно, как ожидалось.

Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 20 июля 2009

Поскольку каждый вызов делегата включает показатель точности, просто возвращайтесь из метода, пока не будет достигнута желаемая точность (предупреждение: это может никогда не произойти).

Вы не можете просто перейти к десятиметровому результату - есть причина, почему это называется «желаемой» точностью, а не обязательной точностью. Вы должны дать ему время для расчета более точных позиций.

4 голосов
/ 12 апреля 2011

Недавно я решил эту проблему и обнаружил, , наконец, умело прочитав документацию , что 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 для экономии энергии. Конечно, для этого нужно время и какой-то способ сохранить и принять местоположение с наилучшей горизонтальной точностью, если оно истекло, но я пока не выяснил, как это сделать.

2 голосов
/ 12 августа 2009

Одна из стратегий состоит в том, чтобы запустить таймер на достаточно длительный период времени, чтобы получить исправление (которое также будет приемлемо для пользователя)

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

Запустите диспетчер местоположений, доставляющий обновления. Когда таймер истекает (или вы получаете приемлемую точность), остановите обновления и используйте это местоположение.

Это, наверное, лучшее, что вы собираетесь получить. Возможно, вы захотите дать пользователю возможность повторить попытку поиска местоположения, если оно все еще недостаточно точное.

...