Рассчитать расстояние по координатам в 1С #501045


#0 by IronDemon
Есть лог GPS-логера с координатами. Нужно рассчитать сколько проехала машина. Поиски привели к "формуле гаверсинуса" и "расстояние большого круга" Вот только как это на 1С перевести...
#1 by Fragster
о боже, сложить длины отрезков - погрешность менее 5% будет...
#2 by Fragster
у тебя же координаты на каждую секунду должны быть - так там вообще за 0% погреность принять можно
#3 by IronDemon
Не ругайся а пальцем ткни ;)
#4 by IronDemon
Школа была давно, институт не окончен ...
#5 by Gisborn
А что мешает? В третьей ссылке все написано. sin, cos и arctan в 1с есть.
#6 by IronDemon
atan2 нет в 1С
#7 by Gisborn
что такое atan2? и чем просто atan не устраивает?
#8 by Злой Бобр
Если скуль, то вывести расчет в хранимку - и быстрее и ограничений в формулах нет.
#9 by IronDemon
Типа этого? и по ADO вызывать?
#10 by Mikeware
Достаточно
#11 by Злой Бобр
В код невчитывался, но суть в передаче в скуль файла (или таблицы) и получении назад результата. Можно даже с 1срр заморочиться.
#12 by IronDemon
Восьмерка
#13 by smaharbA
все указанное в так же можно получить из объекта Math джабыскрипт
#14 by Mikeware
тогда через жабаскрипт
#15 by IronDemon
Примеры можно?
#16 by Злой Бобр
В поиске забанили?
#17 by zak555
пример коорднат
#18 by IronDemon
lat="47.877987" lon="35.071194" lat="47.877289" lon="35.072243" lat="47.876556" lon="35.072796"
#19 by Адинэснег
рисуешь прямоугольник в голове, потом считаешь диагональ как в 5м классе, и умножаешь на 111 км/градус
#20 by Михаил Козлов
А atan2 в какой из 3-х ссылок упоминается? Что-то не увидел. Вся эта "сферичность" нужна только для немаленьких расстояний, когда сказывается сферичность Земли. Для небольших расстояний можно Землю считать плоской+сделать поправку (1 градус - 111 км).
#21 by Адинэснег
(|lat1-lat2|^2+|lon1-lon2|^2) ^  1/2
#22 by Михаил Козлов
+20. Или формулу в ряд разложить. Наверное, будет 2-й член (разница в квадрате).
#23 by Aleksey_3
Получается 1,26 + 0,92 = 2,18
#24 by IronDemon
Расстояние между двумя первыми точками 110,23 метра
#25 by Адинэснег
это по какой формуле? или это в реале?
#26 by borozavr
в первой ссылке классный пример в Экселе, пробовал вводить разные данные 1я формула отлично считает, а там нет никаких ATAN2
#27 by IronDemon
По Формуле гаверсинусов и пример в Excel из первой ссылки
#28 by Aleksey_3
Есть еще подъем в гору, или спуск с горы. Или например ты проехал 50 метров прямо, повернул на 90 грудосов и проехал еще 50 метров, т.е. реально ты проехал - 100 метров, а по координатам - 70 метров (длина гипотенузы < длины суммы катетов)
#29 by Адинэснег
у него тока координаты, датчика уровня над водой нет я подозреваю)
#30 by IronDemon
Из testcase? Пытаюсь перевести
#31 by Aleksey_3
У меня в екселе есть эта функция
#32 by Aleksey_3
#33 by IronDemon
Есть и высота. Но расчетов с высотой не видел
#34 by Кирпич
Здесь на Delphi написано. может поможет
#35 by smaharbA
Пля
#36 by eklmn
:))) я думал только я такой умный
#37 by borozavr
Да у меня тоже есть )), там в примере 3 формулы расчета 1я через ACOS,остальные ATAN2 и ATAN. Пробовал вводить разные координаты-результаты совершенно одинаковые, при условии, что первая функция проще. Так что можно без джавы, стандарной 8 функцией.
#38 by supremum
#39 by supremum
+
#40 by vitecd
всё интересное пропустил :)
#41 by nbIx
Может я че то не понимаю, но Результат = sqrt((x2-x1)*(x2-x1)) + (у2-у1)(у2-у1))
#42 by supremum
+ В общем думаю самый простой вариант это взять длину дуги градуса широты и долготы для местности, погрешность будет, но не большая. Тогда длина дуги между двумя точками будет такая: длина пути = ((lon_1*d_Lat)^2+(lon_1*d_Lon)^2)^(1/2) где: lat_1 - длина одного градуса широты для местности lon_1 - длина одного градуса долготы для местности d_Lat=lat1-lon2 - разница широт d_Lon=lon1-lon2 - разница долгот.
#43 by zak555
ну и какие там проблемы вычисления ? lat="47.877987" lon="35.071194" lat="47.877289" lon="35.072243" lat="47.876556" lon="35.072796" расстояние == sqrt((47.877987 - 47.877289)^2 + (35.071194 - 35.072243)^2) + sqrt((47.877289 - 47.876556)^2 + (35.072243 - 35.072796)^2)
#44 by supremum
На радиус Земли в этой местности нужно еще умножить.
#45 by IronDemon
Не сходится
#46 by zak555
блин, так это ж долгота и широта :)
#47 by also
через яндекс.api можно...Он по своим картам может и маршрут проложить и расстояние вернуть
#48 by zak555
всё просто : вводим вектор-функцию и берём интеграл =)
#49 by IronDemon
Ругается
#50 by supremum
Получится елси перевести из градусов в радианы и воспользоваться
#51 by Адинэснег
с чем не сходится???
#52 by Адинэснег
- проверь линейкой
#53 by IronDemon
с
#54 by supremum
+ 1) Длина дуги окружности = радиус * угол в радианах. 2) На малых маштабах сферичностью можно принебречь
#55 by ОчкарикСлава
IronDemon, посмотр решение от систеха, там расстояние считается.
#56 by supremum
Можно и так, только брать интеграл не аналитически, а численно.
#57 by IronDemon
Уряяяяя. Функция ABS(Число)    Если Число<0 Тогда        Возврат -1*Число;    Иначе        Возврат Число;    КонецЕсли; КонецФункции Процедура КнопкаВыполнитьНажатие(Кнопка)    Пи=3.14;    РадиусЗ = 6372795;    Ширина1=47.877987;    Долгота1=35.071194;    Ширина2=47.877289;    Долгота2=35.072243;        Расстояние = РадиусЗ*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))));    Сообщить(Расстояние);     КонецПроцедуры
#58 by supremum
Результат какой?
#59 by Адинэснег
rulerDistance {Number} rulerDistance(point1, point2) Возвращает расстояние между двумя заданными точками (в метрах), если двигаться вдоль прямой соединяющей точки на карте. Используется для расчета расстояний в элементе управления "Линейка". Параметры:Имя    Тип    Описание point1    YMaps.GeoPoint    Первая точка. point2    YMaps.GeoPoint    Вторая точка. Возвращает:Тип    Описание Number    Расстояние "по линейке" между двумя заданными точками.
#60 by IronDemon
Расстояние = 110,20373939206339422
#61 by Адинэснег
в закладочку =)
#62 by Адинэснег
интересно, а северном полюсе взлетит функция?
#63 by Кирпич
Вот из переделал. вроде работает Процедура РасстояниеПоКоординатам(StartLat,StartLong,EndLat,EndLong,Distance,Bearing)  // Передаваемые широта/долгота в градусах и сотых долях  //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; // Вычисленное от и до смещение  // Константы, используемые для вычисления смещения и расстояния  D2R = 0.017453; // Константа для преобразования градусов в радианы  R2D = 57.295781; // Константа для преобразования радиан в градусы  a = 6378137.0; // Основные полуоси  b = 6356752.314245; // Неосновные полуоси  e2 = 0.006739496742337; // Квадрат эксцентричности эллипсоида  f = 0.003352810664747; // Выравнивание эллипсоида  fdLambda = (StartLong - EndLong) * D2R;  fdPhi = (StartLat - EndLat) * D2R;  fPhimean = ((StartLat + EndLat) / 2.0) * D2R;  // Вычисляем меридианные и поперечные радиусы кривизны средней широты  fTemp = 1 - e2 * (Pow(Sin(fPhimean), 2));  fRho = (a * (1 - e2)) / Pow(fTemp, 1.5);  fNu = a / (Sqrt(1 - e2 * (Sin(fPhimean) * Sin(fPhimean))));  // Вычисляем угловое расстояние  fz = Sqrt(Pow(Sin(fdPhi / 2.0), 2) + Cos(EndLat * D2R) * Cos(StartLat * D2R) * Pow(Sin(fdLambda / 2.0), 2));  fz = 2 * ASin(fz);  // Вычисляем смещение  fAlpha = Cos(EndLat * D2R) * Sin(fdLambda) * 1 / Sin(fz);  fAlpha = ASin(fAlpha);  // Вычисляем радиус Земли  fR = (fRho * fNu) / ((fRho * Pow(Sin(fAlpha), 2)) + (fNu * Pow(Cos(fAlpha), 2)));  // Получаем смещение и расстояние  Distance = (fz * fR);  AbsAD = fAlpha * R2D;  if AbsAD < 0 then      AbsAD = AbsAD * (-1);  endif;    if ((StartLat < EndLat) and (StartLong < EndLong)) then      Bearing =  AbsAD;  elsif ((StartLat < EndLat) and (StartLong > EndLong)) then      Bearing = 360 - AbsAD;  elsif ((StartLat > EndLat) and (StartLong > EndLong)) then      Bearing = 180 + AbsAD;  elsif ((StartLat > EndLat) and (StartLong < EndLong)) then      Bearing = 180 - AbsAD;  endif;   КонецПроцедуры Процедура КнопкаВыполнитьНажатие(Кнопка)    Distance = 0;    Bearing = 0;        //StartLat = 55.791444; // Начальная широта    //StartLong = 37.665028; // Начальная долгота    //EndLat = 55.791589; // Конечная широта    //EndLong = 37.669148; // Конечная долгота        StartLat = 47.877987; // Начальная широта    StartLong = 35.071194; // Начальная долгота    EndLat = 47.877289; // Конечная широта    EndLong = 35.072243; // Конечная долгота            РасстояниеПоКоординатам(StartLat,StartLong,EndLat,EndLong,Distance,Bearing);        Сообщить("Distance (расстояние) = Расстояние в метрах " + Distance);    Сообщить("Bearing (смещение) = Смещение в градусах " + Bearing);     КонецПроцедуры
#64 by ИгрунЛего
можешь сдуть с проекта: freefin.ucoz.org в восьмерошной демке модули форм не закрыты.
#65 by IronDemon
Пароля нет на 1CGPS8distr.rar  :(
#66 by smaharbA
вообщето в все сказано и за атаны и даже за ПИ
#67 by smaharbA
чего ругается, типо нету метода ?
#68 by smaharbA
тогда
#69 by ИгрунЛего
На продажную версию пароль. Демку качай. В ней нет возможности добавления регионов, а в остальном и математика и хранение и слив с устройств да всё остальное присутствуют. Модально.
#70 by NikVars
.........  А чего это вы тут делаете?!.........
#71 by IronDemon
Плюшки считаем
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С