Получить направление (компас) с двумя точками долготы / широты - PullRequest
19 голосов
/ 14 декабря 2011

Я работаю над «компасом» для мобильного устройства.У меня есть следующие пункты:

point 1 (current location): Latitude = 47.2246, Longitude = 8.8257
point 2 (target  location): Latitude = 50.9246, Longitude = 10.2257

Также у меня есть следующая информация (с моего телефона-андроида):

The compass-direction in degree, wich bears to the north. 
For example, when I direct my phone to north, I get 0°

Как создать стрелку типа компаса, котораяпоказывает направление к точке?

Есть ли математическая проблема для этого?

спасибо!

РЕДАКТИРОВАТЬ: Хорошо, я нашел решение, это выглядит так:

/**
 * Params: lat1, long1 => Latitude and Longitude of current point
 *         lat2, long2 => Latitude and Longitude of target  point
 *         
 *         headX       => x-Value of built-in phone-compass
 * 
 * Returns the degree of a direction from current point to target point
 *
 */
function getDegrees(lat1, long1, lat2, long2, headX) {

    var dLat = toRad(lat2-lat1);
    var dLon = toRad(lon2-lon1);

    lat1 = toRad(lat1);
    lat2 = toRad(lat2);

    var y = Math.sin(dLon) * Math.cos(lat2);
    var x = Math.cos(lat1)*Math.sin(lat2) -
            Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
    var brng = toDeg(Math.atan2(y, x));

    // fix negative degrees
    if(brng<0) {
        brng=360-Math.abs(brng);
    }

    return brng - headX;
}

Это прекрасно работает для меня!

Ответы [ 4 ]

16 голосов
/ 30 марта 2014

О, забыл сказать, что в конце концов нашел ответ.Приложение должно определить направление компаса транзитного транспортного средства и его пункт назначения.По сути, интересная математика для получения кривизны Земли, нахождения угла / показания компаса, а затем сопоставления этого угла с общим значением компаса.Конечно, вы можете просто сохранить compassReading и применить его как величину поворота для вашего изображения.Обратите внимание, что это усредненное определение направления движения автомобиля до конечной точки (автобусной станции), означающее, что он не может знать, что делает дорога (поэтому это, вероятно, лучше всего относится к самолетам или дерби на роликах).1003 * то есть: VehicleBearing (mybus, busstation) может возвращать "NW" означает, что он движется на северо-запад

1 голос
/ 29 августа 2017

Я нашел несколько полезных формул GPS-координат в математике здесь .Для этого случая вот мое решение

 private double getDirection(double lat1, double lng1, double lat2, double lng2) {

    double PI = Math.PI;
    double dTeta = Math.log(Math.tan((lat2/2)+(PI/4))/Math.tan((lat1/2)+(PI/4)));
    double dLon = Math.abs(lng1-lng2);
    double teta = Math.atan2(dLon,dTeta);
    double direction = Math.round(Math.toDegrees(teta));
    return direction; //direction in degree

}
0 голосов
/ 31 января 2018

Я не мог понять ваше решение, подсчет уклона сработал для меня. Чтобы изменить efwjames и ваш ответ. Это должно сделать -

import math
def getDegrees(lat1, lon1, lat2, lon2,head):
    dLat = math.radians(lat2-lat1)
    dLon = math.radians(lon2-lon1)
    bearing = math.degrees(math.atan2(dLon, dLat))
    return head-bearing
0 голосов
/ 14 декабря 2011

Вам нужно вычислить евклидов вектор между вашей начальной и конечной точкой, а затем рассчитать его угол (скажем, относительно положительного X), который будет углом, на который вы хотите повернуть стрелку.

...