Ok, j'ai trouvé une solution. Pour tous ceux qui essaient de faire ça, vous avez besoin.. :
a) cap : votre cap à partir du compas matériel. Il est exprimé en degrés à l'est de magnétique nord
b) le relèvement : le relèvement de votre emplacement à l'emplacement de destination. Il est exprimé en degrés à l'est de vrai nord.
myLocation.bearingTo(destLocation);
c) la déclinaison : la différence entre le nord géographique et le nord magnétique.
Le cap renvoyé par le magnétomètre + l'accéléromètre est exprimé en degrés à l'est du nord (magnétique) réel (-180 à +180). Vous devez donc obtenir la différence entre le nord et le nord magnétique pour votre emplacement. Cette différence est variable selon l'endroit où vous vous trouvez sur la terre. Vous pouvez l'obtenir en utilisant la classe GeomagneticField.
GeomagneticField geoField;
private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
geoField = new GeomagneticField(
Double.valueOf(location.getLatitude()).floatValue(),
Double.valueOf(location.getLongitude()).floatValue(),
Double.valueOf(location.getAltitude()).floatValue(),
System.currentTimeMillis()
);
...
}
}
Avec ces données, vous calculez l'angle de la flèche à dessiner sur votre carte pour indiquer votre orientation par rapport à votre objet de destination plutôt que par rapport au nord géographique.
Ajustez d'abord votre cap en fonction de la déclinaison :
heading += geoField.getDeclination();
Deuxièmement, vous devez décaler la direction dans laquelle le téléphone est orienté (cap) par rapport à la destination cible plutôt que le nord réel. C'est la partie qui m'a bloqué. La valeur du cap renvoyée par la boussole vous donne une valeur qui décrit où se trouve le nord magnétique (en degrés à l'est du nord géographique) par rapport à l'endroit où pointe le téléphone. Par exemple, si la valeur est -10, vous savez que le nord magnétique se trouve à 10 degrés sur votre gauche. Le relèvement vous donne l'angle de votre destination en degrés à l'est du nord vrai. Après avoir compensé la déclinaison, vous pouvez utiliser la formule ci-dessous pour obtenir le résultat souhaité :
heading = myBearing - (myBearing + heading);
Vous devrez ensuite convertir les degrés à l'est du nord géographique (-180 à +180) en degrés normaux (0 à 360) :
Math.round(-heading / 360 + 180)
0 votes
Vous pouvez consulter cet article de blog sur les capteurs et l'orientation de l'écran : Android-developers.blogspot.com/2010/09/
0 votes
Merci, j'ai déjà lu cet article. Malheureusement, il ne répond pas au problème posé dans la question.
2 votes
J'ai trouvé une solution ici qui m'a bien réussi stackoverflow.com/questions/7978618/