Advertisement
Guest User

Geodistance

a guest
Aug 8th, 2015
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.41 KB | None | 0 0
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html><head><title>Калькулятор расстояния и азимута по географическим координатам</title>
  3. <META content="text/html; charset=windows-1251" http-equiv=Content-Type>
  4. </head>
  5. <body>
  6. <h1>Калькулятор расстояния и азимута по географическим координатам</h1>
  7.  
  8. <p align="justify">
  9. Выполняет расчёт движения по кратчайшему расстоянию (ортодромия, "дуга большого круга"), азимут который тут считается -
  10. это не то же самое, что при движении по одному курсу (локсодромии), но разница обычно несущественная.
  11. Положительные числа означают северную широту и восточную долготу, а отрицательные - южную широту и западную долготу.
  12. </p>
  13.  
  14. <?
  15.  
  16. // replace S and W with minus sign and simply delete N and E
  17. function ReplaceNESW($s){
  18.  return strtr(trim($s),array("S"=>"-","W"=>"-","N"=>"","E"=>""));
  19. };
  20.  
  21. // split input and preserve sign only in degrees
  22. function SplitDegrees($adegree, &$degr,&$mint,&$scnd){
  23.  if($adegree<0) {$chsign=1; $adegree=-$adegree;} else $chsign=0;
  24.  $degr=floor($adegree);
  25.  $mint=floor(($adegree-$degr)*60);
  26.  $scnd=($adegree-$degr-$mint/60)*3600;
  27.  if($chsign) $degr=-$degr;
  28. };
  29.  
  30. // unite input and use sign only in degrees
  31. function UniteDegrees(&$adegree, $degr,$mint,$scnd){
  32.  if($degr<0) {$chsign=1; $degr=-$degr;} else $chsign=0;
  33.  $adegree=$degr+($mint+$scnd/60)/60;
  34.  if($chsign) $adegree=-$adegree;
  35. };
  36.  
  37. // point 1
  38. @$n1a=intval(ReplaceNESW($_GET['n1a']));
  39. @$n1b=abs(intval($_GET['n1b']));
  40. @$n1c=abs(floatval($_GET['n1c']));
  41. @$e1a=intval(ReplaceNESW($_GET['e1a']));
  42. @$e1b=abs(intval($_GET['e1b']));
  43. @$e1c=abs(floatval($_GET['e1c']));
  44. // point 2
  45. @$n2a=intval(ReplaceNESW($_GET['n2a']));
  46. @$n2b=abs(intval($_GET['n2b']));
  47. @$n2c=abs(floatval($_GET['n2c']));
  48. @$e2a=intval(ReplaceNESW($_GET['e2a']));
  49. @$e2b=abs(intval($_GET['e2b']));
  50. @$e2c=abs(floatval($_GET['e2c']));
  51. // points
  52. @$n1=floatval(ReplaceNESW($_GET['n1']));
  53. @$e1=floatval(ReplaceNESW($_GET['e1']));
  54. @$n2=floatval(ReplaceNESW($_GET['n2']));
  55. @$e2=floatval(ReplaceNESW($_GET['e2']));
  56. // coord style
  57. @$coordstyle=intval($_GET['typ']);
  58.  
  59. // change float format
  60. if ($coordstyle) {
  61.  UniteDegrees($n1,$n1a,$n1b,$n1c);
  62.  UniteDegrees($e1,$e1a,$e1b,$e1c);
  63.  UniteDegrees($n2,$n2a,$n2b,$n2c);
  64.  UniteDegrees($e2,$e2a,$e2b,$e2c);
  65. }
  66. else {
  67.  SplitDegrees($n1,$n1a,$n1b,$n1c);
  68.  SplitDegrees($e1,$e1a,$e1b,$e1c);
  69.  SplitDegrees($n2,$n2a,$n2b,$n2c);
  70.  SplitDegrees($e2,$e2a,$e2b,$e2c);
  71. };
  72.  
  73. // print form
  74. print 'Формат координат №1 (градусы):<br>
  75. <form action="index.php" enctype="multipart/form-data" method="get">
  76. <input type="hidden" name="typ" value="0">
  77. Точка 1 (N1;E1): &nbsp;
  78. N1: <input name="n1" maxlength="16" size="16" value="'.$n1.'">°
  79. E1: <input name="e1" maxlength="16" size="16" value="'.$e1.'">°<br>
  80. Точка 2 (N2;E2): &nbsp;
  81. N2: <input name="n2" maxlength="16" size="16" value="'.$n2.'">°
  82. E2: <input name="e2" maxlength="16" size="16" value="'.$e2.'">°<br>
  83. <input value="Посчитать" type="Submit" style="background-color:#aaffaa">
  84. </form>
  85. <br>
  86. Формат координат №2 (градусы, минуты, секунды):<br>
  87. <form action="index.php" enctype="multipart/form-data" method="get">
  88. <input type="hidden" name="typ" value="1">
  89. Точка 1 (N1;E1): &nbsp;
  90. 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.'">&quot; &nbsp;
  91. 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.'">&quot;<br>
  92. Точка 2 (N2;E2): &nbsp;
  93. 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.'">&quot; &nbsp;
  94. 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.'">&quot;<br>
  95. <input value="Посчитать" type="Submit" style="background-color:#aaffaa">
  96. </form>';
  97.  
  98. //
  99. print "<h3>Путь из точки А (".$n1."°;".$e1."°) в точку Б (".$n2."°;".$e2."°):</h3>\n";
  100. // calc distance
  101. $rn1=deg2rad($n1); $re1=deg2rad($e1); $rn2=deg2rad($n2); $re2=deg2rad($e2);
  102. $rd=60*acos(sin($rn1)*sin($rn2)+cos($rn1)*cos($rn2)*cos($re2-$re1));
  103. $dist=1.852*rad2deg($rd);
  104. // calc angle
  105. @$azim=rad2deg(acos((sin($rn2)-sin($rn1)*cos($rd/60))/(sin($rd/60)*cos($rn1))));
  106. if(sin($re2-$re1)<0) $azim=360-$azim;
  107. // nice output
  108. printf("<b>Расстояние %.3f км</b>",$dist); print "&nbsp; <font color=\"#FFFFFF\">".$dist."</font><br>\n";
  109. printf("<b>Азимут %.3f°</b>",$azim);       print "&nbsp; <font color=\"#FFFFFF\">".$azim."</font><br>\n";
  110. // end
  111. ?>
  112.  
  113. <br><br>
  114. <a href="index.php?typ=0&n1=55.751052&e1=37.623968&n2=50.450000&e2=30.524167">Тестовый пример: главные площади Москвы и Киева</a><br>
  115. <br>
  116.  
  117. </body></html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement