Я использую FusedLocationProviderClient
для получения обновлений местоположения в службе переднего плана. При тестировании и наблюдениях в течение нескольких дней я обнаружил неправильные местоположения, которые находились далеко от моего фактического местоположения примерно на 4 км, подобно этому
, но у LocationResult
была точность 24 метра. Как это вообще возможно?
Его можно устранить, если точность была около 4 км. Такое поведение встречается не очень часто, но, по крайней мере, один раз в 4 из 10 устройств. Это становится проблемой, когда я вычисляю пройденное расстояние.
Я могу сказать, что это не кэшированное местоположение, потому что я обычно выключал и включал Location Services каждый день. (Согласно документам, отключение служб определения местоположения очищает расположение кэша.)
Любая идея, почему это дает неправильное местоположение и как это устранить? А также очистка кеш-памяти без отключения Location Services?
FusedLocationProvider МОЖЕТ давать неверные результаты, например, когда соединение с GPS для устройства не работает (или недостаточно спутников для просмотра точных данных). Он будет использовать данные о ближайшей сотовой вышке/местонахождении, предоставленные маршрутизатором Wi-Fi (Google отслеживает это автоматически), давая ДИКОМ Неверные результаты в тех местах, где Google не имеет сильного отображения местоположения - что находится за пределами городского центра.
У вас есть два варианта:
Используйте решение, не основанное на googleplay, основанное на сервисе определения местоположения - оно позволяет игнорировать данные о местоположении, отличные от gps (Wi-Fi/сотовая связь).
LocationManager locationManager = (LocationManager)
getApplicationContext().getSystemService(LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_Provider);
Вы даже можете указать количество спутников, необходимых для приемлемых данных, чтобы вы могли получить ДЕЙСТВИТЕЛЬНО точные данные о местоположении. Вы потеряете информацию, когда GPS не получит координаты (например, в помещении), но взамен будет меньше "шума" из неверно сопоставленного местоположения, согласно вашему требованию.
Используйте API "привязки к дорогам". Существует бесплатная версия, использующая открытые данные карт улиц, называемая Project OSRM (Open Source Routing Machine), которая обеспечивает бэкэнд при размещении (локально или в облаке) с использованием докера или создания исходного кода самостоятельно (подробности в ссылке).
curl "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true
"
Этот запрос вернет местоположение, которое "привязано" к ближайшей дороге. Существуют различные варианты, такие как выделение приоритета для автомагистралей и т.д. Затем вы можете отбросить точки, которые не находятся на "пути", на котором ранее находился пользователь, так как быстрый переход к дороге в 4 км и последующий возврат маловероятны.