0

我使用以下代码检查 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 公里内的数据也有误。

请建议我应该做什么。

4

3 回答 3

0

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

locationManager_gps.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, 0, 0,
                    new MyLocationListener_gps());
于 2012-09-23T23:42:54.053 回答
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)

祝你好运

于 2012-09-24T00:31:56.987 回答
0

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

于 2012-09-23T21:21:32.313 回答