0

Google MapsAPIv2を使用してアプリケーションを開発しています。私はカスタムロケーションソースを作成して、マップのロケーション更新とユーザーをフォローするいくつかの機能を提供しました。そのため、ユーザーが「フォロー」ボタンを押すと、Aggiorna [=update]BearingAutoとAggiornaPosAutoがtrueになりました。

@Override
public void OnBearingChanged(float bearing) {
    if (AggiornaBearingAuto)
    {
        mMap.moveCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.builder(mMap.getCameraPosition()).bearing(bearing).build()));
    }
}

@Override
public void OnLocationChanged(Location location) {
    if (AggiornaPosAuto)
    {
        CameraPosition Att = mMap.getCameraPosition();
        mMap.moveCamera(CameraUpdateFactory.newCameraPosition(
                CameraPosition.builder().bearing(Att.bearing).
                target(new LatLng(location.getLatitude(), location.getLongitude()))
                .tilt(Att.tilt).zoom(Att.zoom).build()
                ));
    }
}

これらの関数は、クラスから提供された値に従って、CameraPositionを更新します。

さて、そのクラスでは、ベアリングの更新を提供するメソッドは次のとおりです。

@Override
public void onSensorChanged( SensorEvent sensorEvent ) {

    float[] inR = new float[16];
    float[] I = new float[16];
    float[] orientVals = new float[3];

    double azimuth = 0;
    double pitch = 0;
    double roll = 0;
    // Gets the value of the sensor that has been changed
    switch (sensorEvent.sensor.getType()) {  
        case Sensor.TYPE_ACCELEROMETER:
            gravity = sensorEvent.values.clone();
            break;
        case Sensor.TYPE_MAGNETIC_FIELD:
            geomag = sensorEvent.values.clone();
            break;
    }

    // If gravity and geomag have values then find rotation matrix
    if (gravity != null && geomag != null) {

        // checks that the rotation matrix is found
        boolean success = SensorManager.getRotationMatrix(inR, I, gravity, geomag);
        if (success) {
            SensorManager.getOrientation(inR, orientVals);
            azimuth = Math.toDegrees(orientVals[0]);
            pitch = Math.toDegrees(orientVals[1]);
            roll = Math.toDegrees(orientVals[2]);
        }
    }

        //finally, call OnBeraingChange in Listener
    LocListener.OnBearingChanged((float) azimuth);
}

Ok。したがって、問題は次のとおりです。センサーが-4、0、+ 4、0、+ 6、-5などを継続的に提供している場合のように、マップが煩わしいほど速く移動することがあります。これにより、この機能を処理できなくなります。グーグルマップはどのようにして地図の回転をとてもスムーズで完全に安定させることができますか?彼らは一種の慣性を実装しましたが、どうやって?? 誰かがそのような機能を実装するアイデアを持っていますか?

4

2 に答える 2

0

カルマンフィルターを実装することで問題を管理しました。

于 2013-02-23T09:24:26.077 に答える
0

同じ問題がありました。磁力計と加速度計の値がより不安定であるため、ローパスフィルターを実装する必要があります。または、ローパスフィルターに似たものを1つ実装する必要があります。これを見てください:信頼性の低いAndroidコンパスの向き(ローパスフィルター)

于 2013-03-14T00:13:15.610 に答える