Имя: Пароль:
IT
 
Рассчитать расстояние по координатам в 1С
0 IronDemon
 
25.08.10
13:15
Есть лог GPS-логера с координатами. Нужно рассчитать сколько проехала машина.
Поиски привели к "формуле гаверсинуса" и "расстояние большого круга"
http://gis-lab.info/qa/great-circles.html
http://ru.w3support.net/index.php?db=so&id=27928
http://js-php.ru/web-development/distance-from-dot-to-dot/

Вот только как это на 1С перевести...
1 Fragster
 
гуру
25.08.10
13:16
о боже, сложить длины отрезков - погрешность менее 5% будет...
2 Fragster
 
гуру
25.08.10
13:17
у тебя же координаты на каждую секунду должны быть - так там вообще за 0% погреность принять можно
3 IronDemon
 
25.08.10
13:18
(1) Не ругайся а пальцем ткни ;)
4 IronDemon
 
25.08.10
13:20
Школа была давно, институт не окончен ...
5 Gisborn
 
25.08.10
13:23
(3) А что мешает? В третьей ссылке все написано. sin, cos и arctan в 1с есть.
6 IronDemon
 
25.08.10
13:24
atan2 нет в 1С
7 Gisborn
 
25.08.10
13:29
(6) что такое atan2? и чем просто atan не устраивает?
8 Злой Бобр
 
25.08.10
13:47
(0) Если скуль, то вывести расчет в хранимку - и быстрее и ограничений в формулах нет.
9 IronDemon
 
25.08.10
13:56
Типа этого? http://megocode3.wordpress.com/2008/02/05/haversine-formula-in-c/
и по ADO вызывать?
10 Mikeware
 
25.08.10
13:59
11 Злой Бобр
 
25.08.10
14:00
(9) В код невчитывался, но суть в передаче в скуль файла (или таблицы) и получении назад результата. Можно даже с 1срр заморочиться.
12 IronDemon
 
25.08.10
14:03
(10) Восьмерка
13 smaharbA
 
25.08.10
14:09
(12) все указанное в (10) так же можно получить из объекта Math джабыскрипт
14 Mikeware
 
25.08.10
14:10
(12) тогда через жабаскрипт
15 IronDemon
 
25.08.10
15:00
(13) (14) Примеры можно?
16 Злой Бобр
 
25.08.10
15:04
(15) В поиске забанили? http://yandex.ua/yandsearch?text=java+math&lr=10347
17 zak555
 
25.08.10
15:12
пример коорднат
18 IronDemon
 
25.08.10
15:20
lat="47.877987" lon="35.071194"
lat="47.877289" lon="35.072243"
lat="47.876556" lon="35.072796"
19 Адинэснег
 
25.08.10
15:21
рисуешь прямоугольник в голове, потом считаешь диагональ как в 5м классе, и умножаешь на 111 км/градус
20 Михаил Козлов
 
25.08.10
15:22
(6) А atan2 в какой из 3-х ссылок упоминается? Что-то не увидел.
Вся эта "сферичность" нужна только для немаленьких расстояний, когда сказывается сферичность Земли. Для небольших расстояний можно Землю считать плоской+сделать поправку (1 градус - 111 км).
21 Адинэснег
 
25.08.10
15:25
(|lat1-lat2|^2+|lon1-lon2|^2) ^  1/2
22 Михаил Козлов
 
25.08.10
15:26
+20. Или формулу в ряд разложить. Наверное, будет 2-й член (разница в квадрате).
23 Aleksey_3
 
25.08.10
15:28
Получается 1,26 + 0,92 = 2,18
24 IronDemon
 
25.08.10
15:30
Расстояние между двумя первыми точками 110,23 метра
25 Адинэснег
 
25.08.10
15:31
(24) это по какой формуле? или это в реале?
26 borozavr
 
25.08.10
15:33
(0) в первой ссылке классный пример в Экселе, пробовал вводить разные данные 1я формула отлично считает, а там нет никаких ATAN2
27 IronDemon
 
25.08.10
15:34
По Формуле гаверсинусов
http://www.movable-type.co.uk/scripts/latlong.html и пример в Excel из первой ссылки
28 Aleksey_3
 
25.08.10
15:34
(24) Есть еще подъем в гору, или спуск с горы. Или например ты проехал 50 метров прямо, повернул на 90 грудосов и проехал еще 50 метров, т.е. реально ты проехал - 100 метров, а по координатам - 70 метров (длина гипотенузы < длины суммы катетов)
29 Адинэснег
 
25.08.10
15:35
(28) у него тока координаты, датчика уровня над водой нет я подозреваю)
30 IronDemon
 
25.08.10
15:36
(26) Из testcase? Пытаюсь перевести
31 Aleksey_3
 
25.08.10
15:37
(26) У меня в екселе есть эта функция
32 Aleksey_3
 
25.08.10
15:37
33 IronDemon
 
25.08.10
15:38
Есть и высота. Но расчетов с высотой не видел
34 Кирпич
 
25.08.10
15:39
http://www.delphisources.ru/pages/faq/base/calculate_distance.html

Здесь на Delphi написано. может поможет
35 smaharbA
 
25.08.10
15:40
Пля

Скрипт=Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Математика=Скрипт.Eval("Math");
Сообщить(Математика.atan2(10,5));
36 eklmn
 
гуру
25.08.10
15:41
(35) :))) я думал только я такой умный
37 borozavr
 
25.08.10
15:42
(31) Да у меня тоже есть )), там в примере 3 формулы расчета 1я через ACOS,остальные ATAN2 и ATAN. Пробовал вводить разные координаты-результаты совершенно одинаковые, при условии, что первая функция проще. Так что можно без джавы, стандарной 8 функцией.
38 supremum
 
25.08.10
15:42
39 supremum
 
25.08.10
15:44
40 vitecd
 
25.08.10
15:45
всё интересное пропустил :)
41 nbIx
 
25.08.10
15:48
Может я че то не понимаю, но

Результат = sqrt((x2-x1)*(x2-x1)) + (у2-у1)(у2-у1))
42 supremum
 
25.08.10
15:53
+(39) В общем думаю самый простой вариант это взять длину дуги градуса широты и долготы для местности, погрешность будет, но не большая.
Тогда длина дуги между двумя точками будет такая:

длина пути = ((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 zak555
 
25.08.10
15:58
(18) ну и какие там проблемы вычисления ?

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 supremum
 
25.08.10
16:01
(43) На радиус Земли в этой местности нужно еще умножить.
45 IronDemon
 
25.08.10
16:03
(43) Не сходится
46 zak555
 
25.08.10
16:07
блин, так это ж долгота и широта :)
47 also
 
25.08.10
16:12
через яндекс.api можно...Он по своим картам может и маршрут проложить и расстояние вернуть
48 zak555
 
25.08.10
16:13
всё просто : вводим вектор-функцию и берём интеграл =)
49 IronDemon
 
25.08.10
16:13
(35) Ругается
50 supremum
 
25.08.10
16:14
(45) (46) Получится елси перевести из градусов в радианы и воспользоваться (44)
51 Адинэснег
 
25.08.10
16:15
(45) с чем не сходится???
52 Адинэснег
 
25.08.10
16:16
http://maps.google.com/ - проверь линейкой
53 IronDemon
 
25.08.10
16:17
(51) с (27)
54 supremum
 
25.08.10
16:18
+(50)
1) Длина дуги окружности = радиус * угол в радианах.
2) На малых маштабах сферичностью можно принебречь
55 ОчкарикСлава
 
25.08.10
16:20
IronDemon, посмотр решение от систеха, там расстояние считается.
56 supremum
 
25.08.10
16:21
(48) Можно и так, только брать интеграл не аналитически, а численно.
57 IronDemon
 
25.08.10
16:28
Уряяяяя.


Функция 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 supremum
 
25.08.10
16:30
(57) Результат какой?
59 Адинэснег
 
25.08.10
16:30
http://api.yandex.ru/maps/jsapi/doc/ref/reference/geocoordsystem.xml
rulerDistance

{Number} rulerDistance(point1, point2)


Возвращает расстояние между двумя заданными точками (в метрах), если двигаться вдоль прямой соединяющей точки на карте. Используется для расчета расстояний в элементе управления "Линейка".

Параметры:Имя    Тип    Описание
point1    YMaps.GeoPoint    Первая точка.
point2    YMaps.GeoPoint    Вторая точка.


Возвращает:Тип    Описание
Number    Расстояние "по линейке" между двумя заданными точками.
60 IronDemon
 
25.08.10
16:31
Расстояние = 110,20373939206339422
61 Адинэснег
 
25.08.10
16:32
(60) в закладочку =)
62 Адинэснег
 
25.08.10
16:33
интересно, а северном полюсе взлетит функция?
63 Кирпич
 
25.08.10
16:37
Вот из (34) переделал. вроде работает

Процедура РасстояниеПоКоординатам(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 ИгрунЛего
 
25.08.10
17:09
(0) можешь сдуть с проекта:
freefin.ucoz.org
в восьмерошной демке модули форм не закрыты.
65 IronDemon
 
25.08.10
17:19
(64) Пароля нет на 1CGPS8distr.rar  :(
66 smaharbA
 
25.08.10
17:27
(57) вообщето в (35) все сказано и за атаны и даже за ПИ
67 smaharbA
 
25.08.10
17:29
(49) чего ругается, типо нету метода ?
68 smaharbA
 
25.08.10
17:30
тогда

Скрипт=Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Сообщить(Скрипт.Eval("Math.atan2(10,5)"));
Сообщить(Скрипт.Eval("Math.PI"));
69 ИгрунЛего
 
25.08.10
21:01
(65) На продажную версию пароль. Демку качай. В ней нет возможности добавления регионов, а в остальном и математика и хранение и слив с устройств да всё остальное присутствуют. Модально.
http://freefin.ucoz.org/1C81/Demo/1CGPS8demo.zip
70 NikVars
 
25.08.10
22:37
.........  А чего это вы тут делаете?!.........
71 IronDemon
 
26.08.10
11:18
Плюшки считаем
Независимо от того, куда вы едете — это в гору и против ветра!