GoogleSatTrack2

GoogleSatTrack 2 plus - satellite tracker on google maps

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; } } ?>



$sat1_name "); ?> "); print("元期 $sat1_epoch ($sat1_elapsed_time_tmp UTC)
"); print("軌道傾斜角 $sat1_inclination
"); print("昇交点赤経 $sat1_right_ascension
"); print("離心率 $sat1_eccentricity
"); print("近地点引数 $sat1_argument_of_perigee
"); print("元期平均近点離角 $sat1_mean_anomaly
"); print("平均運動 $sat1_mean_motion
"); ?> 元期からの経過時間(日) : now computing...
軌道長半径(km) : now computing...
平均近点離角 : now computing...
離心近点角 : now computing...
動径 : now computing...
軌道面XY座標 X : now computing... Y : now computing...
地心赤道座標 a : now computing... b : now computing... c : now computing...
グリニッジ平均恒星時 : now computing...
G系地心直交座標u : now computing... v : now computing... w : now computing...
緯度 : now computing... 経度 : now computing... 高度 : now computing...

Custom Orbit

"); ?> $orbital_elements
"); ?> NORAD/NASA 2行軌道要素(Two-Line Element)を指定すると任意の人工衛星の現在位置を表示します。
「1行目:衛星名、2行目:軌道要素1行目、3行目:軌道要素2行目」という形で指定してください。
例)ハッブル宇宙望遠鏡 (2005.08.01)


URL指定する場合は、軌道要素内の半角スペース(" ")を全て半角のアンダーライン("_")に変換し、
各行をカンマ(",")で区切り「googlesat2_plus.php?data=ラベル,1行目,2行目」の形式で指定してください。
例)ハッブル宇宙望遠鏡


Reference

軌道要素の入手先
CelesTrak
Space-Track

2行軌道要素の解説
2行軌道要素 (電気通信大学 菅平宇宙電波観測所)

Bibliography

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

Source Code

http://www.lizard-tail.com/isana/lab/googlesat/googlesat2_plus.txt
GoogleMapsAPIに関する権利はGoogleが保有しています。それ以外の部分については、Creative Commons Public Domainに順ずるものと考えてください。