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];

}

?>