Определите направление компаса от одного широты / долготы к другому - PullRequest
0 голосов
/ 09 июля 2010

Есть ли у кого-нибудь алгоритм для определения направления от одного широты / долготы к другому (псевдокод):

CalculateHeading( lat1, lon1, lat2, long2 ) returns string heading

Где заголовок, например, NW, SW, E и т. Д.

По сути, у меня есть две точки на карте, и я хочу получить общее представление о направлении, учитывая, что в 50 милях к востоку и в одной миле к северу это просто восток, а не северо-восток.

Ответы [ 3 ]

17 голосов
/ 09 июля 2010

Этот сайт имеет основной алгоритм:

// in javascript, not hard to translate...
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 = Math.atan2(y, x).toDeg();

ОБНОВЛЕНО: Смотрите здесь полный алгоритм Отображение математики и JavaScript

То 'дадим вам число от 0 до 360, тогда вам просто нужно просто найти:

var bearings = ["NE", "E", "SE", "S", "SW", "W", "NW", "N"];

var index = brng - 22.5;
if (index < 0)
    index += 360;
index = parseInt(index / 45);

return(bearings[index]);

Важно отметить, что ваше направление действительно меняется при движении по земле.Приведенный выше алгоритм показывает, что вы начальный ориентир, но если вы путешествуете на большие расстояния, ваш ориентир будет значительно отличаться, когда вы достигнете цели (если вы путешествуете только на короткое расстояние [<несколько сотенкм], тогда это, вероятно, не изменится достаточно, чтобы быть проблемой). </p>

2 голосов
/ 09 июля 2010

Вы помните свои функции триггера?Т.е.

TOA : Tan (θ) = противоположный над соседним

В псевдокоде:

function getDir(lat1, long1, lat2, long2) {
    margin = π/90; // 2 degree tolerance for cardinal directions
    o = lat1 - lat2;
    a = long1 - long2;
    angle = atan2(o,a);

    if (angle > -margin && angle < margin):
            return "E";
    elseif (angle > π/2 - margin && angle < π/2 + margin):
            return "N";
    elseif (angle > π - margin && angle < -π + margin):
            return "W";
    elseif (angle > -π/2 - margin && angle < -π/2 + margin):
            return "S";
    }
    if (angle > 0 && angle < π/2) {
        return "NE";
    } elseif (angle > π/2 && angle < π) {
        return "NW";
    } elseif (angle > -π/2 && angle < 0) {
        return "SE";
    } else {
        return "SW";
    }
}

Редактировать 1: Как указывали Пит и Дин, это не учитывает кривизну Земли.Для более точных расчетов для точек, удаленных от экватора, вам нужно будет использовать формулы сферических треугольников , которые используются в ответе Дина.

Редактировать 2: Еще одно исправление;как отметил Пит, arctan() не дает правильных углов, поскольку -1 / -1 и 1/1 одинаковы (как и -1/1 и 1 / -1).arctan2(y, x) - это вариант с двумя аргументами arctan(), предназначенный для компенсации этого.arctan() имеет диапазон (-π, π], положительный для y >= 0 и отрицательный для y < 0.

0 голосов
/ 09 июля 2010

Преобразовать в числовой угол и использовать результат для поиска текста.Например, -22.5 .. + 22.5 = N. + 22.5..67.5 = NE, 67.5..112.5 = E и т. Д. Конечно, предполагается, что вы используете только N, NE, E, SE, S, SW, W, NW - если вы решите (например) пойти со старыми «32 точками компаса», каждая текстовая строка, очевидно, представляет меньший диапазон.

...