X

Aleproste na FaceBook'u

Reklama.

[PHP] Jak obliczyć czas wschodu i zachodu słońca w php dla określonej daty i położenia geograficznego.

Przy rozbudowie strony ws550nazwa.pl o kolejne elementy stacji pogodowej powstał problem obliczenia czasu wschodu i zachodu słońca dla podanej daty i dla wskazanej lokalizacji geograficznej.

Problem raczej astronomiczny i przeszukując internet można na ten temat znaleźć wiele ciekawych informacji. Ja podczas pisania swojej metody posiłkowałem się algorytmem, który można zaleźć na stronie cybermoon.w.interia.pl , a dokładniej z algorytmu, który można odczytać z publikowanego tam arkusza kalkulacyjnego, który to algorytm przełożyłem na metody PHP

Dane wejściowe:

  • aktualna data ( dzień, miesiąc, rok )
  • długość geograficzna
  • szerokość geograficzna
  • strefa czasowa
  • czas letni / czas zimowy

Metoda podstawowa:

function sunOnOf()
 {

  $b[6] = 18.4884;		//-długość geograficzna
  $b[7] = 52.8436;		//-szerokość geograficzna
  $b[8] = 1;			//-strefa czasowa GMT+1
  $b[9] = 1; 
  //-czas letni =1, czas zimowy=0
  
  list($b[11], $b[12], $b[13]) = explode(':', date('Y:m:d', time()));	
  //data = rok, miesiąc, dzień

  $b[15] = -0.833;		//-req

  $e[8] = 367*$b[11] - floor(7*($b[11] + floor(($b[12] + 9)/12))/4) + floor(275*$b[12]/9)$b[13] - 730531.5
     + (-$b[8]+$b[9])/24;
  $e[9] = $e[8]/36525;
  $b[23] = fmod(4.8949504201433 + 628.331969753199*$e[9], 6.28318530718);
  $b[24] = fmod(6.2400408 + 628.3019501*$e[9], 6.28318530718);
  $b[25] = 0.033423*sin($b[24]) + 0.00034907*sin(2*$b[24]);
  $b[26] = $b[23]$b[25];
  $b[27] = 0.0430398*sin(2*$b[26]) - 0.00092502*sin(4*$b[26])$b[25];
  $b[28] = 0.409093 - 0.0002269*$e[9];
  $b[29] = asin(sin($b[28]) * sin($b[26]));
  $b[30] = 3.14159265358979 - 3.14159265358979 + $b[27];
  $b[31] = (sin(0.017453293*$b[15]) - sin(0.017453293*$b[7])*sin($b[29]))(
                   cos(0.017453293*$b[7]) * cos($b[29])); 		//cosc

//wschód
  $b[32] = acos($b[31]);
  $b[33] = 3.14159265358979 - ($b[30] + 0.017453293*$b[6](-1)*$b[32]);
  $b[34] = ($e[8]$b[33]/(6.28318530718))/36525;

//- zachód
  $b[43] = 3.14159265358979 - ($b[30] + 0.017453293*$b[6](1)*$b[32]);
  $b[44] = ($e[8]$b[43]/(6.28318530718))/36525;

  list($c33[0], $c34[0], $c36[0], $c43[0], $c44[0], $c46[0]) = $this->cor(
      $b[6], $b[7], $b[15], $b[16], $e[8], $b[33], $b[34]);
  list($c33[1], $c34[1], $c36[1], $c43[1], $c44[1], $c46[1]) = $this->cor(
      $b[6], $b[7], $b[15], $b[16], $e[8], $c33[0], $c34[0]);
  list($c33[2], $c34[2], $c36[2], $c43[2], $c44[2], $c46[2]) = $this->cor(
      $b[6], $b[7], $b[15], $b[16], $e[8], $c33[1], $c34[1]);

  $za = $b[8]$b[9]$c33[2]*57.29577951/15;
  $ws = $b[8]$b[9]$c43[2]*57.29577951/15;

  $wsch = floor($ws).':'.sprintf("%02s", floor(60*($ws-floor($ws))));
  $zach = floor($za).':'.sprintf("%02s", floor(60*($za-floor($za))));

  return array($wsch, $zach);
 }

Jak łatwo zauważyć, potrzebna jest jeszcze jedna funkcja cor(), która skoryguje wynik podstawowy w celu osiągnięcia dokładniejszego wyniku.

Metoda korygująca:

opublikowane 12-07-201221 powrót

Tylko dla zalogowanych użytkowników.

Dalsza część publikacji tylko dla zalogowanych użytkowników.

© aleproste.pl v.10 Projekt i realizacja projekt.etvn.pl & aleproste.pl