Имея проблемы с вычислением точного общего расстояния ходьбы / пробега с помощью CLLocationManager

Я пытаюсь создать приложение iOS, которое отображает общее расстояние, пройденное во время бега или ходьбы. Я прочитал и перечитал всю документацию, которую я могу найти, но у меня возникают проблемы с чем-то, что дает мне точную общую дистанцию.

По сравнению с Nike + GPS или RunKeeper, мое приложение постоянно сообщает о более коротком расстоянии. Сначала они сообщают об этом, но по мере того, как я продолжаю двигаться, значения моего приложения и других запущенных приложений постепенно дрейфуют.

Например, если я прохожу 0,3 километра (проверено одометром моего автомобиля), Nike + GPS и RunKeeper каждый раз сообщают ~ .3 километра каждый раз, но мое приложение сообщит ~ .13 километров. newLocation.horizontalAccuracy постоянно 5.0 или 10.0.

Вот код, который я использую. Мне что-то не хватает? Любые мысли о том, как я мог бы улучшить это, чтобы получить более точное чтение?

#define kDistanceCalculationInterval 10 // the interval (seconds) at which we calculate the user's distance #define kNumLocationHistoriesToKeep 5 // the number of locations to store in history so that we can look back at them and determine which is most accurate #define kValidLocationHistoryDeltaInterval 3 // the maximum valid age in seconds of a location stored in the location history #define kMinLocationsNeededToUpdateDistance 3 // the number of locations needed in history before we will even update the current distance #define kRequiredHorizontalAccuracy 40.0f // the required accuracy in meters for a location. anything above this number will be discarded - (id)init { if ((self = [super init])) { if ([CLLocationManager locationServicesEnabled]) { self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; self.locationManager.distanceFilter = 5; // specified in meters } self.locationHistory = [NSMutableArray arrayWithCapacity:kNumLocationHistoriesToKeep]; } return self; } - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { // since the oldLocation might be from some previous use of core location, we need to make sure we're getting data from this run if (oldLocation == nil) return; BOOL isStaleLocation = [oldLocation.timestamp compare:self.startTimestamp] == NSOrderedAscending; [self.delegate locationManagerDebugText:[NSString stringWithFormat:@"accuracy: %.2f", newLocation.horizontalAccuracy]]; if (!isStaleLocation && newLocation.horizontalAccuracy >= 0.0f && newLocation.horizontalAccuracy < kRequiredHorizontalAccuracy) { [self.locationHistory addObject:newLocation]; if ([self.locationHistory count] > kNumLocationHistoriesToKeep) { [self.locationHistory removeObjectAtIndex:0]; } BOOL canUpdateDistance = NO; if ([self.locationHistory count] >= kMinLocationsNeededToUpdateDistance) { canUpdateDistance = YES; } if ([NSDate timeIntervalSinceReferenceDate] - self.lastDistanceCalculation > kDistanceCalculationInterval) { self.lastDistanceCalculation = [NSDate timeIntervalSinceReferenceDate]; CLLocation *lastLocation = (self.lastRecordedLocation != nil) ? self.lastRecordedLocation : oldLocation; CLLocation *bestLocation = nil; CGFloat bestAccuracy = kRequiredHorizontalAccuracy; for (CLLocation *location in self.locationHistory) { if ([NSDate timeIntervalSinceReferenceDate] - [location.timestamp timeIntervalSinceReferenceDate] <= kValidLocationHistoryDeltaInterval) { if (location.horizontalAccuracy < bestAccuracy && location != lastLocation) { bestAccuracy = location.horizontalAccuracy; bestLocation = location; } } } if (bestLocation == nil) bestLocation = newLocation; CLLocationDistance distance = [bestLocation distanceFromLocation:lastLocation]; if (canUpdateDistance) self.totalDistance += distance; self.lastRecordedLocation = bestLocation; } } } 

2 Solutions collect form web for “Имея проблемы с вычислением точного общего расстояния ходьбы / пробега с помощью CLLocationManager”

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

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

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

  • iOS: Почему значок остановленных местоположений по-прежнему отображается после остановки мониторинга для регионов?
  • Как изменить текст «Приложение хочет использовать ваше текущее местоположение?»
  • didChangeAuthorizationStatus не вызывается после нажатия кнопки Разрешить
  • StartUpdatingLocation Vs служба значительного изменения местоположения
  • это симулятор iphone, способный показывать заголовок и широту, долготу?
  • Отображение ярлыка приложения на App Switcher в iOS 9 на основе геообработки, например, Uber
  • как вернуть несколько значений из метода
  • CLLocationManager отслеживает неправильное местоположение (Track Me)
  • Могу ли я получить точность определения местоположения GPS в iOS?
  • как улавливать ответ оповещения о местоположении iphone
  • Приложение приостанавливается в фоновом режиме для обновления местоположения
  • Interesting Posts

    Материал Выберите мерцание на iOS

    Удалите базовую модель данных при обновлении приложения iOS

    Почему значение NSURLCreationDateKey nil на iOS 4.3, но не на iOS 5+?

    iOS: Как изменить ориентацию ландшафта Xs и Ys

    Facebook как кнопка не работает ios

    Проблема производительности с UIVisualEffectView в UITableViewCell

    Проблема с XPath с touchXML в ios

    Как переключаться между .h и .m в Xcode 4

    Добавление объекта к NSSet в базе данных с отношениями «многие ко многим»

    iOS Как я могу использовать pushviewcontroller с NavigationController (Objective-c)

    Как играть в личные видео vimeo в приложении iOS

    Unity Cloud Build: метод post post

    UIView в центре UITableViewController

    Показывает, что «ваше приложение может не иметь доступа к адресам электронной почты», когда пытаетесь получить адрес электронной почты пользователя Twitter, используя Fabric Twitter SDK

    Ошибка ProjectName-Swift. Невозможно найти объявление протокола для CLLocationManagerDelegate.

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.