Использование датчика ориентации для указания на конкретное местоположение

Я пытаюсь реализовать стрелку, которая использует датчик ориентации, чтобы указать на конкретное место. Google Места реализуют эту стрелку в ListView для каждого найденного места.

Мне удалось получить азимут, но, учитывая местоположение, я не знаю, как перейти к вычислению нужного мне угла. Более того, мне нужно сделать переходы с реального северного и магнитного севера. Есть ли у кого-нибудь пример такой реализации?

Спасибо заранее.

Ответ 1

Я решил это.

float azimuth = // get azimuth from the orientation sensor (it quite simple)
Location currentLoc = // get location from GPS or network
// convert radians to degrees
azimuth = Math.toDegrees(azimuth);
GeomagneticField geoField = new GeomagneticField(
             (float) currentLoc.getLatitude(),
             (float) currentLoc.getLongitude(),
             (float) currentLoc.getAltitude(),
             System.currentTimeMillis());
azimuth += geoField.getDeclination(); // converts magnetic north to true north
float bearing = currentLoc.bearingTo(target); // (it already in degrees)
float direction = azimuth - bearing;

Если вы собираетесь нарисовать стрелку или что-то еще, чтобы указать направление, используйте canvas.rotate(-direction). Мы передаем отрицательный аргумент, потому что вращение холста против часовой стрелки.