Delphi: вычисление направления одного объекта относительно другого по географическим координатам

Есть задача: даны географические координаты (широта и долгота) двух точек, необходимо вычислить положение одной точки по отношению к другой (т.е. где находится вторая точка: на юге, севере, западе и т.д.) в градусах. Градусы при этом, как известно, считаются от Севера по часовой стрелке.

Математически это считается по вот такой страшной формуле:

Где:
Q = направление в градусах;
BM = широта A;
LM = долгота A;
B = широта B;
L = долгота B;

Приведем пример. Есть некая точка A и некая точка B, географические координаты которых известны. Точка А находится строго на юге от точки B. Тогда результат наших вычислений будет ровно 180 градусов, т.к. Юг = 180 градусов от Севера.

Теперь решение на Delphi:

function CalcDirection(Lat1,Long1,Lat2,Long2: Single) : Single;
var
x1,y1,y2 : Single;
begin
x1 := sin((-Long2+Long1)*Pi/180);
y1 := cos(Lat2*Pi/180) * tan(Lat1*Pi/180);
y2 := sin(Lat2*pi/180) *
cos((-Long2+Long1)*pi/180);
Result := ArcTan(x1/(y1-y2))*180/pi;
if Result < 0 then
Result := 360 + Result;
if (Long2 < Long1) and (Long2 > (Long1-180)) then
if Result > 180 then
Result := Result - 180;
if Result > 360 then Result :=
Result - 360;
end;

Функции передаются в качестве параметров:
Lat1, Long1 — широта и долгота точки А;
Lat1, Long1 — широта и долгота точки B.

НЕ ЗАБЫВАЕМ в раздел USES добавить математический модуль math.

Пример использования, для которого, собственно, и искалось решение: необходимо вычислить направление для совершение мусульманской молитвы (намаза), которую, как известно, необходимо выполнять в сторону Каабы, находящейся в Мекке. Идем в Википедию и узнаем координаты Мекки: 21°25′21″ с. ш. 39°49′34″ в. д. — это точка А. Находимся мы, предположим, в городе Владивостоке, его координаты тоже можно узнать в Википедии: 43°07′00″ с. ш. 131°54′00″ — это точка B. Теперь вызываем нашу функцию с соответсвующими параметрами и выводим результат на экран с помощью функции ShowMessage():

ShowMessage(floattostr(CalcDirection(21.2521,39.4934,43.07,131.54)));

Результат: 287 градусов (от Севера по часовой стрелке).

Вот такая математика.

Одна мысль про “Delphi: вычисление направления одного объекта относительно другого по географическим координатам”

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *