location.getspeed()更新

时间:2012-08-10 10:47:07

标签: android gps location

我有一个小问题。我在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米。

我该如何解决?

2 个答案:

答案 0 :(得分:5)

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

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

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

希望它有所帮助。

修改:

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

基于此,您可以为textView等设置值。

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

答案 1 :(得分: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);