Вычисление расстояния между двуми точками, имея широту и долготу
Поиск по базе статей [/articles/?PHPSESSID=6c7c41f9f695ea2e4e857c574ee45dd0] : 18.08.2006 Изменено разрешение сайта Изменено минимальное разрешение сайта на 1024x768 Подробнее... 02.08.2006 Выгружена игра "Digger Remastered" Вспоминаем старый добрый DOS и времена 80-х! ;) Подробнее... Рекомендуем книгу! Delphi на примерах Изложены основы программирования в среде Delphi, начиная с составления программ в Turbo Pascal 7.0 и Object Pascal. Особое внимание уделено программам для решения задач из области высшей математики. Рассмотрены все этапы создания проекта в Delphi, начиная ... Вычисление расстояния между двуми точками, имея широту и долготу :: Статьи по 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
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