Mapkit и didUpdateToLocation - вычисление точности расстояния на iOS
Я сделал приложение для расчета расстояния при ходьбе / беге для iPhone.
Я сравнил свое приложение с другим запущенным приложением, и никто не дает такое же расстояние.
Nike GPS: 2,1 км
Runtastic: 2,5 км
Мое приложение: 2,9 км
Вот маршрутизация для расчета расстояния:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
float distInMeter = [newLocation distanceFromLocation:oldLocation]; // which returns in meters
}
и я соединяю distInMeters
в другую переменную.
Почему между этими приложениями такая разница? Есть ли другой способ более точно рассчитать расстояние?
Спасибо за вашу помощь.
3 ответа
Эти приложения долгое время работали с неточными данными GPS и создали способы сглаживания случайных скачков в местоположении. Ваша реализация не учитывает старые данные или ложные данные.
Вы можете попробовать реализовать алгоритм Рамера-Дугласа-Пекера ( здесь он есть в Javascript) или прочитать некоторые из этих очень сложных работ, или вы можете просто отбросить старые или очень разные показания GPS и подождать, пока не появится более точное чтение.
Такое различие может произойти из-за способа, которым менеджер местоположения доставляет пользовательские позиции. Допустим, вы идете в определенном направлении, и GPS дает вам положение полностью отклоненное от этого направления, но следующий снова находится на правильном пути. Если вы принимаете во внимание тот, который был выключен, вы учитываете большее расстояние, чем пользователь фактически путешествовал. Так что вы должны отфильтровать это.
То же самое происходит, если GPS дает вам другую позицию, которая находится дальше, чем она должна быть. Допустим, пользователь бегает со скоростью 4 мили в час, поэтому было бы невозможно, чтобы пользователь внезапно начал бегать со скоростью 100 миль в час, поэтому вам следует отфильтровать и его.
По сути, вы должны отфильтровать те, которые вряд ли произойдут, и таким образом вы получите более точное расстояние.
Позиции ВП должны быть отфильтрованы до расчета расстояний. Вы не можете просто суммировать все расстояния между каждым местоположением. ваша функция расстояния правильная, а ваша фильтрация - нет. просто визуализируйте все точки на карте (mkMapView), и вы увидите, что на низких скоростях gps создает зигзагообразные линии случайных ошибок. из этой визуализации вы должны ясно видеть, почему ваши расстояния намного больше.