Получение точного местоположения с CLLocationManager - PullRequest
3 голосов
/ 07 ноября 2010

Я начинаю возиться с CLLocationManager и пытаюсь использовать метод обратного вызова ниже. Я вышел на улицу, чтобы протестировать его на своем iPhone, и с первыми несколькими обновлениями я, кажется, получил бредовые значения, как будто вдруг мое расстояние составляет 39 метров, хотя я никуда не двигался. Или иногда он начинается с 5, а затем прыгает на 20 метров, опять же, я никуда не двигаюсь. Я вышел на улицу и пошел, и обновления с начальной отправной точки казались «в порядке», а затем, когда я вернулся, я вернулся к исходной 39-метровой отправной точке. Мне было интересно, правильно ли то, что я делаю ниже. Я также включил свой метод viewDidLoad, где я инициализирую свой объект CLLocationManager.

Есть ли способ убедиться, что мои первые значения точны? Заранее спасибо.

- (void)viewDidLoad
{
    [super viewDidLoad];
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = kCLDistanceFilterNone;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    if (startingPoint == nil) {
        NSLog(@"NIL starting point");
        self.startingPoint = newLocation;
    }

    CLLocationDistance distance = [newLocation distanceFromLocation:startingPoint];
    NSString *distanceString = [[NSString alloc] initWithFormat:@"%g m", distance];
    distanceLabel.text = distanceString;
    [distanceString release];

    numberOfUpdates++;
    NSString *countString = [[NSString alloc] initWithFormat:@"%d", numberOfUpdates];
    countLabel.text = countString;
    [countString release];
}

Ответы [ 3 ]

5 голосов
/ 07 ноября 2010

GPS - несовершенная технология.Атмосферные условия, доступность спутникового спутника (и положение), видимость неба, сигналы, отражающиеся от близлежащих объектов (зданий), все это вносит свойственную неточность.Хотя есть даже значение «точности» (которое обычно составляет обычно довольно хорошо) - даже это не совсем надежно.

Самолетам не разрешается использовать GPS для точных заходов на посадку - даже их приемникине достаточно точны, и им требуются другие технологии (которые имеют свои проблемы).

Попробуйте запустить стандартное приложение «Карты» и использовать его для сравнения.Я думаю, что ваш код хорош - это просто GPS.

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

3 голосов
/ 15 июня 2011

Хотя это старый вопрос, на который я все еще хотел бы ответить.Первый вызов «didUpdateToLocation» обычно является некоторым старым значением, и вы всегда должны проверять отметку времени.Из документации Apple:

NSDate* eventDate = newLocation.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
if (abs(howRecent) < 15.0)
{
   // use the value
}
2 голосов
/ 07 ноября 2010

В вашем методе didUpdate вы можете проверить .horizontalAccuracy свойство newLocation на приемлемое значение и отбросить любые значения, которые невозможны (или даже маловероятны!).

...