cvs: pear /Services_Weather/examples php_sunrise_sunset.php
| From: | Alexander Wirtz | 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);
}
}
?>