【问题标题】:location.getspeed() updatelocation.getspeed() 更新
【发布时间】:2012-08-10 10:47:07
【问题描述】:

我有一个小问题。我在onLocationChanged() 方法上找到了location.getSpeed() 方法,而.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 得到修复时,从location.distanceTo() 返回的第一个AllDistance 是±50 米。

我该如何解决?

【问题讨论】:

    标签: android gps location


    【解决方案1】:

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

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

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

    希望对你有帮助。

    编辑:

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

    在此基础上,您可以为textView 设置值等。

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

    【讨论】:

    • 好的,我已经改变了这个,我添加了 if (location.hasSpeed()) { if (location.getSpeed() != 0) {... 但是 location.getSpeed() 有时仍然显示当我留在原地时速度>0
    • @KrystianBersztolc 这就是我在回答GPS won't give exact information all the time 中所经历和提到的:)
    【解决方案2】:

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

    如果您要确定 GPS 接收器是否静止,您可以做的最好的事情是检查速度是否低于某个可信的阈值(例如 1 公里/小时)。

    您可以执行诸如对速度值进行数字滤波之类的操作,例如下面是一个简单的可调节低通滤波器,可以平滑速度的变化...输入一个低值(例如 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-16
      • 2016-04-07
      • 2014-09-15
      • 2014-03-05
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多