2

我有一个小问题。我在location.getSpeed()方法上找到了一个方法onLocationChanged(),当我呆在同一个地方时,.getSpeed()通常不会更新/更改为 0km/h。

我应该在哪里找到一个location.getGpeed()方法,当我留在原地时更新显示 0km/h?

还有一个问题。这是我的locationListener

private final LocationListener locationListener = new LocationListener() 
    {public void onLocationChanged(Location location) {     
    boolean var = false;
    float distance;

        if (firstRun) { distance=0; firstRun=false; }
        else
        distance = location.distanceTo (startLocation);
        Tspeed.setText("0km/h");


        if (location.getSpeed()!=0) 
        {
            Tspeed.setText(""+(location.getSpeed()*3600/1000 +"km/h")); 
        }
        else
        {
            Tspeed.setText("0km/h");
        }


        sAllDistance += distance;  // 
        startLocation=location;
        Tdistance.setText(""+(int)SAllDistance+" m");

    }

问题是:当LocationManager得到修复时,第一个AllDistance返回的距离location.distanceTo()是±50米。

我该如何解决?

4

2 回答 2

5

实际上,GPS 不会一直提供准确的信息。即使你呆在同一个地方,有时,纬度和经度也会有一点不同。我认为这取决于您提供的minTime方法。minDistancerequestLocationUpdates(...)

无论如何,一旦尝试更改这些值,如下所示。

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
             1000L(minTime), 2000.0f(minDistance), myLocationListener);

希望能帮助到你。

编辑:

根据文档,您还可以做的另一件事是,如果此修复程序包含速度信息,则location.hasSpeed()返回,否则返回。当你留在同一个地方时,我猜它会返回。truefalsefalse

基于此,您可以执行诸如设置值之类的操作textView

我没试过,但你可以试一次。

于 2012-08-10T11:30:37.587 回答
1

由于大气、卫星几何、附近建筑物等原因,GPS 定位修复中存在连续的、变化的错误。

如果您试图确定 GPS 接收器是否静止,您可以做的最好的事情是检查速度是否低于某个可靠的阈值(例如 1kph)。

您可以执行诸如对速度值进行数字滤波之类的操作,例如以下是一个简单的可调节低通滤波器,可以平滑速度的变化......输入一个低值(例如 3),输出将对输入的变化非常敏感, 输入一个高值(例如 10),输出变得非常平滑。

    /**
     * Simple recursive filter
     *
     * @param prev Previous value of filter
     * @param curr New input value into filter
     * @return New filtered value
     *
     */
    private float filter(final float prev, final float curr, final int ratio) {
      // If first time through, initialise digital filter with current values
      if (Float.isNaN(prev))
        return curr;
      // If current value is invalid, return previous filtered value
      if (Float.isNaN(curr))
        return prev;
      // Calculate new filtered value
      return (float) (curr / ratio + prev * (1.0 - 1.0 / ratio));
    }

    filtSpeed = filter(filtSpeed, speed, 3);
于 2012-08-28T03:00:53.140 回答