GPS坐标变化太频繁

时间:2012-09-23 20:57:19

标签: android gps

我使用以下代码检查GPS坐标,但问题是如果我站在同一个地方,坐标会发生变化,距离会在4到20 mts之间。 我想改变它只有当我移动了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公里时间内数据也是错误的。

请建议我应该做些什么。

3 个答案:

答案 0 :(得分:0)

我也看过这个,当我拿几个位置读数时我没有动过。您可以获得具有不同精度的可变结果。 你可以试着拿10个位置读数,拿一个最准确的,并忽略其余的。然后在进行下一次读数时,确保它位于前一位置精度的两倍。例如,如果您的第一个位置具有16米的精度,请确保下一个读数距离前一个位置至少32米并且精度优于32米。

答案 1 :(得分:0)

您需要组合使用minTime和minDistance。您为两者传递零和零,因此更新之间的最小时间将至少为零秒,最小距离将为零。因此,将minTime设置为合理的时间,将minDistance设置为10,持续10米。

locationManager_gps.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, 0, 0,
                    new MyLocationListener_gps());

答案 2 :(得分:0)

没有灵丹妙药可以解决这个问题...... 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)

祝你好运