lever-coucher-soleil.php
<?
#############3
# Calcule les heures de lever et soleil à la latitude $la et à la longitude $lo le jour $jo du mois $mo. $fh est le fuseau horaire et la position est exprimée en degrés.
# source: http://dev.nexen.net/scripts/details.php?scripts=905
# GENEVE lat 46°13 long 6°09
#################
function h_soleil($la=0 , $lo=0 , $fh=0 , $jo=1 , $mo=1){
$K=0.0172024;
$JM=308.67;
$JL=21.55;
$E=0.0167;
$OB=0.4091;
$la=deg2rad(-$la);
$lo=deg2rad(-$lo);
$dr=M_PI/180;
$hr=M_PI/12;
$ht=-50/60;
$ht=$ht*$dr;
if($mo<3)
{
$mo+=12;
}
//Heure TU du milieu de la journée
$h=12+$lo/$hr;
//Nombre de jours écoulés depuis le 1 Mars O h TU
$j=intval(30.61*($mo+1))+$jo+$h/24-123;
//Anomalie et longitude moyenne
$m=$K*($j-$JM);
$l=$K*($j-$JL);
//Longitude vrai
$s=$l+2*$E*sin($m)+1.25*$E*$E*sin(2*$m);
//Coordonnées rectangulaires du soleil dans le repère équatorial
$x=cos($s);
$y=cos($OB)*sin($s);
$z=sin($OB)*sin($s);
//Equation du temps et déclinaison
//Rotation de l'angle r autour de l'axe z
$r=$l;
$rx=cos($r)*$x+sin($r)*$y;
$ry=-sin($r)*$x+cos($r)*$y;
$x=$rx;
$y=$ry;
$et=atan($y/$x);
$dc=asin($z);
//Heure de passage au méridien
$pm=$h+$fh+$et/$hr;
$hs=intval($pm);
$pm=60*($pm-$hs);
$ms=intval($pm);
$pm=60*($pm-$ms);
$res['meridienne']=mktime($hs, $hm, $pm, $mo, $jo, 2003);
//Angle horaire au lever et au coucher
$cs=(sin($ht)-sin($la)*sin($dc))/cos($la)/cos($dc);
if($cs>1)
{
return false;
}
elseif($cs<-1)
{
return false;
}
elseif(cs==0)
{
if($ah=m_PI/2)
{
}
else
{
$ah=acos($cs);
}
}
elseif($cs<0)
{
$ah=$ah+M_PI;
}
//correction nord et sud
if($la>0)
{
$corr_lever=-12;
$corr_coucher=+12;
}
else
{
$corr_lever=0;
$corr_coucher=0;
}
//Lever du soleil
$pm=$h+$fh+($et-$ah)/$hr;
if($pm<0)
{
$pm=$pm+24;
}
$hs=intval($pm);
$pm=60*($pm-$hs);
$res['lever']=mktime($hs+$corr_lever, $pm, 0, $mo, $jo, 2003);
$res['h_lever']=strftime("%Hh%M", $res['lever']);
//Coucher du soleil
$pm=$h+$fh+($et+$ah)/$hr;
if($pm>24)
{
$pm=$pm-24;
}
$hs=intval($pm);
$pm=60*($pm-$hs);
$res['coucher']=mktime($hs+$corr_coucher, $pm, 0, $mo, $jo, 2003);
$res['h_coucher']=strftime("%Hh%M", $res['coucher']);
return $res;
}
echo h_soleil();
?>