solang.inc.php
下記ファイルの内容を表示しています。 ダウンロードを行うにはファイル名をクリックしてください。
<?php
// 太陽高度・方位を求める関数
function solar_angle($lat=NULL,$lon=NULL,$dt=NULL,$timelon=NULL) {
/*
この関数は下記サイトにある solang2c.c を移植したものです
http://tama.green.gifu-u.ac.jp/~tama/soft/sample_prog/solang/
<引数>
$lat : 緯度
$lng : 経度
$dt : 日時 Unixタイムスタンプ
$timelon : 標準時子午線経度
<戻り値>
配列に、太陽高度、方位が度単位で戻ります
<使い方>
list($elevation,$azimuth) = solar_angle(37,139,time(),135);
*/
/*
! calculate solar elevation angle and azimuthal angle
! using day_of_year, and time (hour)
! latitude and longitude of the place is set below
! also latitude of the place for time (JST)
! elevation, azimuth in radian
! from http://ffpsc.agr.kyushu-u.ac.jp/forman/muratac/solar/solpos1.html
! it say 'from 6s'
*/
// デフォルト値は日本経緯度原点
$lat = is_null($lat) ? 35+39/60+29.1572/3600 : $lat;
$lon = is_null($lon) ? 139+44/60+28.8869/3600 : $lon;
// デフォルト値は現在日時(JST)
$dt = is_null($dt) ? time() : $dt;
$timelon = is_null($timelon) ? 135 : $timelon;
$yday = date('z',$dt)+1;
$hour = date('H',$dt)+date('i',$dt)/60+date('s',$dt)/3600;
$lat1 = $lat * pi()/180;
$lon1 = $lon * pi()/180;
$A = 2*pi()*$yday/365;
$declination = 0.006918 - 0.399912*cos($A)+0.070257*sin($A)
-0.006758*cos(2*$A) + 0.000907*sin(2*$A)
-0.002697*cos(3*$A) + 0.001480*sin(3*$A);
$localtime = $hour + ($lon-$timelon)/15;
$B = 2*pi()*$yday/365;
$et = (0.000075 + 0.001868 * cos($B) -0.032077*sin($B)
-0.014615 * cos(2*$B) -0.040849 * sin(2*$B) ) * 12 / pi();
$t = 15 * (pi()/180) * ($localtime + $et - 12);
$coszenith = sin($declination)*sin($lat1)
+cos($declination)*cos($lat1)*cos($t);
$elevation = 0.5*pi() - acos($coszenith);
$sinkai = cos($declination)*sin($t)/sin(0.5*pi()-$elevation);
$coskai = (-cos($lat1)*sin($declination)+sin($lat1)*cos($declination)*cos($t))
/sin(0.5*pi()-$elevation);
$kai = asin( $sinkai );
if ($coskai<0) {
$kai1 = pi() - $kai;
} else if ($coskai>0 && $sinkai<0) {
$kai1 = 2*pi()+$kai;
} else {
$kai1 = $kai;
}
$kai1 = $kai1+pi();
if ($kai1>2*pi()) {
$kai1 = $kai1 - 2*pi();
}
$azimuth = $kai1;
return array($elevation*180/pi(),$azimuth*180/pi());
}
// 10進経緯度⇒60進経緯度変換
function dec2sex($dec) {
$pms = ($dec<0) ? '-' : '';
$dec = abs($dec);
$sex[0] = floor($dec);
$sex[1] = floor(($dec-$sex[0])*60);
$sex[2] = floor(($dec-$sex[0]-$sex[1]/60)*3600);
return $pms.$sex[0].'°'.str_pad($sex[1],2,'0',STR_PAD_LEFT)."'".str_pad($sex[2],2,'0',STR_PAD_LEFT).'"';
}
// 16方位に変換
function dir16($dir,$e='J') {
$d16['J'] = array('北','北北東','北東','東北東','東','東南東','南東','南南東','南','南南西','南西','西南西','西','西北西','北西','北北西');
$d16['E'] = array('N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','WNW','SW','SSW');
$dir += 360/16/2;
if ($dir>=360) $dir -= 360;
$i = floor($dir/(360/16));
return $d16[$e][$i];
}
?>