cvs: pear /Services_Weather/examples php_sunrise_sunset.php

From: Date: Sat, 10 Jul 2004 03:26:12 +0000
Subject: cvs: pear /Services_Weather/examples php_sunrise_sunset.php
Groups: php.pear.cvs 
Request: Send a blank email to pear-cvs+get-21695@lists.php.net to get a copy of this message
eru Fri Jul 9 23:26:12 2004 EDT Added files: /pear/Services_Weather/examples php_sunrise_sunset.php Log: Initial version http://cvs.php.net/co.php/pear/Services_Weather/examples/php_sunrise_sunset.php?r=1.1&p=1 Index: pear/Services_Weather/examples/php_sunrise_sunset.php +++ pear/Services_Weather/examples/php_sunrise_sunset.php <?php /* vim: set expandtab tabstop=4 shiftwidth=4: */ // +----------------------------------------------------------------------+ // | PHP version 4 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997-2004 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.0 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available through the world-wide-web at | // | http://www.php.net/license/2_02.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Alexander Wirtz <alex@pc4p.net> | // +----------------------------------------------------------------------+ // // $Id: php_sunrise_sunset.php,v 1.1 2004/07/10 03:26:12 eru Exp $ /* The sun position algorithm taken from the 'US Naval Observatory's Almanac for Computers', implemented by Ken Bloom <kekabloom@ucdavis.edu> for the zmanim project <http://sourceforge.net/projects/zmanim/> and finally converted to C by Moshe Doron <mosdoron@netvision.net.il>. Taken from the PHP5 sources and converted to PHP by above authors. */ if(!defined("SUNFUNCS_RET_TIMESTAMP")) { define("SUNFUNCS_RET_TIMESTAMP", 1); define("SUNFUNCS_RET_STRING", 2); define("SUNFUNCS_RET_DOUBLE", 3); } define("SUNFUNCS_DEFAULT_LATITUDE", 31.7667); define("SUNFUNCS_DEFAULT_LONGITUDE", 35.2333); define("SUNFUNCS_SUNRISE_ZENITH", 90.83); define("SUNFUNCS_SUNSET_ZENITH", 90.83); function php_sunrise_sunset($N, $latitude, $longitude, $zenith, $calc_sunset) { /* step 1: First calculate the day of the year * int N = theday - date(1, 1, theday.year()) + 1; */ /* step 2: convert the longitude to hour value and calculate an approximate time */ $lngHour = $longitude / 15; /* use 18 for sunset instead of 6 */ if ($calc_sunset) { $t = $N + ((18 - $lngHour) / 24); /* Sunset */ } else { $t = $N + ((6 - $lngHour) / 24); /* Sunrise */ } /* step 3: calculate the sun's mean anomaly */ $M = (0.9856 * $t) - 3.289; /* step 4: calculate the sun's true longitude */ $L = $M + (1.916 * sin(deg2rad($M))) + (0.020 * sin(deg2rad(2 * $M))) + 282.634; while ($L < 0) { $Lx = $L + 360; assert($Lx != $L); /* askingtheguru: really needed? */ $L = $Lx; } while ($L >= 360) { $Lx = $L - 360; assert ($Lx != $L); /* askingtheguru: really needed? */ $L = $Lx; } /* step 5a: calculate the sun's right ascension */ $RA = rad2deg(atan(0.91764 * tan(deg2rad($L)))); while ($RA < 0) { $RAx = $RA + 360; assert ($RAx != $RA); /* askingtheguru: really needed? */ $RA = $RAx; } while ($RA >= 360) { $RAx = $RA - 360; assert ($RAx != $RA); /* askingtheguru: really needed? */ $RA = $RAx; } /* step 5b: right ascension value needs to be in the same quadrant as L */ $Lquadrant = floor($L / 90) * 90; $RAquadrant = floor($RA / 90) * 90; $RA = $RA + ($Lquadrant - $RAquadrant); /* step 5c: right ascension value needs to be converted into hours */ $RA /= 15; /* step 6: calculate the sun's declination */ $sinDec = 0.39782 * sin(deg2rad($L)); $cosDec = cos(asin($sinDec)); /* step 7a: calculate the sun's local hour angle */ $cosH = (cos(deg2rad($zenith)) - ($sinDec * sin(deg2rad($latitude)))) / ($cosDec * cos(deg2rad($latitude))); /* XXX: What's the use of this block.. ? * if (!calc_sunset && cosH > 1 || calc_sunset && cosH < -1) { * throw doesnthappen(); * } */ /* step 7b: finish calculating H and convert into hours */ if ($calc_sunset) { $H = rad2deg(acos($cosH)); /* Sunset */ } else { $H = 360 - rad2deg(acos($cosH)); /* Sunrise */ } $H = $H / 15; /* step 8: calculate local mean time */ $T = $H + $RA - (0.06571 * $t) - 6.622; /* step 9: convert to UTC */ $UT = $T - $lngHour; while ($UT < 0) { $UTx = $UT + 24; assert ($UTx != $UT); /* askingtheguru: really needed? */ $UT = $UTx; } while ($UT >= 24) { $UTx = $UT - 24; assert ($UTx != $UT); /* askingtheguru: really needed? */ $UT = $UTx; } return $UT; } function php_do_sunrise_sunset($date, $retformat, $latitude, $longitude, $zenith, $gmt_offset, $calc_sunset) { if (is_int($date)) { $time = $date; } elseif (is_string($date)) { /* todo: more user friendly format */ } else { /* date must be timestamp for now */ return false; } $N = date("z", $time) + 1; if ($retformat === "") { $retformat = SUNFUNCS_RET_STRING; } if ($latitude === "") { $latitude = SUNFUNCS_DEFAULT_LATITUDE; } if ($longitude === "") { $longitude = SUNFUNCS_DEFAULT_LONGITUDE; } if ($zenith === "") { if($calc_sunset) { $zenith = SUNFUNCS_SUNSET_ZENITH; } else { $zenith = SUNFUNCS_SUNRISE_ZENITH; } } if ($gmt_offset === "") { $gmt_offset = date("Z", $time) / 3600; } $ret = php_sunrise_sunset($N, $latitude, $longitude, $zenith, $calc_sunset) + $gmt_offset; switch ($retformat) { case SUNFUNCS_RET_TIMESTAMP: return floor($time - ($time % (24 * 3600))) + floor(60 * $ret); break; case SUNFUNCS_RET_STRING: $N = floor($ret); return sprintf("%02d:%02d", $N, floor(60 * ($ret - $N))); break; case SUNFUNCS_RET_DOUBLE: return $ret; break; default: return false; break; } } if (!function_exists("date_sunrise")) { function date_sunrise($date, $retformat = "", $latitude = "", $longitude = "", $zenith = "", $gmt_offset = "") { return php_do_sunrise_sunset($date, $retformat, $latitude, $longitude, $zenith, $gmt_offset, 0); } } if (!function_exists("date_sunset")) { function date_sunset($date, $retformat = "", $latitude = "", $longitude = "", $zenith = "", $gmt_offset = "") { return php_do_sunrise_sunset($date, $retformat, $latitude, $longitude, $zenith, $gmt_offset, 1); } } ?>

« previous php.pear.cvs (#21695) next »