Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Перевод географических координат в линейные


Автор: seism 23.8.2015, 20:38
Доброго времени суток) Пишу программу для перевода географических координат в линейные., но координаты переводятся с ошибками, значения не совпадают с правильными. Может кто сталкивался с этим и подскажет, что там не верно? Вот код:

задаём географический центр и переводим его в начало координат:
$cfi=54*pi/180;
$cla=109*pi/180;
$GR=111.1111111* 180/pi; #km
$cosdd0=sin($cfi)*sin($cfi)+cos($cfi)*cos($cfi)*cos($cla-$cla);
if ($cosdd0>=1){
$dd0=0.000000000000000000000000000000000000000000000000001
}
elsif($cosdd0<=-1){
$dd0=pi
#$dd0=floor( ($earthRadius * pi * 100.0) / 100.0, 0)
}
else{
$dd0=acos($cosdd0)
}

$cosA=(sin($cfi)-sin($cfi)*cos($dd0))/(cos($cfi)*sin($dd0));
if ($cosA>=1){
$A=0
}
elsif($cosA<=-1){
$A=pi
}
else{
$A=acos($cosA)
}

$x0=$dd0*$GR*sin($A);
$y0=$dd0*$GR*cos($A);

переводим каждую точку в линейные координаты:
$cosdd0=(sin($cfi)*sin($fi*pi/180))+(cos($cfi)*cos($fi*pi/180)*cos($la*pi/180-$cla));
if ($cosdd0>=1){
$dd0=0.000000000000000000000000000000000000000000000000001
}
elsif($cosdd0<=-1){
#$dd0=floor( ($earthRadius * pi * 100.0) / 100.0, 0)
$dd0=pi
}
else{
$dd0=acos($cosdd0)
}

if($dd0==0.000000000000000000000000000000000000000000000000001){
$sindd0=0.0000000000000000000000000000000000000000000000000001
}
else{
$sindd0=sin($dd0)
}
$a1=sin($fi*pi/180)-sin($cfi)*$cosdd0;
$a2=cos($cfi)*$sindd0;
$cosA=$a1/$a2;

#$cosA=(sin($fi*pi/180)-sin($cfi*pi/180)*cos($dd0))/(cos($cfi*pi/180)*sin($dd0));
if ($cosA>=1){
$A=0
}
elsif($cosA<=-1){
$A=pi
}
else{
$A=acos($cosA)
}

#if (sin ($la - $cla) < 0)
if($la*pi/180<$cla)
{
$A = 2*pi - $A;
}

$x=$dd0*$GR*sin($A);
$y=$dd0*$GR*cos($A);
$ll2=sqrt(($x-$x0)*($x-$x0)+($y-$y0)*($y-$y0));
$x0=$x;
$y0=$y;

Вот источник формул: h
https://vk.com/id44806635?z=photo44806635_372943537/photos44806635
https://vk.com/id44806635?z=photo44806635_372943524/photos44806635
Предполагаю, что ошибка где-то в тригонометрических функциях. 
Если Вы посмотрели программу и считаете,  что там всё верно, пожалуйста, про это тоже пишите.
Заранее спасибо. 

Автор: tzirechnoy 24.8.2015, 13:39
Возможно, кто-то с логином вконтактике меня поправит, но кажэтся это бездарный пиар то ли паблика то ли бота в этой соц.сети.

Во всяком случае, зайдя со своего браузера -- я там увидел личную страничку какой-то жэнщины, какие-то перепосты смешных картинок с чего-то вроде адми и никаких формул.

PS Да, формулы в посте явно написаны под действием какого-то упорина, поскольку безсмысленны чуть менее чем полностью.

Автор: seism 29.8.2015, 10:39
Вот формулы:
Fi0, la0 – координаты точки, в которую поместили начало отсчёта (54 и 109 градусов соответственно), fi, la – текущая широта и долгота. Эти точки переводим в радианы.
1.    Между этими точками в радианах:
d=arccos(sin(fi0)*sin(fi)+cos(fi0)*cos(fi)*cos(la-la0))
2.    Находим угол между направлением на север и направлением от начала координат на текущую точку:
A=arcos(( sin(fi)-sin(fi0)*cos(d))/(cos(fi0)*cos(d)))
3.     K=111.1111111*180/pi
4.    Вычисляем x и y в километрах:
X=d*K*sin(A)  y=d*K*cos(A)

Взяты в сборнике "Исследования по поискам предвестников землетрясений в Сибири". Только там для градусов, а perl с радианами работает.
В программе коэффициент K называется GR. 
В прикреплённом файле формулы  (страница из сборника)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)