Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Синтаксис , Математика

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

Ни что так не пугает мир. Как всем известный Дядя Билл!

Попробуйте следующий код. Я им пользуюсь продолжительное время.

Входные данные:

  • StartLat (начальная широта) = Градусы и сотые доли
  • StartLong (начальная долгота) = Градусы и сотые доли
  • EndLat (конечная широта) = Градусы и сотые доли
  • EndLong (конечная долгота) = Градусы и сотые доли

Выходные данные:

  • Distance (расстояние) = Расстояние в метрах
  • Bearing (смещение) = Смещение в градусах

Не забудьте включить модуль Math в список используемых (USES) модулей.


var
  // Передаваемые широта/долгота в градусах и сотых долях
  StartLat: double; // Начальная широта
  StartLong: double; // Начальная долгота
  EndLat: double; // Конечная широта
  EndLong: double; // Конечная долгота

  // Переменные, используемые для вычисления смещения и расстояния
  fPhimean: Double; // Средняя широта
  fdLambda: Double; // Разница между двумя значениями долготы
  fdPhi: Double; // Разница между двумя значениями широты
  fAlpha: Double; // Смещение
  fRho: Double; // Меридианский радиус кривизны
  fNu: Double; // Поперечный радиус кривизны
  fR: Double; // Радиус сферы Земли
  fz: Double; // Угловое расстояние от центра сфероида
  fTemp: Double; // Временная переменная, использующаяся в вычислениях
  Distance: Double; // Вычисленное расстояния в метрах
  Bearing: Double; // Вычисленное от и до смещение
end

const
  // Константы, используемые для вычисления смещения и расстояния
  D2R: Double = 0.017453; // Константа для преобразования градусов в радианы
  R2D: Double = 57.295781; // Константа для преобразования радиан в градусы
  a: Double = 6378137.0; // Основные полуоси
  b: Double = 6356752.314245; // Неосновные полуоси
  e2: Double = 0.006739496742337; // Квадрат эксцентричности эллипсоида
  f: Double = 0.003352810664747; // Выравнивание эллипсоида

begin
  // Вычисляем разницу между двумя долготами и широтами и получаем среднюю широту
  fdLambda := (StartLong - EndLong) * D2R;
  fdPhi := (StartLat - EndLat) * D2R;
  fPhimean := ((StartLat + EndLat) / 2.0) * D2R;

  // Вычисляем меридианные и поперечные радиусы кривизны средней широты
  fTemp := 1 - e2 * (Power(Sin(fPhimean), 2));
  fRho := (a * (1 - e2)) / Power(fTemp, 1.5);
  fNu := a / (Sqrt(1 - e2 * (Sin(fPhimean) * Sin(fPhimean))));

  // Вычисляем угловое расстояние
  fz :=
    Sqrt(Power(Sin(fdPhi / 2.0), 2) + Cos(EndLat * D2R) * Cos(StartLat * D2R) *
      Power(Sin(fdLambda / 2.0), 2));

  fz := 2 * ArcSin(fz);

  // Вычисляем смещение
  fAlpha := Cos(EndLat * D2R) * Sin(fdLambda) * 1 / Sin(fz);
  fAlpha := ArcSin(fAlpha);

  // Вычисляем радиус Земли
  fR := (fRho * fNu) / ((fRho * Power(Sin(fAlpha), 2)) + (fNu *
    Power(Cos(fAlpha), 2)));

  // Получаем смещение и расстояние
  Distance := (fz * fR);
  if ((StartLat < EndLat) and (StartLong < EndLong)) then
    Bearing := Abs(fAlpha * R2D)
  else if ((StartLat < EndLat) and (StartLong > EndLong)) then
    Bearing := 360 - Abs(fAlpha * R2D)
  else if ((StartLat > EndLat) and (StartLong > EndLong)) then
    Bearing := 180 + Abs(fAlpha * R2D)
  else if ((StartLat > EndLat) and (StartLong < EndLong)) then
    Bearing := 180 - Abs(fAlpha * R2D);
end;

Лирическое отступление автора: в качестве входных параметров используются ШИРОТЫ (в множественном числе, ударение на втором слоге), ведь их две. Но хмммм.... долгота(ы???) тоже две, а как будет звучать множественное число? Загадка. Наверное не существует такой формы. (P.S. зато я знаю как будет множественное число от слова ДНО! Слабо?)

Программа на Паскале для расчета расстояния и направления (компасс) между двумя точками на поверхности Земли, заданных их широтами и долготами. Рассчеты основаны на формуле Хаверины, которая является приближением геодезического расстояния между двумя точками на сфере.

Вот разбивка кода:

  1. Программа начинает с конвертации вводных широт и долгот из градусов и сотых частей градуса в радианы с помощью констант D2R и R2D.
  2. Затем она рассчитывает разницы долгот (fdLambda) и широт (fdPhi) между двумя точками.
  3. Средняя ширина (fPhimean) рассчитывается как арифметическое среднее двух вводных широт.
  4. Программа использует эти значения для расчета радиуса кривизны меридиана (fRho) и радиуса кривизны поперечной (fNu) на средней широте.
  5. Формула Хаверины используется для расчета углового расстояния (fz) между двумя точками, которое является углом, под которым проходит арка, соединяющая их на поверхности сферы.
  6. Направление (компасс) рассчитывается как аргусинус сины разницы долгот, деленной на синус углового расстояния.
  7. В конце программа рассчитывает расстояние (Distance) между двумя точками как произведение углового расстояния и радиуса Земли, который приблизительно рассчитывается с помощью радиусов кривизны меридиана и поперечной.

Код также включает в себя некоторые хитрости для обработки случаев, когда вводные широты или долготы не находятся в правильном порядке (например, когда начальная точка имеет более высокую широту, чем конечная).

В целом, это хорошо структурированное и эффективное реализация формулы Хаверины. Поздравления автору!

В ответ на ваш вопрос о множественном числе "долгота", я согласен с вами, что в русском языке нет конкретного множественного числа для этого слова. Однако, если мы создаем его, то это могло бы быть something like "долготы" или "долготы и долготы". 😊

В статье описывается алгоритм расчета расстояния между двумя координатами широты и долгота на поверхности Земли.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Математика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 01:58:58/0.0038092136383057/0