Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html><head><title>Калькулятор расстояния и азимута по географическим координатам</title>
- <META content="text/html; charset=windows-1251" http-equiv=Content-Type>
- </head>
- <body>
- <h1>Калькулятор расстояния и азимута по географическим координатам</h1>
- <p align="justify">
- Выполняет расчёт движения по кратчайшему расстоянию (ортодромия, "дуга большого круга"), азимут который тут считается -
- это не то же самое, что при движении по одному курсу (локсодромии), но разница обычно несущественная.
- Положительные числа означают северную широту и восточную долготу, а отрицательные - южную широту и западную долготу.
- </p>
- <?
- // replace S and W with minus sign and simply delete N and E
- function ReplaceNESW($s){
- return strtr(trim($s),array("S"=>"-","W"=>"-","N"=>"","E"=>""));
- };
- // split input and preserve sign only in degrees
- function SplitDegrees($adegree, &$degr,&$mint,&$scnd){
- if($adegree<0) {$chsign=1; $adegree=-$adegree;} else $chsign=0;
- $degr=floor($adegree);
- $mint=floor(($adegree-$degr)*60);
- $scnd=($adegree-$degr-$mint/60)*3600;
- if($chsign) $degr=-$degr;
- };
- // unite input and use sign only in degrees
- function UniteDegrees(&$adegree, $degr,$mint,$scnd){
- if($degr<0) {$chsign=1; $degr=-$degr;} else $chsign=0;
- $adegree=$degr+($mint+$scnd/60)/60;
- if($chsign) $adegree=-$adegree;
- };
- // point 1
- @$n1a=intval(ReplaceNESW($_GET['n1a']));
- @$n1b=abs(intval($_GET['n1b']));
- @$n1c=abs(floatval($_GET['n1c']));
- @$e1a=intval(ReplaceNESW($_GET['e1a']));
- @$e1b=abs(intval($_GET['e1b']));
- @$e1c=abs(floatval($_GET['e1c']));
- // point 2
- @$n2a=intval(ReplaceNESW($_GET['n2a']));
- @$n2b=abs(intval($_GET['n2b']));
- @$n2c=abs(floatval($_GET['n2c']));
- @$e2a=intval(ReplaceNESW($_GET['e2a']));
- @$e2b=abs(intval($_GET['e2b']));
- @$e2c=abs(floatval($_GET['e2c']));
- // points
- @$n1=floatval(ReplaceNESW($_GET['n1']));
- @$e1=floatval(ReplaceNESW($_GET['e1']));
- @$n2=floatval(ReplaceNESW($_GET['n2']));
- @$e2=floatval(ReplaceNESW($_GET['e2']));
- // coord style
- @$coordstyle=intval($_GET['typ']);
- // change float format
- if ($coordstyle) {
- UniteDegrees($n1,$n1a,$n1b,$n1c);
- UniteDegrees($e1,$e1a,$e1b,$e1c);
- UniteDegrees($n2,$n2a,$n2b,$n2c);
- UniteDegrees($e2,$e2a,$e2b,$e2c);
- }
- else {
- SplitDegrees($n1,$n1a,$n1b,$n1c);
- SplitDegrees($e1,$e1a,$e1b,$e1c);
- SplitDegrees($n2,$n2a,$n2b,$n2c);
- SplitDegrees($e2,$e2a,$e2b,$e2c);
- };
- // print form
- print 'Формат координат №1 (градусы):<br>
- <form action="index.php" enctype="multipart/form-data" method="get">
- <input type="hidden" name="typ" value="0">
- Точка 1 (N1;E1):
- N1: <input name="n1" maxlength="16" size="16" value="'.$n1.'">°
- E1: <input name="e1" maxlength="16" size="16" value="'.$e1.'">°<br>
- Точка 2 (N2;E2):
- N2: <input name="n2" maxlength="16" size="16" value="'.$n2.'">°
- E2: <input name="e2" maxlength="16" size="16" value="'.$e2.'">°<br>
- <input value="Посчитать" type="Submit" style="background-color:#aaffaa">
- </form>
- <br>
- Формат координат №2 (градусы, минуты, секунды):<br>
- <form action="index.php" enctype="multipart/form-data" method="get">
- <input type="hidden" name="typ" value="1">
- Точка 1 (N1;E1):
- N1: <input name="n1a" maxlength="9" size="5" value="'.$n1a.'">°<input name="n1b" maxlength="9" size="5" value="'.$n1b.'">\'<input name="n1c" maxlength="17" size="17" value="'.$n1c.'">"
- E1: <input name="e1a" maxlength="9" size="5" value="'.$e1a.'">°<input name="e1b" maxlength="9" size="5" value="'.$e1b.'">\'<input name="e1c" maxlength="17" size="17" value="'.$e1c.'">"<br>
- Точка 2 (N2;E2):
- N2: <input name="n2a" maxlength="9" size="5" value="'.$n2a.'">°<input name="n2b" maxlength="9" size="5" value="'.$n2b.'">\'<input name="n2c" maxlength="17" size="17" value="'.$n2c.'">"
- E2: <input name="e2a" maxlength="9" size="5" value="'.$e2a.'">°<input name="e2b" maxlength="9" size="5" value="'.$e2b.'">\'<input name="e2c" maxlength="17" size="17" value="'.$e2c.'">"<br>
- <input value="Посчитать" type="Submit" style="background-color:#aaffaa">
- </form>';
- //
- print "<h3>Путь из точки А (".$n1."°;".$e1."°) в точку Б (".$n2."°;".$e2."°):</h3>\n";
- // calc distance
- $rn1=deg2rad($n1); $re1=deg2rad($e1); $rn2=deg2rad($n2); $re2=deg2rad($e2);
- $rd=60*acos(sin($rn1)*sin($rn2)+cos($rn1)*cos($rn2)*cos($re2-$re1));
- $dist=1.852*rad2deg($rd);
- // calc angle
- @$azim=rad2deg(acos((sin($rn2)-sin($rn1)*cos($rd/60))/(sin($rd/60)*cos($rn1))));
- if(sin($re2-$re1)<0) $azim=360-$azim;
- // nice output
- printf("<b>Расстояние %.3f км</b>",$dist); print " <font color=\"#FFFFFF\">".$dist."</font><br>\n";
- printf("<b>Азимут %.3f°</b>",$azim); print " <font color=\"#FFFFFF\">".$azim."</font><br>\n";
- // end
- ?>
- <br><br>
- <a href="index.php?typ=0&n1=55.751052&e1=37.623968&n2=50.450000&e2=30.524167">Тестовый пример: главные площади Москвы и Киева</a><br>
- <br>
- </body></html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement