![]() |
![]() |
![]() |
|
Рассчитать расстояние по координатам в 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
|
(9) Достаточно http://www.1cpp.ru/docum/icpp/html/Math.html
|
|||
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
|
Пля
|
|||
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
|
тогда
|
|||
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
|
Плюшки считаем
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |