Диспетчер местоположений, предоставляющий старые местоположения с новыми временными метками

#ios #cllocationmanager #cllocation

#iOS #cllocationmanager #cllocation

Вопрос:

У меня возникла следующая проблема в моем приложении для iPhone:

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

 - (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {

    numberOfUpdatesInInterval  ;
    NSLog(@"%d;%f;%f;%.0f;%@;%@;%@",
                              numberOfUpdatesInInterval,
                              newLocation.coordinate.latitude,
                              newLocation.coordinate.longitude,
                              newLocation.horizontalAccuracy,
                              newLocation.timestamp,
                              [self getCurrentDateAsString],
                              newLocation);
}
  

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я получаю новые местоположения, где временная метка новая, но координаты все еще являются старыми местоположениями, которые я получил ранее. Я тестировал это, когда ехал на своей машине со скоростью 120 км / ч, получая одни и те же координаты несколько раз, но с разными временными метками. У меня такая же проблема в iOS 4 и 5.

Как это возможно? Или как я могу справиться с этой проблемой?

Комментарии:

1. какую точность вы запрашиваете у cllocationmanager?

2. @jackslash: я использую desiredAccuracy = kCLLocationAccuracyBest

3. Пожалуйста, опубликуйте реализацию -locationManager:didUpdateToLocation:fromLocation: .

4. получили ли вы ответ на этот вопрос?

5. @HoangPham: Нет, мне все еще не ясно, почему это происходит.

Ответ №1:

Есть несколько способов, которыми iPhone получает свое местоположение.

  • сигнал сотовой связи
  • точки доступа Wi-Fi
  • Спутники GPS

Самый быстрый поиск местоположения — это местоположение сигнала сотовой связи. Пока у вас были данные в последнее время, большинство локальных вышек будут кэшироваться. Точность вышки сотовой связи может варьироваться от 500 м до 1500 м и более.

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

Самый медленный — GPS. GPS в iPhone — это aGPS. Он использует данные из местоположений вышек сотовой связи, чтобы лучше определить ваше местоположение. Если у телефона нет подключения для передачи данных и он не находится рядом с Wi-Fi, исправление может занять от 2 до 4 минут. С информацией о вышке сотовой связи это может занять 30 секунд.

Из документов Apple:

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

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

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

Комментарии:

1. Я даже получаю эту проблему с очень хорошей точностью по горизонтали (т. Е. 47,42 м). Единственная проблема заключается в том, что местоположение старое, но временная метка изменилась. Я понимаю, что он кэшируется, но тогда я бы ожидал, что временная метка будет временной меткой с момента, когда местоположение было захвачено ранее, а не обновленным (более поздним). Таким образом, я не могу определить, не переместился ли я или не получил более старое кэшированное местоположение.

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

Ответ №2:

Диспетчер местоположений по умолчанию обновляет местоположение как

LocationManager.distanceFilter = kCLDistanceFilterNone;

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

Поэтому лучше всего установить

 locationManager.distanceFilter = 4.0f; 
  

// это отправит новые сведения об обновлении местоположения только при перемещении каждые 4 метра от вашего текущего местоположения.

Комментарии:

1. Я также исправил это с помощью комбинированного использования временной метки, фильтра горизонтальной частоты и расстояния ….. Приветствия 🙂

2. Я прекратил работу над этим проектом с апреля 2014 года. Прошло уже 3 года. Итак, я не знаю, в чем дело сейчас. Хорошо, что вы нашли решение.