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

double computeHeading(double latitude1, double longitude1, double latitude2, double longitude2)
{
    double degToRad = PI / 180.0;
    double phi1 = latitude1*degToRad;
    double phi2 = latitude2*degToRad;
    double lam1 = longitude1*degToRad;
    double lam2 = longitude2*degToRad;

    double x,y;
    x = cos(phi2) * sin(lam2-lam1);
    printf("X is %lf\n", x);
    y = cos(phi1) * sin(phi2) - sin(phi1) * cos(phi2) * cos(lam2-lam1);
    printf("Y is %lf\n", y);
    return atan2(x,y)*180/PI;
}

Я использую указанную выше функцию для определения истинного пеленга с севера между двумя географическими координатами.

В настоящее время я разрабатываю небольшой виджет навигации, который использует данные GPS от датчиков Android. У виджета есть стрелка, обращенная к точке, удаленной от текущего местоположения устройства. Направление стрелки меняется в зависимости от текущего местоположения и азимута устройства, чтобы всегда смотреть на удаленную точку.

Вот сценарий:

Я нахожусь в месте, обращенном на север, а другое место имеет пеленг 300 градусов (немного к северо-западу от меня). Если я смотрю на юг, не двигаясь, мой относительный пеленг относительно удаленного места должен составлять 120 градусов.

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


person user3115201    schedule 30.11.2015    source источник
comment
Взгляните на stackoverflow.com/questions/25506470/ ... если это не поможет, я могу объяснить дальше.   -  person PeteB    schedule 30.11.2015
comment
проблема в том, как узнать мой текущий угол в зависимости от того, куда я смотрю?   -  person user3115201    schedule 30.11.2015
comment
Я использую GPS-навигатор, указывает ли курс направление / угол, куда я направляюсь? Учитывая, что у меня нет этих данных, как мне узнать мой текущий заголовок?   -  person user3115201    schedule 30.11.2015
comment
Ваш первоначальный вопрос заключался в том, как найти относительный азимут с учетом направления взгляда. В опубликованной мной ссылке показано, как рассчитать минимальное направление поворота и угол между двумя курсами (возвращаемый угол является относительным азимутом). Кажется, в комментариях вы задаете другой вопрос.   -  person PeteB    schedule 30.11.2015
comment
Ваш вопрос в комментариях: как мне узнать мой текущий заголовок в контексте, когда у вас есть только одно местоположение и нет компаса. Ответ: вы не можете.   -  person PeteB    schedule 30.11.2015
comment
это потому, что важно знать мой текущий курс, чтобы найти относительное направление к другой точке. Я уже решил, как рассчитать минимальное направление поворота с вашей ссылкой, хотя я использовал данные курса GPS (которые имеют значение только при движении, потому что он рисует вектор из вашей предыдущей точки, поэтому вам нужно постоянно двигаться ). Возникает новая проблема: когда я не двигаюсь, он возвращается к истинному пеленгу из-за отсутствия курса.   -  person user3115201    schedule 30.11.2015


Ответы (1)


Есть несколько способов решить эту проблему. Первое, что вы, кажется, делаете, предполагает, что Земля сферическая. Относительные пеленги рассчитываются с использованием формулы Гаверсина для навигации по большому кругу. Учитывая начальную и конечную точки, эта формулировка находит большой круг, проходящий через две точки. Исходя из этого, можно рассчитать первоначальный подшипник. Этот маршрут по большому кругу является кратчайшим маршрутом между двумя точками, но он страдает от проблемы, связанной с тем, что пеленг, как правило, не будет постоянным на протяжении всего маршрута. Кроме того, за исключением некоторых очень конкретных случаев, обратный подшипник ведет себя не так, как вы ожидаете, и если вы хотите определить его в целом, вам придется выполнить еще один расчет, поменяв местами начальную и конечную точки.

Другой метод, который вы можете использовать, - это формулировка линии румба. В этом случае азимут между начальной и конечной точками является постоянным и позволит вам использовать отношение, которое вы имеете для обратного курса, если хотите. Так как это в целом будет отличаться от расстояния по большому кругу, следование линиям Румба не приведет к кратчайшему пути между двумя точками, но упрощает навигацию, сохраняя постоянный курс.

Оба этих подхода подробно описаны на странице Расчет расстояния, пеленга и других параметров между широтой и долготой. баллы

Другая формулировка для навигации по большому кругу, которая использует более точное представление формы Земли, сплюснутый сфериод, который представляет собой особый тип эллипсоида, приписывается Vincenty с дополнительными улучшениями, предоставленными Карни. В этих случаях состав немного более сложен и, вероятно, является излишним для большинства приложений, а производительность немного хуже, чем у составов гаверсина, приведенных выше. Но эти составы обеспечивают гораздо лучшую точность, если вам это нужно.

Обновление:

Основываясь на приведенном ниже комментарии, основная проблема заключается в том, чтобы выяснить, как далеко можно повернуть. Это будет просто угол между нормалями плоскости, содержащей большие круги для текущего и желаемого направления. Чтобы получить нормаль для плоскости на текущем курсе, вам нужно ваше текущее местоположение L и точка на некотором расстоянии от текущего курса, C. Нормальный - это просто V = L×C. Чтобы вычислить нормаль для плоскости, содержащей большой круг вдоль желаемого направления, вам нужно только знать точку на желаемом маршруте, которая у вас уже есть в виде точки назначения, которую мы называем D. Затем вы можете найти нормальный по U = L×D. Угол между ними равен θ = acos((U∙V)/(|U||V|)).

Чтобы найти L, C и D, вы должны преобразовать широту, долготу, высоту (LLA) координаты в центрированные по центру Земли и фиксированные координаты Земли (ECEF).

person andand    schedule 30.11.2015
comment
очевидно, что первого решения достаточно, чтобы дать мне нужный подшипник. Мне не нужно заботиться о конечном пеленге, поскольку расстояние между точками широты и долготы составляет менее 500 метров, так как это приложение для автомобиля. Конечно, азимут, который я получаю от всех этих формул, основан на севере. Но проблема в том, что, если моя машина не смотрит на север? Мне нужен угол к точке B (если моя машина находится в точке A), чтобы приспособиться к тому, на что я смотрю. Очень похоже на системы предупреждения о ракетном нападении в играх, где стрелка выскакивает, чтобы предупредить вас с того направления, откуда она пришла, при этом вы также постоянно двигаетесь. - person user3115201; 30.11.2015
comment
@ user3115201 ладно ... Думаю, я лучше понимаю. Я думаю, что у меня есть идея для этого, и я добавлю сюда некоторую дополнительную информацию позже сегодня, чтобы ответить на ваш вопрос, если кто-то меня не опередит. - person andand; 30.11.2015
comment
@ user3115201 Просмотрите обновление и дайте мне знать, если это ответит вам на вопрос. - person andand; 02.12.2015