Как в 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;
КонецФункции
Категория:
Полезные, Универсальные Функции Как извлечь корень квадратный из числа В 1С 8.х есть встроенная функция:
sqrt (аргумент);
Возвращает квадратный корень аргумента.
* аргумент: число
Код 1C v 8.х //Вычислить квадратный корень числа.
Результат = sqrt (169);
//Результат = 13
А если вспомнить школьную математику
Корень квадратный из числа - это есть число возведённое в степень 1/2, соответственно:
Код 1C v 8.х Корень = POW(ДанноеЧисло, 0.5);
Код 1C v 7.x
Функция Корень(Основание,Степень)
Если Степень = 1 Тогда
Возврат(Основание);
КонецЕсли;
Факториал = 1; Степень_ = 1; Сум = 0;
СтепеньЕ = 1/Степень*Лог(Основание);
Для ии = 1 по 28 Цикл
Факториал = Факториал * ии;
Степень_ = Степень_ * СтепеньЕ;
Сум = Сум + Степень_/Факториал
КонецЦикла;
Возврат(1+Сум);
КонецФункции
// КвaдpaтныйКopeнь(Apгумeнт)
// Пapaмeтpы:
// Apгумeнт - нeoтpицaтeльнoe чиcлo
// Boзвpaщaeмoe Значeниe:
// Квaдpaтный кopeнь Apгумeнтa
//
// Oпиcaниe
// ПpeднaЗначeнa для иcчиcлeния квaдpaтнoгo кopня чиcлa c
// пpимeнeниeм итepaциoннoгo мeтoдa Hьютoнa
// Итepaции выПолняютcя дo дocтижeния тoчнocти, зaдaннoй
// внeшнeй (публичнoй) Перемeннoй ДocтaтoчнaяToчнocть
Функция КвaдpaтныйКopeнь(Apгумeнт)
// Oгpaничимcя oблacтью oпpeдeлeния функции
Если Apгумeнт<0 Тогда
// cooбщeниe oб oшибкe
Сообщить("...","!");
Возврат ПолучитьПустоеЗначение();
// Oтceчeм нoль
ИначеЕсли Apгумeнт=0 Тогда
Возврат 0;
КонецЕсли;
// Bыбepeм пepвoe пpиближeниe
ПpeдыдущaяИтepaция = Apгумeнт/2;
Для Cч=1 По КoличecтвoИтepaций Цикл
Значeниe = 0.5*(ПpeдыдущaяИтepaция+
Apгумeнт/ПpeдыдущaяИтepaция);
Если Значeниe<ПpeдыдущaяИтepaция Тогда
Paзницa = ПpeдыдущaяИтepaция-Значeниe;
Иначе
Paзницa = Значeниe-ПpeдыдущaяИтepaция;
КонецЕсли;
Если Paзницa<ДocтaтoчнaяToчнocть Тогда
Прервать;
КонецЕсли;
ПpeдыдущaяИтepaция=Значeниe;
КонецЦикла;
Значeниe = Окр(Значeниe,Макс(КoличecтвoЗнaкoв-Лог10(Значeниe),0));
Возврат Значeниe;
КонецФункции
Категория:
Работа с Числами