GoogleSatTrack - satellite tracker on google maps

Google Maps APIを利用して、ページが読み込まれた瞬間のディスカバリーと国際宇宙ステーションの現在位置を表示します。
「googlesat.php?zoom=12&marker=off」の書式で、拡大率とマーカーのON/OFFを変更できます。

iss_data(); list ($iss_satnum,$iss_epoch,$iss_inclination,$iss_right_ascension,$iss_eccentricity,$iss_argument_of_perigee,$iss_mean_anomaly,$iss_mean_motion,$iss_data_source,$iss_elapsed_time) = $iss_data; $iss_elapsed_time_tmp=date('Y.n.j H:i:s',mktime(0,0,0,1,0,date('Y',time()))+($iss_epoch*24*60*60)); $calc_iss=new orbitCalc($iss_satnum,$iss_epoch,$iss_inclination,$iss_right_ascension,$iss_eccentricity,$iss_argument_of_perigee,$iss_mean_anomaly,$iss_mean_motion,$iss_data_source,$iss_elapsed_time); $iss_a=$calc_iss->semi_major_axis(); $iss_l=$calc_iss->mean_anomaly_now(); $iss_l_tmp=rad2deg($iss_l); $iss_u=$calc_iss->eccentric_anomaly(); $iss_u_tmp=rad2deg($iss_u); if($iss_u_tmp>360){ while($iss_u_tmp>360){$iss_u_tmp=$iss_u_tmp-360;} } $iss_f=$calc_iss->true_anomaly(); $iss_r=$calc_iss->radius(); $iss_x=$calc_iss-> x_axis(); $iss_y=$calc_iss-> y_axis(); $iss_as=$calc_iss-> as_axis(); $iss_bs=$calc_iss-> bs_axis(); $iss_cs=$calc_iss-> cs_axis(); $iss_gst=$calc_iss-> gst(); $iss_us=$calc_iss->us_axis(); $iss_vs=$calc_iss->vs_axis(); $iss_ws=$calc_iss->ws_axis(); $iss_long=$calc_iss->long(); $iss_lat=$calc_iss->lat(); $iss_alt=$calc_iss->alt(); //STS $data_loader=new dataLoader(); $sts_data=$data_loader->sts_data(); list ($sts_satnum,$sts_epoch,$sts_inclination,$sts_right_ascension,$sts_eccentricity,$sts_argument_of_perigee,$sts_mean_anomaly,$sts_mean_motion,$sts_data_source,$sts_elapsed_time) = $sts_data; $sts_elapsed_time_tmp=date('Y.n.j H:i:s',mktime(0,0,0,1,0,date('Y',time()))+($sts_epoch*24*60*60)); $calc_sts=new orbitCalc($sts_satnum,$sts_epoch,$sts_inclination,$sts_right_ascension,$sts_eccentricity,$sts_argument_of_perigee,$sts_mean_anomaly,$sts_mean_motion,$sts_data_source,$sts_elapsed_time); $sts_a=$calc_sts->semi_major_axis(); $sts_l=$calc_sts->mean_anomaly_now(); $sts_l_tmp=rad2deg($sts_l); $sts_u=$calc_sts->eccentric_anomaly(); $sts_u_tmp=rad2deg($sts_u); if($sts_u_tmp>360){ while($sts_u_tmp>360){$sts_u_tmp=$sts_u_tmp-360;} } $sts_f=$calc_sts->true_anomaly(); $sts_r=$calc_sts->radius(); $sts_x=$calc_sts-> x_axis(); $sts_y=$calc_sts-> y_axis(); $sts_as=$calc_sts-> as_axis(); $sts_bs=$calc_sts-> bs_axis(); $sts_cs=$calc_sts-> cs_axis(); $sts_gst=$calc_sts-> gst(); $sts_us=$calc_sts->us_axis(); $sts_vs=$calc_sts->vs_axis(); $sts_ws=$calc_sts->ws_axis(); $sts_long=$calc_sts->long(); $sts_lat=$calc_sts->lat(); $sts_alt=$calc_sts->alt(); class dataLoader{ //Data for ISS function iss_data(){ $data_source="local"; $fp = file("./data_iss.txt"); $iss_data=$fp[0]; $iss_data = explode(",",$iss_data); list ($satnum,$epoch,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion) = $iss_data; $elapsed_time=(time()-(mktime(0,0,0,1,0,date('Y',time()))+($epoch*24*60*60)))/(60*60*24); $elapsed_time=$elapsed_time-0.375; if($elapsed_time>1.2){ $data_source="external"; $fp = file("http://celestrak.com/NORAD/elements/stations.txt"); if($fp){ $iss_data1=$fp[1]; $iss_data2=$fp[2]; $satnum=substr($iss_data1,2,16); $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,date('Y',time()))+($epoch*24*60*60)))/(60*60*24); $elapsed_time=$elapsed_time-0.375; $save_data="$satnum,$epoch,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion"; $fp = fopen("data_iss.txt", 'w+'); fwrite($fp, $save_data); fclose($fp); } } $iss_data = array($satnum,$epoch,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion,$data_source,$elapsed_time); return $iss_data; } //Data for STS function sts_data(){ $data_source="local"; $fp = file("./data_sts.txt"); $sts_data=$fp[0]; $sts_data = explode(",",$sts_data); list ($satnum,$epoch,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion) = $sts_data; $elapsed_time=(time()-(mktime(0,0,0,1,0,date('Y',time()))+($epoch*24*60*60)))/(60*60*24); //$elapsed_time=$elapsed_time+(5/(60*24)); $elapsed_time=$elapsed_time-0.375; if($elapsed_time>0.25){ $data_source="external"; $fp = file("http://celestrak.com/NORAD/elements/stations.txt"); if($fp){ $sts_data1=$fp[10]; $sts_data2=$fp[11]; $satnum=substr($sts_data1,2,16); $epoch=substr($sts_data1,20,12); //元期 $inclination=substr($sts_data2,8,8);//軌道傾斜角 $right_ascension=substr($sts_data2,17,8);//昇交点赤経 $eccentricity="0.".substr($sts_data2,26,7); //離心率 $argument_of_perigee=substr($sts_data2,34,8);//近地点引数 $mean_anomaly=substr($sts_data2,43,8);//平均近点角 $mean_motion=substr($sts_data2,52,11);//平均運動 $a=42241.09773/pow($mean_motion,2/3);//軌道長半径 $elapsed_time=(time()-(mktime(0,0,0,1,0,date('Y',time()))+($epoch*24*60*60)))/(60*60*24); //$elapsed_time=$elapsed_time+(5/(60*24)); $elapsed_time=$elapsed_time-0.375; $save_data="$satnum,$epoch,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion"; $fp = fopen("data_sts.txt", 'w+'); fwrite($fp, $save_data); fclose($fp); } } $sts_data = array($satnum,$epoch,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion,$data_source,$elapsed_time); return $sts_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,$inclination,$right_ascension,$eccentricity,$argument_of_perigee,$mean_anomaly,$mean_motion,$data_source,$elapsed_time){ $this->satnum=$satnum; $this->epoch=$epoch; $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; //$n=($mean_motion-floor($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 true_anomaly(){ $u=$this->eccentric_anomaly(); $eccentricity=$this->eccentricity; $f=atan( (sqrt(1-$eccentricity*$eccentricity)*sin($u))/(cos($u)-$eccentricity)); $f=rad2deg($f); if(cos($u)-$eccentricity<0){ $f=$f+180; } return $f; } //動径 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; } } ?>
STS \n"); print(" \n"); ?>


Intarnational Space Station ( data souce : $iss_data_source )"); print("衛星番号 : $iss_satnum
"); print("元期 : $iss_epoch ($iss_elapsed_time_tmp UTC)
"); print("軌道傾斜角 : $iss_inclination
"); print("昇交点赤経 : $iss_right_ascension
"); print("離心率 : $iss_eccentricity
"); print("近地点引数 : $iss_argument_of_perigee
"); print("元期平均近点離角 : $iss_mean_anomaly
"); print("平均運動 : $iss_mean_motion
"); print("
"); print("元期からの経過時間(日) : $iss_elapsed_time
"); print("軌道長半径(km) : $iss_a
"); print("離心率 : $iss_eccentricity
"); print("平均近点離角 : $iss_l_tmp
"); print("離心近点角 :$iss_u_tmp
"); print("真近点角 :$iss_f
"); print("動径 :$iss_r
"); print("軌道面XY座標 X:$iss_x Y:$iss_y
"); print("地心赤道座標 X:$iss_as Y:$iss_bs Z:$iss_cs
"); print("グリニッジ平均恒星時 :$iss_gst
"); print("G系地心直交座標 X:$iss_us Y:$iss_vs Z:$iss_ws
"); print("経度:$iss_long(±3) 緯度:$iss_lat(±3) 高度:$iss_alt
"); print("
"); print("

STS-114 ( data souce : $sts_data_source )

"); print("衛星番号 : $sts_satnum
"); print("元期 : $sts_epoch ($sts_elapsed_time_tmp UTC)
"); print("軌道傾斜角 : $sts_inclination
"); print("昇交点赤経 : $sts_right_ascension
"); print("離心率 : $sts_eccentricity
"); print("近地点引数 : $sts_argument_of_perigee
"); print("元期平均近点離角 : $sts_mean_anomaly
"); print("平均運動 : $sts_mean_motion
"); print("
"); print("元期からの経過時間(日) : $sts_elapsed_time
"); print("軌道長半径(km) : $sts_a
"); print("離心率 : $sts_eccentricity
"); print("平均近点離角 : $sts_l_tmp
"); print("離心近点角 :$sts_u_tmp
"); print("真近点角 :$sts_f
"); print("動径 :$sts_r
"); print("軌道面XY座標 X:$sts_x Y:$sts_y
"); print("地心赤道座標 X:$sts_as Y:$sts_bs Z:$sts_cs
"); print("グリニッジ平均恒星時 :$sts_gst
"); print("G系地心直交座標 X:$sts_us Y:$sts_vs Z:$sts_ws
"); print("経度:$sts_long(±3) 緯度:$sts_lat(±3) 高度:$sts_alt
"); ?>

Reference

NASA - Science@NASA Shuttle Tracking
NASA - Science@NASA International Space Station Track
Heavens Above : ISS - Orbit
Heavens Above : STS - Orbit
CelesTrak WWW : ISS Data

Bibliography

長沢工『天体の位置計算 増補版』地人書館 (amazon)

Source Code

http://www.lizard-tail.com/isana/lab/googlesat/googlesat.txt