Я пытаюсь понять это и думаю, что что-то можно сделать с помощью свойства CLLocationManager
distanceFilter
.Свойство позволяет ограничить didUpdateToLocation
делегирование вызовов обновлениям, которые находятся на минимальном расстоянии от предыдущего обновления.Например, с проблемой одометра, скажем, вы стоите на месте, но GPS ошибочно сообщает о положении на 1 м вокруг вас.Если вы установите distanceFilter
на 2, то ни одно из этих обновлений не будет зарегистрировано как движение.
Хитрость заключается в том, чтобы найти значение distanceFilter
, которое работает, и я считаю, что это как-то связано сhorizontalAccuracy
GPS (который я предполагаю является причиной ошибочных обновлений) и скорость, с которой вы путешествуете.horizontalAccuracy
должно быть хорошо для активного отдыха, но предполагается, что эти небольшие неточности накапливаются и приводят к неправильным показаниям одометра.
Если каждый вызов didUpdateLocation
вносит небольшую ошибку (скажем, додо 10 см на чтение), тогда имеет смысл медленная активность, такая как ходьба, будет крайне неточной, если на каждый метр звонить по номеру didUpdateToLocation
.Это будет до (10 см / 1 м =) 10% ошибок на обновление.Если это было сделано на автомобиле, движущемся со скоростью 100 км / ч, а distanceFilter
был установлен на 10 м (что является безопасным параметром, поскольку автомобиль, движущийся со скоростью 100 км / ч, будет двигаться очень близко к прямой линии более 10 м), то это то же самоеошибка 10см будет иметь максимум (10см / 10м =) 1% ошибок на обновление.Возможно, это сложнее, чем это, но я пытаюсь проиллюстрировать, что скорость играет роль.
Я думаю, что решение состоит в том, чтобы выбрать значение для distanceFilter
, которое минимизирует ошибочные обновления, но самое главное учитываетскорость пользователя (например, с автомобилем в предыдущем примере).Кто-нибудь хочет выяснить алгоритм или формулу?