2013-03-01 6 views
8

Я пытаюсь получить азимут, в градусах (т.е. 0-360), используя следующий метод:Android азимут

float[] mGravity; 
float[] mGeomagnetic; 
public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
     mGravity = event.values; 
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) 
     mGeomagnetic = event.values; 
    if (mGravity != null && mGeomagnetic != null) { 
     float R[] = new float[9]; 
     float I[] = new float[9]; 
     boolean success = SensorManager.getRotationMatrix(R, I, mGravity, 
       mGeomagnetic); 
     if (success) { 
      float orientation[] = new float[3]; 
      SensorManager.getOrientation(R, orientation); 
      float azimut = orientation[0]; 
      bearing.setText("Bearing: "+ azimut); 
     } 
    } 
} 

Значение азимута (т.е. orientation[0]) должен быть 0 < = азимут < 360, но Когда я вращаю свое устройство, я получаю только значения от -3 до 3. Может кто-нибудь, пожалуйста, скажите мне, что может быть проблемой?

ответ

10

Значения в радианах, вы должны преобразовать степень дуги

int azimut = (int) Math.round(Math.toDegrees(orientation[0])); 
+0

Большое спасибо @Hoan Нгуен – user1135357

+0

ориентация [0] только кажется, дает diff с момента последнего чтения. Я преобразовал свое значение в градусы, но значения все еще очень малы. Есть ли способ получить фактический подшипник устройства (0 - 360 градусов) в одном чтении? –

+0

Это не diff, это фактический подшипник относительно магнитного севера. Что-то не так с вашим кодом, если ваше чтение всегда является небольшим значением. –

4

Это правда, что в радианы. Спасибо Хоан. Я добавил некоторую логику, чтобы получить, что подшипник в градусах от 0 до 360 becuase, если я только преобразовал его в градусы, я получаю значения от -180 до 180.

float azimuthInRadians = orientation[0]; 
float azimuthInDegress = (float)Math.toDegrees(azimuthInRadians)+360)%360; 
0
This answer applies to Google Maps api v2. 
It is possible by registering your application with Sensor Listener for Orientation and get the 
angle relative to true north inside onSensorChanged and update camera accordingly. 
Angle can be used for bearing. Following code can be used: 

Instead of using Sensor.TYPE_ORIENTATION try using getOrinetation api. Sensor.TYPE_ORIENTATION 
has been deprecated. 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    if (sensorManager != null) 
     sensorManager.registerListener(this, 
       sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
       SensorManager.SENSOR_DELAY_GAME); 
} 

public void onSensorChanged(SensorEvent event) { 

    float compassBearingRelativeToTrueNorth = Math.round(event.values[0]); 

    Log.d(TAG, "Degree ---------- " + degree); 

    updateCamera(compassBearingRelativeToTrueNorth); 

} 

private void updateCamera(float bearing) { 
    CameraPosition oldPos = googleMap.getCameraPosition(); 

    CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing) 
      .build(); 

    googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos)); 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^