fork(7) download
  1. <?php
  2. function getSunPosition($lat, $long, $year, $month, $day, $hour, $min) {
  3. // From http://stackoverflow.com/questions/8708048/position-of-the-sun-given-time-of-day-latitude-and-longitude?rq=1
  4.  
  5. // Get Julian date for date at noon
  6. $jd = gregoriantojd($month,$day,$year);
  7. echo('$jd = '); var_dump($jd);
  8.  
  9. //correct for half-day offset
  10. $dayfrac = $hour / 24 - .5;
  11. echo('$dayfrac = '); var_dump($dayfrac);
  12.  
  13. //now set the fraction of a day
  14. $frac = $dayfrac + $min / 60 / 24;
  15. echo('$frac = '); var_dump($frac);
  16. $jd = $jd + $frac;
  17. echo('$jd = '); var_dump($jd);
  18.  
  19. // The input to the Atronomer's almanach is the difference between
  20. // the Julian date and JD 2451545.0 (noon, 1 January 2000)
  21. $time = ($jd - 2451545);
  22. echo('$time = '); var_dump($time);
  23. // Ecliptic coordinates
  24.  
  25. // Mean longitude
  26. $mnlong = (280.460 + 0.9856474 * $time);
  27. echo('$mnlong = '); var_dump($mnlong);
  28. $mnlong = fmod($mnlong,360);
  29. echo('$mnlong = '); var_dump($mnlong);
  30. if ($mnlong < 0) $mnlong = ($mnlong + 360);
  31. echo('$mnlong = '); var_dump($mnlong);
  32.  
  33. // Mean anomaly
  34. $mnanom = (357.528 + 0.9856003 * $time);
  35. echo('$mnanom = '); var_dump($mnanom);
  36. $mnanom = fmod($mnanom,360);
  37. echo('$mnanom = '); var_dump($mnanom);
  38. if ($mnanom < 0) $mnanom = ($mnanom + 360);
  39. echo('$mnanom = '); var_dump($mnanom);
  40. $mnanom = deg2rad($mnanom);
  41. echo('$mnanom = '); var_dump($mnanom);
  42.  
  43. // Ecliptic longitude and obliquity of ecliptic
  44. $eclong = ($mnlong + 1.915 * sin($mnanom) + 0.020 * sin(2 * $mnanom));
  45. echo('$eclong = '); var_dump($eclong);
  46. $eclong = fmod($eclong,360);
  47. echo('$eclong = '); var_dump($eclong);
  48. if ($eclong < 0) $eclong = ($eclong + 360);
  49. echo('$eclong = '); var_dump($eclong);
  50. $oblqec = (23.439 - 0.0000004 * $time);
  51. echo('$oblqec = '); var_dump($oblqec);
  52. $eclong = deg2rad($eclong);
  53. echo('$eclong = '); var_dump($eclong);
  54. $oblqec = deg2rad($oblqec);
  55. echo('$oblqec = '); var_dump($oblqec);
  56.  
  57. // Celestial coordinates
  58. // Right ascension and declination
  59. $num = (cos($oblqec) * sin($eclong));
  60. echo('$num = '); var_dump($num);
  61. $den = (cos($eclong));
  62. echo('$den = '); var_dump($den);
  63. $ra = (atan($num / $den));
  64. echo('$ra = '); var_dump($ra);
  65. if ($den < 0) $ra = ($ra + pi());
  66. echo('$ra = '); var_dump($ra);
  67. if ($den >= 0 && $num <0) $ra = ($ra + 2*pi());
  68. echo('$ra = '); var_dump($ra);
  69. $dec = (asin(sin($oblqec) * sin($eclong)));
  70. echo('$dec = '); var_dump($dec);
  71.  
  72. // Local coordinates
  73. // Greenwich mean sidereal time
  74. //$h = $hour + $min / 60 + $sec / 3600;
  75. $h = $hour + $min / 60;
  76. echo('$h = '); var_dump($h);
  77. $gmst = (6.697375 + .0657098242 * $time + $h);
  78. echo('$gmst = '); var_dump($gmst);
  79. $gmst = fmod($gmst,24);
  80. echo('$gmst = '); var_dump($gmst);
  81. if ($gmst < 0) $gmst = ($gmst + 24);
  82. echo('$gmst = '); var_dump($gmst);
  83.  
  84. // Local mean sidereal time
  85. $lmst = ($gmst + $long / 15);
  86. echo('$lmst = '); var_dump($lmst);
  87. $lmst = fmod($lmst,24);
  88. echo('$lmst = '); var_dump($lmst);
  89. if ($lmst < 0) $lmst = ($lmst + 24);
  90. echo('$lmst = '); var_dump($lmst);
  91. $lmst = deg2rad($lmst * 15);
  92. echo('$lmst = '); var_dump($lmst);
  93.  
  94. // Hour angle
  95. $ha = ($lmst - $ra);
  96. echo('$ha = '); var_dump($ha);
  97. if ($ha < pi()) $ha = ($ha + 2*pi());
  98. echo('$ha = '); var_dump($ha);
  99. if ($ha > pi()) $ha = ($ha - 2*pi());
  100. echo('$ha = '); var_dump($ha);
  101.  
  102. // Latitude to radians
  103. $lat = deg2rad($lat);
  104. echo('$lat = '); var_dump($lat);
  105.  
  106. // Azimuth and elevation
  107. $el = (asin(sin($dec) * sin($lat) + cos($dec) * cos($lat) * cos($ha)));
  108. echo('$el = '); var_dump($el);
  109. $az = (asin(-cos($dec) * sin($ha) / cos($el)));
  110. echo('$az = '); var_dump($az);
  111.  
  112. // For logic and names, see Spencer, J.W. 1989. Solar Energy. 42(4):353
  113. if ((sin($dec) - sin($el) * sin($lat)) >00) {
  114. if(sin($az) < 0) $az = ($az + 2*pi());
  115. } else {
  116. $az = (pi() - $az);
  117. }
  118. echo('$az = '); var_dump($az);
  119.  
  120. $el = rad2deg($el);
  121. echo('$el = '); var_dump($el);
  122. $az = rad2deg($az);
  123. echo('$az = '); var_dump($az);
  124. $lat = rad2deg($lat);
  125. echo('$lat = '); var_dump($lat);
  126.  
  127. return array(number_format($el,2),number_format($az,2));
  128. }
  129. var_dump(getSunPosition(-4.77867, 11.86364, 2013, 9, 1, 10, 0, 0));
  130.  
  131. // your code goes here
Success #stdin #stdout 0.01s 20520KB
stdin
Standard input is empty
stdout
$jd = int(2456537)
$dayfrac = float(-0.083333333333333)
$frac = float(-0.083333333333333)
$jd = float(2456536.9166667)
$time = float(4991.9166666665)
$mnlong = float(5200.7296835165)
$mnlong = float(160.72968351651)
$mnlong = float(160.72968351651)
$mnanom = float(5277.5625642415)
$mnanom = float(237.56256424151)
$mnanom = float(237.56256424151)
$mnanom = float(4.146248925495)
$eclong = float(159.13157397345)
$eclong = float(159.13157397345)
$eclong = float(159.13157397345)
$oblqec = float(23.437003233333)
$eclong = float(2.7773699097176)
$oblqec = float(0.40905287322222)
$num = float(0.32683399276635)
$den = float(-0.93440091999848)
$ra = float(-0.33647808917746)
$ra = float(2.8051145644123)
$ra = float(2.8051145644123)
$dec = float(0.14216274786382)
$h = int(10)
$gmst = float(344.71534158771)
$gmst = float(8.7153415877065)
$gmst = float(8.7153415877065)
$lmst = float(9.5062509210399)
$lmst = float(9.5062509210399)
$lmst = float(9.5062509210399)
$lmst = float(2.4887306713933)
$ha = float(-0.316383893019)
$ha = float(5.9668014141606)
$ha = float(-0.316383893019)
$lat = float(-0.083403525366277)
$el = float(1.1828973998459)
$az = float(0.95147175892482)
$az = float(0.95147175892482)
$el = float(67.775028608168)
$az = float(54.515316112281)
$lat = float(-4.77867)
array(2) {
  [0]=>
  string(5) "67.78"
  [1]=>
  string(5) "54.52"
}