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と思いminDistanceますrequestLocationUpdates(...)

とにかく、一度これらの値を以下のように変更してみてください。

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

それが役に立てば幸い。

編集:

もう 1 つできることは、ドキュメントによると、この修正に速度情報が含まれている場合はlocation.hasSpeed()返され、そうでない場合は返されることです。同じ場所にいると戻ってくるのかな。truefalsefalse

これに基づいて、値の設定textViewなどを行うことができます。

私は試していませんが、一度試すことができます。

于 2012-08-10T11:30:37.587 に答える
1

大気、衛星の形状、近くの建物などの要因により、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);
于 2012-08-28T03:00:53.140 に答える