Координаты GPS меняются слишком часто

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

    locationManager_gps = (LocationManager) this
                    .getSystemService(Context.LOCATION_SERVICE);
            locationManager_gps.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, 0, 0,
                    new MyLocationListener_gps());

class MyLocationListener_gps implements LocationListener {
        public void onLocationChanged(Location location) {

            clat = location.getLatitude();
            clon = location.getLongitude();

            if (clat != plat || clon != plon) {
                float[] results = new float[3];
                Location.distanceBetween(plat, plon, clat, clon, results);

                if (flag_gps == 0) {
                    flag_gps = 1;
                } else {
                    GeoPoint geoPoint = new GeoPoint((int) (clat * 1E6),
                            (int) (clon * 1E6));
                    mapView.getController().animateTo(geoPoint);
                    draw = new MyOverLay(geoPoint);
                    mapView.getOverlays().add(draw);

                    dist_mtr += results[0];

                }
                plat = clat;
                plon = clon;
            }
        }

Если я использую 50 в качестве минимального расстояния между обновлениями, тогда все работает нормально. Я также пытался сделать это 30, но также данные были неправильными за период в 4 км во время путешествия на машине.

Пожалуйста, предложите, что мне делать.


person Pankaj Kushwaha    schedule 23.09.2012    source источник
comment
Я дал случайное значение для plat и plon выше в майском коде и сделал flag_gps = 0, чтобы пропустить первое обновление изменения местоположения.   -  person Pankaj Kushwaha    schedule 24.09.2012


Ответы (3)


Я тоже это видел, когда снимал несколько показаний о местоположении и не двигался. Вы можете получить переменные результаты с различной точностью. Вы можете попробовать взять, скажем, 10 показаний местоположения, выбрать одно с наибольшей точностью и проигнорировать остальные. Затем при следующем измерении убедитесь, что оно расположено на расстоянии, которое в два раза превышает точность предыдущего местоположения. Например, если ваше первое местоположение имеет точность, скажем, 16 метров, убедитесь, что следующее показание находится на расстоянии не менее 32 метров от предыдущего местоположения и имеет точность выше 32 метров.

person John J Smith    schedule 23.09.2012

Вам нужно использовать minTime и minDistance в комбинации. Вы передаете ноль и ноль для обоих, поэтому минимальное время между обновлениями будет не менее нуля секунд, а минимальное расстояние будет равно нулю. Поэтому установите minTime на разумное время и minDistance на 10 для десяти метров.

locationManager_gps.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, 0, 0,
                    new MyLocationListener_gps());
person Flynn81    schedule 23.09.2012

Нет никакого волшебного средства, чтобы решить эту проблему... GPS не является точным на 100%, и у вас всегда будут разные показания каждый раз, когда вы получаете новое обновление местоположения.

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

clat = plat + (clat-plat) * 0.2; // you should adjust the 0.2 value to the best results
clon = plon + (clon-plon) * 0.2;
....
//your code
....
plat = clat;
plon = clon;

При этом эффект внезапных изменений значений будет сведен к минимуму, что хорошо для ложных изменений положения, но также задержит реакцию на реальные изменения положения при движении устройства. Вы должны тщательно выбирать значение постоянного умножения (0,2 выше), чтобы получить наилучшие результаты.

Вы даже можете сделать лучше, используя переменную вместо константы, и настроить ее значение в зависимости от точности обновления локации (хорошая точность, вы делаете переменную близкой к 1, точность заливки, вы делаете переменную близкой к 0)

удачи

person Luis    schedule 24.09.2012