HelpF.pro

Как в 1С посчитать расстояние между двумя географическими координатами?

На одном проекте была платная работа с картами и отображением складов на них, часто требовалось рассчитать расстояние между географическими координатами.

Земля может быть описана как сфера, поэтому для вычисления расстояния между точками на поверхности земли мы можем использовать уравнения для расчета сферического расстояния большого круга. При расчете мы берем сферу радиусом 6372795 метров. Ввиду того что земля на самом деле не сфера, а эллипсоид, - пограшность вычисления расстояния может составлять около 0.5%.

В результате были использованы следующие функции:

Код 1C v 8.3
 
Функция ABS(Число) 
   Если Число<0 Тогда 
       Возврат -1*Число; 
   Иначе 
       Возврат Число; 
   КонецЕсли; 
КонецФункции 

Функция РастояниеВМетрахОтДо(Ширина1,Долгота1,Ширина2,Долгота2)
Пи=3.14; РадиусЗ = 6372795; 
Расстояние = РадиусЗ*ATAN(Sqrt(Pow(COS(Пи*Ширина2/180)*SIN(ABS(Пи*Долгота2/180-Пи*Долгота1/180)),2)+Pow(COS(Пи*Ширина1/180)*SIN(Пи*Ширина2/180)-SIN(Пи*Ширина1/180)*COS(Пи*Ширина2/180)*COS(ABS(Пи*Долгота2/180-Пи*Долгота1/180)),2))/(SIN(Пи*Ширина1/180)*SIN(Пи*Ширина2/180)+COS(Пи*Ширина1/180)*COS(Пи*Ширина2/180)*COS(ABS(Пи*Долгота2/180-Пи*Долгота1/180)))); 
Возврат Расстояние;     
КонецФункции

//Пример 2
Функция ПросчитатьРастояниеОтДо(ШиротаКоординаты1,ДолготаКоординаты1,ШиротаКоординаты2,ДолготаКоординаты2)
//    cos(d) = sin(φА)*sin(φB) + cos(φА)*cos(φB)*cos(λА − λB),
//    где φА и φB & широты, λА, λB & долготы данных пунктов, d & расстояние между пунктами, измеряемое в радианах 
//      длиной дуги большого круга земного шара. 
//    Расстояние между пунктами, измеряемое в километрах, определяется по формуле:
//    L = d·R,
//    где R = 6371 км & средний радиус земного шара.
    Возврат (ASin(sin(ШиротаКоординаты1)*sin(ШиротаКоординаты2) + cos(ШиротаКоординаты1)*cos(ШиротаКоординаты2)*cos(ДолготаКоординаты1 - ДолготаКоординаты2)))*6371;     
КонецФункции

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq82/view/1845.html