CLLocationManager DistanceFromLocation: возвращает -1

Я пытаюсь использовать основное местоположение в самом начале своего приложения, чтобы получить начальное местоположение.

У меня есть метод делегата:

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

    NSDate* eventDate = newLocation.timestamp;
    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];

    DLog(@"received location data from %f ago, lat/long - %+.6f, %+.6f\nold lat/long %+.6f, %+.6f\nhorizontal accuracy is %f", 
     howRecent, newLocation.coordinate.latitude, newLocation.coordinate.longitude, 
     oldLocation.coordinate.latitude, oldLocation.coordinate.longitude, 
     newLocation.horizontalAccuracy);

    // check if new update is significantly different from old one.  If it is, then reverse-geocode.
    if ([newLocation respondsToSelector:@selector(distanceFromLocation:)]) {
        DLog(@"distance from old to new location - %f", [newLocation distanceFromLocation:oldLocation]);
        if ([newLocation distanceFromLocation:oldLocation] < 1000) {
            // reverse geocode please
            [self stopLocationManager];
        }
    }

    else if ([newLocation respondsToSelector:@selector(getDistanceFrom:)]){
        DLog(@"distance from old to new location - %f", [newLocation getDistanceFrom:oldLocation]);
        if ([newLocation getDistanceFrom:oldLocation] < 1000) {
            // reverse geocode please
            [self stopLocationManager];
        }
    }
}

Вот вывод журнала:

... -[AppHelper locationManager:didUpdateToLocation:fromLocation:] received location data from -13.261873 ago, lat/long - +37.705413, -121.866296
old lat/long +0.000000, +0.000000
horizontal accuracy is 1982.000000
... -[AppHelper locationManager:didUpdateToLocation:fromLocation:] distance from old to new location - -1.000000

Любая идея, почему начальный расчет расстояния от нового местоположения до старого местоположения (0,0) дает результат -1?


person Sean S Lee    schedule 12.03.2011    source источник


Ответы (2)


Кажется, что расстояние равно -1, потому что старое местоположение (0,0) недействительно. Я бы проигнорировал первое расстояние (-1) и дождался следующего.

Для меня совершенно логично, что первая локация не может иметь старую локацию.

person Erik B    schedule 12.03.2011
comment
ошибки вводили в заблуждение, потому что 0,0 на самом деле является допустимым местоположением. Я проверил googlemaps, это несколько западнее африканского континента :( поэтому я пытался игнорировать, если широта/долгота были равны 0, но это не сработало, если (!(oldLocation.coordinate.latitude == 0.0 && oldLocation.coordinate.longitude == 0.0) всегда возвращает ноль, ха-ха. В любом случае, кажется, что-то не так, когда вы вызываете свойства нулевого объекта.. Я думаю, если oldlocation на самом деле является действительный объект в 0,0, расчет работает нормально. - person Sean S Lee; 12.03.2011
comment
Да, конечно, но маловероятно, что вы перемещались между широтой/долготой +0,000000, +0,000000 и широтой/долготой - +37,705413, -121,866296, не получая никаких обновлений между ними, поэтому я все еще думаю, что игнорирование первого расстояния - это способ идти. :П - person Erik B; 12.03.2011
comment
Если вы вызываете методы для нулевого объекта, он всегда возвращает 0. - person Erik B; 12.03.2011
comment
Да, это маловероятно, поэтому я согласен с вашим ответом в 99,9% случаев. Я просто обсессивно-компульсивное расстройство, когда дело доходит до того, что мой код все время правильный. Спасибо за ваши комментарии! - person Sean S Lee; 12.03.2011
comment
re: метод для нулевого объекта, возвращающий 0 - да, это то, что я понимаю, но это странная часть: oldLocation.coordinate.latitude == 0.0 возвращает YES, а oldLocation.coordinate.longitude == 0.0 возвращает YES также в отдельном тесте.. но если я соединю их вместе, как в !(oldLocation.coordinate.latitude == 0.0 && oldLocation.coordinate.longitude == 0.0), это вернет YES вместо NO ‹-- что здесь происходит? любая идея? - person Sean S Lee; 12.03.2011

Боже, во второй раз я отвечаю на свой вопрос .. извините, я недостаточно отлаживал, я думаю!

Итак, вот что происходит: когда делегат вызывается в первый раз, похоже, что oldLocation можно вызвать с нулевым значением.

Таким образом, DistanceFromLocation: вызывается с аргументом nil и возвращает -1 как своего рода код ошибки.

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

Было бы неплохо, если бы DistanceFromLocation: фактически запускал какое-то утверждение при вызове с аргументом nil вместо загадочного кода ошибки -1! :D

person Sean S Lee    schedule 12.03.2011