Точность основного местоположения

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

Неточное определение местоположения

Я даже могу оставить свой iPhone на столе, когда мое приложение включено, и через несколько минут мое приложение отслеживает расстояние в сотни метров на расстоянии только из-за этого недостатка.

Вот мой код инициализации:

- (void)initializeTracking { self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; self.locationManager.distanceFilter = 5; [self.locationManager startUpdatingLocation]; } 

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

4 Solutions collect form web for “Точность основного местоположения”

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

Учитывая previousLocation , затем для newLocation , вычислите расстояние от previousLocation . Если это distance >= (horizontalAccuracy * 0.5) мы использовали это местоположение, и это место становится нашим новым previousLocation местом. Если расстояние меньше, мы отбрасываем это обновление местоположения, не меняем previousLocation и ожидаем следующего обновления местоположения.

Это хорошо работает для наших целей, вы можете попробовать что-то подобное. Если вы все еще находите слишком много обновлений, которые являются шумом, увеличьте коэффициент 0,5, возможно, попробуйте 0,66.

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

Я бы избегал запуска любого отслеживания местоположения или измерения расстояния с горизонтальной точностью> 70 метров. Это некачественные позиции для GNSS, хотя это может быть все, что вы можете получить в городском каньоне, под тяжелым пологом деревьев или в других плохих условиях сигнала.

Я использовал этот метод для получения желаемой точности местоположения (в SWIFT)

 let TIMEOUT_INTERVAL = 3.0 func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { let newLocation = locations.last as! CLLocation println("didupdateLastLocation \(newLocation)") //The last location must not be capured more then 3 seconds ago if newLocation.timestamp.timeIntervalSinceNow > -3 && newLocation.horizontalAccuracy > 0 { var distance = CLLocationDistance(DBL_MAX) if let location = self.lastLocation { distance = newLocation.distanceFromLocation(location) } if self.lastLocation == nil || self.lastLocation!.horizontalAccuracy > newLocation.horizontalAccuracy { self.lastLocation = newLocation if newLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy { //Desired location Found println("LOCATION FOUND") self.stopLocationManager() } } else if distance < 1 { let timerInterval = newLocation.timestamp.timeIntervalSinceDate(self.lastLocation!.timestamp) if timerInterval >= TIMEOUT_INTERVAL { //Force Stop stopLocationManager() } } } 

Где:

 if newLocation.timestamp.timeIntervalSinceNow > -3 && newLocation.horizontalAccuracy > 0 { 

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

Затем мы установим расстояние со значением по умолчанию:

  var distance = CLLocationDistance(DBL_MAX) 

Вычислите расстояние от последнего местоположения, полученного до нового местоположения:

 if let location = self.lastLocation { distance = newLocation.distanceFromLocation(location) } 

Если наше местное последнее местоположение еще не установлено или если новая позиция по горизонтали точно лучше, чем фактическая, то мы собираемся установить локальное местоположение в новое место:

 if self.lastLocation == nil || self.lastLocation!.horizontalAccuracy > newLocation.horizontalAccuracy { self.lastLocation = newLocation 

Следующим шагом является проверка правильности полученной точности от местоположения. Для этого мы проверяем, не изменилось ли горизонтальное расстояние местоположения, а затем желаемое значение. Если это случай, мы можем остановить нашего менеджера:

 if newLocation.horizontalAccuracy <= self.locationManager.desiredAccuracy { //Desired location Found self.stopLocationManager() } 

С последним, if мы будем проверять, удалено ли расстояние от последнего местоположения, а новое – меньше (это означает, что 2 местоположения очень близки). Если это так, мы собираемся получить временной интервал из последнего найденного местоположения и получить новое местоположение и проверить, превышает ли интервал 3 секунды. Если это так, это означает, что более 3 секунд мы не получаем местоположение, которое более точно соответствует нашему локальному местоположению, и поэтому мы можем остановить службы определения местоположения:

 else if distance < 1 { let timerInterval = newLocation.timestamp.timeIntervalSinceDate(self.lastLocation!.timestamp) if timerInterval >= TIMEOUT_INTERVAL { //Force Stop println("Stop location timeout") stopLocationManager() } } 

Это всегда проблема со спутниками. Это оценка и оценки могут различаться. Каждый новый отчет является новой оценкой. Вам нужен зажим положения, который игнорирует значения, когда нет движения.

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

Это сложная проблема.

Там действительно не намного больше, что вы можете сделать, чтобы улучшить то, что дает вам операционная система и ваш текущий прием. При первом взгляде не похоже, что что-то не так с вашим кодом – когда дело доходит до обновлений местоположения iOS, вы действительно находитесь на милости ОС и вашего сервиса.

То, что вы МОЖЕТЕ сделать, это контролировать, на какие места вы обращаете внимание. Если бы я был вами в моей функции didUpdateLocations, когда вы получаете обратные вызовы из ОС с новыми местоположениями – вы можете игнорировать любые местоположения с горизонтальной точностью, превышающей предопределенный порог, возможно, 25 м? В конечном итоге вы получите меньше обновлений местоположения, но у вас будет меньше шума.

  • Отключение приложения GPS-слежения iOS в фоновом режиме
  • Насколько точны измерения точности CoreLocation
  • Фон GPS в iOS. Это возможно?
  • Как получить текущую высоту в ios 8?
  • как конвертировать gps на север и gps на запад до lat / long в объективе c
  • проблемы с синхронизацией базы данных icloud
  • Лучшая практика для внедрения службы определения местоположения в iOS
  • Xcode: Как показать значение силы GPS?
  • Phonegap iOS с геолокацией в фоновом режиме
  • Phonegap geolocation.watchPosition не обновляет местоположение на iPhone
  • UIImagePickerController сохраняет изображение с информацией о геолокации?
  • Interesting Posts

    как загрузить динамические данные с сервера на uitableview

    как установить положение прокрутки на uiwebview

    Поиск и фильтрация ячеек в UICollectionView

    Twitter.framework – прерывание сеанса twitterd, перезапуск

    Как ограничить ввод символов в UIAextView UITextField

    Есть ли какой-либо элемент управления, который может показывать фотографии, такие как «Фотографии» в iOS?

    Масштабирование UIView из точки, отличной от центра, ища альтернативы anchorPoint

    Приложение для загрузки фонового изображения приложения iOS для подключения Wi-Fi

    Как добавить фреймы libz.dylib и libxml2.dylib в аргументы gcc_flags в MonoTouch?

    Ищете код для запроса «Пожалуйста, оцените это приложение»

    Swift 2 неиспользованное постоянное предупреждение

    открытие набора номера для вызова номера пользователь хочет

    textView resignFirstResponder не запускает UIKeyboardWillHideNotification

    Получение Infinite-Scroll by paulirish для работы на iPhone

    Получить всю дату текущего месяца в ios sdk

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