Невероятно неточные точки GPS. Какова причина?

Я разработал приложение для Android, для хранения местоположения пользователя GPS.

Один из моих клиентов дал мне свое устройство, и я заметил, что иногда точность устройства действительно плохая и невероятная. Иногда устройство возвращает точки около 200 километров от фактического местоположения.

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

Устройство Samsung SM-T111 с Android 4.2.2, и я использую только провайдера GPS для получения местоположений (LocationManager.GPS_PROVIDER).

Я хочу знать, что вызывает проблему, для такой неточности?

Я непосредственно храню полученные очки от провайдера. Это мой код в onLocationChanged:

UPDATE

        @Override
        public void onLocationChanged(Location location) {
            try {

                    if (location.getAccuracy() <= MAX_DISTANCE_TOLERANCE) {

                        gotLocation(new GPSLocation(location.getLatitude(),
                                location.getLongitude(), location.getTime(),
                                location.getAccuracy(),
                                location.getProvider(), location.getSpeed()));
                    }               

            } catch (Exception e) {
                MessageBox.showExceptionToast(_context, e);
            }
        }

введите описание изображения здесь

введите описание изображения здесь

Ответы

Ответ 1

Я хочу знать, что может быть проблемой для такой неточности?

Оборудование/прошивка, скорее всего. Другими словами, винить Samsung.

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

Вы можете создать более адаптивный фильтр. Помимо проверки точности для MAX_DISTANCE_TOLERANCE, вы можете:

  • Рассчитайте время между последним местоположением, которое вы получили, и новым, которое вы сейчас обрабатываете.
  • Рассчитайте максимальное расстояние, которое может быть покрыто за это время, на основе некоторой максимальной скорости, ожидаемой от устройства.
  • Рассчитайте расстояние, сообщаемое между этими двумя местоположениями (для этого есть статический метод для Location)
  • Отклонить местоположения, где указанное расстояние больше, чем вы думаете, что устройство могло перемещаться за этот период времени.

Например, ваше первое плохое исправление приходит через 20 минут после предыдущего. Если вы не думаете, что устройство может путешествовать со скоростью 600 км/час, вы отклоните плохое исправить как нереалистичное.

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

Ответ 2

Если вы не доверяете API Google Fused или любому другому алгоритму, и у вас есть некоторые сведения об отформатированных данных NMEA, необработанных данных GPS, я рекомендую вам глубоко погрузиться в необработанные данные GPS и посмотреть, что на самом деле продолжается.

Вы можете получать сообщения NMEA_0183 GPS с набора микросхем GPS и анализировать спутниковые группировки, SNR, DOP, lat, lon и т.д.

LocationManager LM = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        ((LocationManager)getSystemService(Context.LOCATION_SERVICE)).requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,new LocationListener(){
            @Override
            public void onLocationChanged(Location loc) {}
            @Override
            public void onProviderDisabled(String provider) {}
            @Override
            public void onProviderEnabled(String provider) {}
            @Override
            public void onStatusChanged(String provider, int status,Bundle extras) {} });

        //for API23 and below
        LM.addNmeaListener(new GpsStatus.NmeaListener() {
        public void onNmeaReceived(long timestamp, String nmea) {
            Log.d(TAG, nmea+"\n");
        }});

       //for API24 and above
       LM.addNmeaListener(new OnNmeaMessageListener() {
        public void onNmeaMessage(String nmea, long timestamp) {
            Log.d(TAG, nmea+"\n");
        }});

Вот некоторые полезные предложения NMEA:

GGA - Глобальная система определения местоположения Fix Data

GSA - GPS DOP и активные спутники

GSV - спутники в поле зрения

ZDA - время и дата - UTC, день, месяц, год и локальный часовой пояс

Ответ 3

Если вы используете Google платный провайдер, тогда эти ошибки обязательно произойдут, поэтому, если вы хотите получить самые точные результаты и ограничить их только GPS, используйте платформу определения местоположения Android вместо API местоположений сервисов Google Play.

Вы также можете фильтровать основные изменения расстояния, если вы хотите продолжить использование API местоположений Google.

Ответ 4

Для этого может быть много причин. Список некоторых из них.

(1) GPS hardware used with in device.
(2) Weather condition( This will not generate much difference in distance. This may make a difference of about 20-30 KM as per my testing )
(3) Nearby location. This includes buildings and all other.

Правда, некоторое время Android GPS начинает вести проводку. Я также столкнулся с этой проблемой при создании приложения на базе кабины.

Решение CommonsWare - это почти решение вашей проблемы. Там вы можете придумать еще один конкретный алгоритм, чтобы выполнить задачу.

При тестировании этого сценария я обнаружил эту проблему с устройствами One-Plus-One, в то время как в устройствах One-Plus-Two не было проблем.

РЕШЕНИЕ. Вы должны проверить максимальное расстояние, на которое пользователь может путешествовать в пределах вашего временного интервала. Здесь временной интервал - время обновления вашего местоположения GPS. Это расстояние должно рассчитываться от имени вашей предыдущей действительной широты и долготы относительно вашей текущей широты и долготы.

В соответствии с вашими журналами я вижу разницу во времени между обновлениями вашего местоположения. Убедитесь, что у вас есть фиксированные временные интервалы для вашего обновления.

Ответ 5

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

Это выполняется с использованием перегруженного Метод LocationManager.requestLocationUpdates(). Эти свойства отрегулируйте, насколько агрессивно устройство запрашивает обновления местоположения на минимальное время и пройденное минимальное расстояние.

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,listener);

Этот метод разрешит вашу проблему очень простой набор технических требований для динамически меняющихся параметров requestLocationUpdates():

public void onLocationChanged(Location location) {
     if(location.getAccuracy() < 100.0 && location.getSpeed() < 6.95){
          //Do something
     }
     else{
          //Continue listening for a more accurate location
     }
}
  • Запустите приложение, используя minTime = 0 и minDistance = 0. Используйте агрессивную настройку, чтобы как можно быстрее получить точное местоположение.

  • Как только точность будет меньше 50 метров и скорость меньше 45 миль в час, установите minTime = 5000 и minDistance = 25.

  • Скорость равна 0 более 1 часа. Отключить прослушиватели местоположения и уведомить пользователя.

  • Батарея разряжается. Отключите прослушивание местоположения и сообщите пользователю.

Ответ 6

Вы можете выбрать технику Fused Location Api для получения лучших результатов,

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

Вы можете следить за Ссылка