Google Maps APIを利用して人工衛星の現在位置を表示します。
iss_data();
}else{
$mode="custom";
$sat1_data=$data_loader->custom_data($orbital_elements);
}
list ($sat1_satnum,$sat1_epoch_year,$sat1_epoch,$sat1_inclination,$sat1_right_ascension,$sat1_eccentricity,$sat1_argument_of_perigee,$sat1_mean_anomaly,$sat1_mean_motion,$sat1_elapsed_time,$sat1_name,$sat1_data_source) = $sat1_data;
$sat1_elapsed_time_tmp=date('Y.n.j H:i:s',mktime(0,0,0,1,0,$sat1_epoch_year)+($sat1_epoch*24*60*60));
$calc_sat1=new orbitCalc($sat1_satnum,$sat1_epoch_year,$sat1_epoch,$sat1_inclination,$sat1_right_ascension,$sat1_eccentricity,$sat1_argument_of_perigee,$sat1_mean_anomaly,$sat1_mean_motion,$sat1_elapsed_time,$sat1_name,$sat1_data_source);
$sat1_long=$calc_sat1->long();
$sat1_lat=$calc_sat1->lat();
$sat1_alt=$calc_sat1->alt();
class dataLoader{
function custom_data($orbital_elements){
$data_source="custom";
$orbital_elements = explode("\n",$orbital_elements);
$data0=chop($orbital_elements[0]);
$data1=chop($orbital_elements[1]);
$data2=chop($orbital_elements[2]);
$satnum=substr($data1,2,16);
$epoch_year=substr($data1,18,2); //元期年
$epoch=substr($data1,20,12); //元期
$inclination=substr($data2,8,8);//軌道傾斜角
$right_ascension=substr($data2,17,8);//昇交点赤経
$eccentricity="0.".substr($data2,26,7); //離心率
$argument_of_perigee=substr($data2,34,8);//近地点引数
$mean_anomaly=substr($data2,43,8);//平均近点角
$mean_motion=substr($data2,52,11);//平均運動
$a=42241.09773/pow($mean_motion,2/3);//軌道長半径
$elapsed_time=(time()-(mktime(0,0,0,1,0,$epoch_year)+($epoch*24*60*60)))/(60*60*24);
$elapsed_time=$elapsed_time-0.375;
$sat_name=$data0;
$custom_sat_data = array($satnum,$epoch_year,$epoch,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion,$elapsed_time,$sat_name,$data_source);
return $custom_sat_data;
}
//Data for ISS
function iss_data(){
$data_source="local";
$sat_name="International Space Station";
$fp = file("./data_iss2.txt");
$iss_data=$fp[0];
$iss_data = explode(",",$iss_data);
list ($satnum,$epoch_year,$epoch,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion) = $iss_data;
$elapsed_time=(time()-(mktime(0,0,0,1,0,$epoch_year)+($epoch*24*60*60)))/(60*60*24);
$elapsed_time=$elapsed_time-0.375;
if($elapsed_time>0.5){
$data_source="external";
$fp = file("http://celestrak.com/NORAD/elements/stations.txt");
if($fp){
$iss_data0=$fp[0];
$iss_data1=$fp[1];
$iss_data2=$fp[2];
$satnum=substr($iss_data1,2,16);
$epoch_year=substr($iss_data1,18,2); //元期年
$epoch=substr($iss_data1,20,12); //元期
$inclination=substr($iss_data2,8,8);//軌道傾斜角
$right_ascension=substr($iss_data2,17,8);//昇交点赤経
$eccentricity="0.".substr($iss_data2,26,7); //離心率
$argument_of_perigee=substr($iss_data2,34,8);//近地点引数
$mean_anomaly=substr($iss_data2,43,8);//平均近点角
$mean_motion=substr($iss_data2,52,11);//平均運動
$a=42241.09773/pow($mean_motion,2/3);//軌道長半径
$elapsed_time=(time()-(mktime(0,0,0,1,0,$epoch_year)+($epoch*24*60*60)))/(60*60*24);
$elapsed_time=$elapsed_time-0.375;
$save_data="$satnum,$epoch_year,$epoch,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion";
$orbital_elements="$iss_data0\n$iss_data1\n$iss_data2\n";
$fp = fopen("data_iss2.txt", 'w+');
fwrite($fp, $save_data);
fclose($fp);
}
}
$iss_data = array($satnum,$epoch_year,$epoch,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion,$elapsed_time,$sat_name,$data_source);
return $iss_data;
}
}
class orbitCalc{
var $satnum;
var $epoch;
var $inclination;
var $right_ascension;
var $eccentricity;
var $argument_of_perigee;
var $mean_anomaly;
var $mean_motion;
var $data_source;
function orbitCalc($satnum,$epoch_year,$epoch,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion,$elapsed_time,$sat_name,$data_source){
$this->satnum=$satnum;
$this->epoch=$epoch;
$this->epoch_year=$epoch_year;
$this->inclination=$inclination;
$this->right_ascension=$right_ascension;
$this->eccentricity=$eccentricity;
$this->argument_of_perigee=$argument_of_perigee;
$this->mean_anomaly=$mean_anomaly;
$this->mean_motion=$mean_motion;
$this->data_source=$data_source;
$this->elapsed_time=$elapsed_time;
}
//軌道長半径
function semi_major_axis(){
$mean_motion=$this->mean_motion;
$a=42241.09773/pow($mean_motion,2/3);
return $a;
}
//平均近点角
function mean_anomaly_now(){
$mean_motion=$this->mean_motion;
$mean_anomaly=$this->mean_anomaly;
$elapsed_time=$this->elapsed_time;
$n=$mean_motion*360;
$l=$n*$elapsed_time+$mean_anomaly;
if($l>360){
while($l>360){
$l=$l-360;
}
}
$l=deg2rad($l);
return $l;
}
//ケプラーの方程式を解いて離心近点角を求める
function eccentric_anomaly(){
$l=$this->mean_anomaly_now();
$eccentricity=$this->eccentricity;
$u=$l;
do{
$ut=$u;
$delta_u=( $l-$u+($eccentricity*sin($u)) )/( 1- ($eccentricity*cos($u)) );
$u=$u+$delta_u;
}while (abs($ut-$u)>0.00000001);
return $u;
}
//動径
function radius(){
$a=$this->semi_major_axis();
$u=$this->eccentric_anomaly();
$eccentricity=$this->eccentricity;
$r=$a*(1-($eccentricity*cos($u)));
return $r;
}
//軌道面XY座標
function x_axis(){
$a=$this->semi_major_axis();
$u=$this->eccentric_anomaly();
$eccentricity=$this->eccentricity;
$x=$a*(cos($u)-$eccentricity);
return $x;
}
function y_axis(){
$a=$this->semi_major_axis();
$u=$this->eccentric_anomaly();
$eccentricity=$this->eccentricity;
$y=$a*sqrt(1-pow($eccentricity,2))*sin($u);
return $y;
}
//地心赤道座標
function as_axis(){
$x=$this->x_axis();
$y=$this->y_axis();
$right_ascension=$this->right_ascension;
$argument_of_perigee=$this->argument_of_perigee;
$inclination=$this->inclination;
$as=$x*(cos(deg2rad($right_ascension))*cos(deg2rad($argument_of_perigee))-sin(deg2rad($right_ascension))*cos(deg2rad($inclination))*sin(deg2rad($argument_of_perigee)))-$y*(cos(deg2rad($right_ascension))*sin(deg2rad($argument_of_perigee))+sin(deg2rad($right_ascension))*cos(deg2rad($inclination))*cos(deg2rad($argument_of_perigee)));
return $as;
}
function bs_axis(){
$x=$this->x_axis();
$y=$this->y_axis();
$right_ascension=$this->right_ascension;
$argument_of_perigee=$this->argument_of_perigee;
$inclination=$this->inclination;
$bs=$x*(sin(deg2rad($right_ascension))*cos(deg2rad($argument_of_perigee))+cos(deg2rad($right_ascension))*cos(deg2rad($inclination))*sin(deg2rad($argument_of_perigee)))-$y*(sin(deg2rad($right_ascension))*sin(deg2rad($argument_of_perigee))-cos(deg2rad($right_ascension))*cos(deg2rad($inclination))*cos(deg2rad($argument_of_perigee)));
return $bs;
}
function cs_axis(){
$x=$this->x_axis();
$y=$this->y_axis();
$right_ascension=$this->right_ascension;
$argument_of_perigee=$this->argument_of_perigee;
$inclination=$this->inclination;
$cs=$x*sin(deg2rad($inclination))*sin(deg2rad($argument_of_perigee))+$y*sin(deg2rad($inclination))*cos(deg2rad($argument_of_perigee));
return $cs;
}
//グリニッジ平均恒星時
function gst(){
$year=gmdate("Y");
$month=gmdate("n");
$day=gmdate("j");
$hour=gmdate("H");
$minute=gmdate("i");
$t=$hour+$minute/60;
$yt=$year;
$mt=$month;
if($mt <= 2){
$yt = $yt - 1;
$mt = $mt + 12;
}
$yt=$yt-1900;
$k=(365*$yt)+(30*$mt)+$day-33.5+floor((3/5)*($mt+1))+floor($yt/4);
$k=$k/36525;
$gst=((6*3600+38*60+45.836)+8640184.542*$k+0.0929*$k*$k);
$gst=$gst/3600;
$gst=$gst+$t;
while($gst>24){
$gst=$gst-24;
}
$gst=$gst*15;
return $gst;
}
//G系地心直交座標
function us_axis(){
$as=$this->as_axis();
$bs=$this->bs_axis();
$gst=$this->gst();
$us=$as*cos(deg2rad($gst))+$bs*sin(deg2rad($gst));
return $us;
}
function vs_axis(){
$as=$this->as_axis();
$bs=$this->bs_axis();
$gst=$this->gst();
$vs=-$as*sin(deg2rad($gst))+$bs*cos(deg2rad($gst));
return $vs;
}
function ws_axis(){
$cs=$this->cs_axis();
$ws=$cs;
return $ws;
}
//緯度、経度、高度に換算
function long(){
$us=$this->us_axis();
$vs=$this->vs_axis();
$long=rad2deg(atan($vs/$us));
if($us<0){
$long=$long+180;
}
$long=round($long,4);
if($long>=180){
$long=$long-360;
}
return $long;
}
function tan_lat(){
$us=$this->us_axis();
$vs=$this->vs_axis();
$ws=$this->ws_axis();
$ae2=6377.397155*0.006674372230614;
$t_lat1=sqrt($us*$us+$vs*$vs);
$t_lat2=$ws/$t_lat1;
$t_lat3=$ae2/$t_lat1;
$tan_lat=0;
do{
$tmp=$tan_lat;
$tan_lat= $t_lat2+$t_lat3*($tan_lat/sqrt(1+0.99332*$tan_lat*$tan_lat));
}while (abs($tan_lat-$tmp)>0.00000001);
return $tan_lat;
}
function lat(){
$tan_lat=$this->tan_lat();
$lat=rad2deg(atan($tan_lat));
$lat=round($lat,4);
return $lat;
}
function alt(){
$tan_lat=$this->tan_lat();
$ws=$this->ws_axis();
$a=6377.397155;
$e2=0.006674372230614;
$t_alt1=sqrt(1+$tan_lat*$tan_lat);
$t_alt2=($ws/$tan_lat);
$t_alt3=$a*(1-$e2)/(sqrt(1+(1-$e2)*$tan_lat*$tan_lat));
$alt=$t_alt1*($t_alt2-$t_alt3);
$alt=round($alt,4);
return $alt;
}
}
?>