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

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

  • Как предоставить UIWebView доступ к текущему местоположению gps
  • Маршрутизация между точками с помощью MapBox
  • Как сохранить приложение GPS в фоновом режиме без пауз
  • Как я могу получить название города без текущего местоположения (lat-long) в iOS?
  • как конвертировать gps на север и gps на запад до lat / long в объективе c
  • Можно ли использовать Core Location / GPS без подключения к Интернету / отключенной сотовой сети?
  • Чтение данных GPS с изображения, возвращаемого камерой в iOS iphone
  • Получите GPS без предупреждения с разрешением ROOT (джейлбрейк)
  • Действие жизненного цикла приложения iOS 4 службы стандартного определения местоположения работает в фоновом режиме
  • Рекурсивный запрос местоположения Xamarin
  • iOS симулятор и gps
  • Interesting Posts

    Можно ли добавить фиксированный контент в UIScrollView?

    Почему мой делегат недействителен?

    iCloud & NSFileWrapper: отображение в качестве 2 разных файлов в настройках

    iOS – Кисть, которая не накладывается сама

    Приложение Cordova не архивируется с Xcode 7.1 (файл Cordova / CDVViewController.h не найден)

    Приложение отклонено из-за данных в каталоге документов

    Я хотел бы реализовать половину UITableView половину MapView UIView с кнопкой в ​​середине

    Этот сертификат имеет недействительный эмитент: Keychain маркирует все сертификаты как «Недействительный эмитент»

    Нажатие UITableViewController с пользовательской анимацией всегда оживляет название UINavigationItem

    Обнаруживать, если запрос веб-страницы, если из браузера и UIWebView

    Можно ли воспроизводить аудио с AudioQueue в режиме реального времени?

    Сеанс ARKit приостановлен и не возобновлен

    Как правильно отформатировать эту функцию Swift для сопоставления массива?

    Сбросить разрешения, такие как Camera for iOS Apps?

    Ошибка SFHFKeychainUtilsErrorDomain -2000

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