Вверх ↑
Этот топик читают: Гость
Ответов: 207
Рейтинг: 14
#1: 2021-08-04 21:16:31 ЛС | профиль | цитата
Хочу вычислить расстояние между двумя точками GPS координат.
Подскажите пожалуйста как такое выражение выполнить в hiasm.
Или чем заменить DegToRad?
 
ArcCos(Sin(DegToRad(Lat1)) * Sin(DegToRad(Lat2)) + Cos(DegToRad(Lat1)) * Cos(DegToRad(Lat2)) * Cos(DegToRad(Lon1) - DegToRad(Lon2)))
карма: 2

0
vip
#1.1контекстная реклама от партнеров
Ответов: 8886
Рейтинг: 823
#2: 2021-08-04 21:57:39 ЛС | профиль | цитата
Joiner, в каком формате вы получаете координаты:
так
57 35' 30"N (градусы, минуты, секунды, северная широта) 38 30' 15"E ((градусы, минуты, секунды, восточная долгота)
или дробью
57.591666N 38.502500
карма: 19

0
Ответов: 207
Рейтинг: 14
#3: 2021-08-04 22:04:14 ЛС | профиль | цитата
Леонид, в таком формате lat = 36.726178; lon = -97.0176049
карма: 2

0
Ответов: 207
Рейтинг: 14
#4: 2021-08-04 23:58:10 ЛС | профиль | цитата
Разобрался

Add(MainForm,2953706,175,287)
{
link(onCreate,1279666:doCalc,[])
}
Add(MathParse,1279666,245,301)
{
DataCount=4
MathStr="(ArcCos(Sin(%1*pi/180) * Sin(%3*pi/180) + Cos(%1*pi/180) * Cos(%3*pi/180) * Cos((%2*pi/180) - (%4*pi/180)))) * 6371"
link(onResult,8434772:doMessage,[])
link(X1,8304978:Value,[])
link(X2,15866633:Value,[])
link(X3,11845072:Value,[])
link(X4,11361973:Value,[])
}
Add(Memory,8304978,245,252)
{
Default=String(34.88922)
}
Add(Memory,15866633,252,210)
{
Default=String(-72.04978)
}
Add(Memory,11845072,259,168)
{
Default=String(48.35889)
}
Add(Memory,11361973,266,126)
{
Default=String(2.59583)
}
Add(Message,8434772,308,301)
{
}

карма: 2

0
Ответов: 8886
Рейтинг: 823
#5: 2021-08-05 00:14:12 ЛС | профиль | цитата
Joiner, переводить в радианы совсем не обязательно -- в Math есть свойство Градусы/Радианы
Привет Dalas-у
карма: 19

0
Ответов: 207
Рейтинг: 14
#6: 2021-08-05 00:30:46 ЛС | профиль | цитата
Леонид, Спасибо. А можно пример? Что-то не получилось у меня без перевода

Редактировалось 1 раз(а), последний 2021-08-05 01:07:06
карма: 2

0
Ответов: 8886
Рейтинг: 823
#7: 2021-08-05 09:43:05 ЛС | профиль | цитата
Joiner, формула вычисляет угол между двумя радиусами от центра Земли до указанных точек. Этот угол умножается на долю окружности Земли приходящейся на единицу угла. При измерении в радианах эта доля равна ~6371 км, а на один градус придётся 111.195 км -- надо изменить множитель в формуле.
Ой, пример забыл:
Пример

Add(MainForm,14022258,231,182)
{
}
Add(MathParse,1279666,343,182)
{
DataCount=4
MathStr="ArcCos(Sin(%1)*Sin(%3) + Cos(%1)*Cos(%3)*Cos(%2 - %4))*111.195"
AngleMode=1
link(onResult,10789273:doText,[])
link(X1,5556894:Text,[(349,173)(286,173)])
link(X2,11125924:Text,[(356,166)(328,166)])
link(X3,5942038:Text,[(363,166)(370,166)])
link(X4,14247622:Text,[(370,173)(412,173)])
}
Add(Button,1612448,280,182)
{
Left=40
Top=110
link(onClick,1279666:doCalc,[])
}
Add(Edit,10789273,406,182)
{
Left=115
Top=110
Width=100
}
Add(InfoTip,5347390,175,56)
{
Info=#67: cos(d) = (sin(ША) ·sin(ШB) + cos(ША) ·cos(ШB))*cos(ДА - ДB), где|33: ША и ШB — широты данных пунктов|33: ДА, ДB — долготы данных пунктов|43: d — угол между пунктами по большому кругу|0:|
HAlign=0
Width=330
Height=60
}
Add(Edit,5556894,280,126)
{
Left=165
Top=30
Text="34.88922"
}
Add(Edit,11125924,322,126)
{
Left=105
Top=30
Text="-72.04978"
}
Add(Edit,5942038,364,126)
{
Left=165
Top=60
Text="48.35889"
}
Add(Edit,14247622,406,126)
{
Left=105
Top=60
Text="2.59583"
}
Add(Label,6604572,231,126)
{
Left=110
Top=10
Width=103
Height=17
Caption="Долгота Широта"
}


Редактировалось 2 раз(а), последний 2021-08-07 09:31:44
карма: 19

1
Голосовали:Joiner
Ответов: 92
Рейтинг: 1
#8: 2022-10-28 11:37:43 ЛС | профиль | цитата
Леонид писал(а):
формула вычисляет угол между двумя радиусами от центра Земли до указанных точек. Этот угол умножается на долю окружности Земли приходящейся на единицу угла.

Леонид, не подскажите как правильно добавить к широте или долготе например 1000 метров? С учетом окружности Земли
карма: 0

0
Ответов: 8886
Рейтинг: 823
#9: 2022-10-28 13:02:42 ЛС | профиль | цитата
Vandjer, для небольших расстояний (до 100 км) просто (см рис):
dШ = R*SIN(α)/111.195
Ш1 = Ш + dш = Ш + R*SIN(α)/111.195

dД = R*COS(α)/111.195/COS(Д)
Д1 = Д + R*COS(α)/111.195/COS(Д)

Расстояние "R" в километрах, углы в градусах.

карма: 19

0
Ответов: 92
Рейтинг: 1
#10: 2022-10-28 17:46:33 ЛС | профиль | цитата
Леонид, Спасибо! С широтой вроде все получилось, а долгота пока не поддается

Широта

Add(MainForm,14022258,245,203)
{
}
Add(MathParse,1279666,462,210)
{
DataCount=4
MathStr="ArcCos(Sin(%1)*Sin(%3) + Cos(%1)*Cos(%3)*Cos(%2 - %4))*111.195"
AngleMode=1
link(onResult,10789273:doText,[])
link(X1,16727637:Var2,[(468,194)(405,194)])
link(X2,11125924:Text,[(475,187)(447,187)])
link(X3,5942038:Text,[(482,187)(503,187)])
link(X4,14247622:Text,[(489,194)(545,194)])
}
Add(Button,1612448,294,203)
{
Left=40
Top=110
Width=105
link(onClick,14284147:doCalc,[])
}
Add(Edit,10789273,525,210)
{
Left=165
Top=110
Width=155
}
Add(InfoTip,5347390,294,35)
{
Info=#67: cos(d) = (sin(ША) ·sin(ШB) + cos(ША) ·cos(ШB))*cos(ДА - ДB), где|33: ША и ШB — широты данных пунктов|33: ДА, ДB — долготы данных пунктов|43: d — угол между пунктами по большому кругу|0:|
HAlign=0
Width=330
Height=60
}
Add(Edit,5556894,399,105)
{
Left=165
Top=30
Width=110
Text="34.88922"
}
Add(Edit,11125924,441,105)
{
Left=55
Top=30
Width=100
Text="-72.04978"
}
Add(Edit,5942038,497,105)
{
Left=165
Top=60
Width=110
Text=""
}
Add(Edit,14247622,539,105)
{
Left=55
Top=60
Width=100
Text="-72.04978"
}
Add(Label,6604572,350,105)
{
Left=110
Top=10
Width=103
Height=17
Caption="Долгота Широта"
}
Add(MathParse,14284147,385,203)
{
DataCount=4
MathStr="%1 + 1 * SIN(90) / 111.195"
AngleMode=1
link(onResult,2561818:doEvent1,[])
link(X1,16727637:Var1,[(391,166)])
}
Add(GetDataEx,16727637,399,161)
{
link(Data,5556894:Text,[])
}
Add(Hub,2561818,427,203)
{
link(onEvent1,5942038:doText,[(452,209)(452,181)(480,181)(480,111)])
link(onEvent2,1279666:doCalc,[])
}

карма: 0

0
Ответов: 8886
Рейтинг: 823
#11: 2022-10-28 19:24:25 ЛС | профиль | цитата
Vandjer, на рисунке не земной шар, но карта местности, где А -- точка от которой идёт отсчёт, а В -- искомая точка, находящаяся на расстоянии R от А по направлению с углом α от параллели.
карма: 19

0
Ответов: 92
Рейтинг: 1
#12: 2022-10-28 20:36:50 ЛС | профиль | цитата
Леонид, Спасибо большое, разобрался.
карма: 0

0
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)