Google Map API v3 で昼夜境界線を描きたいと思い勉強中。
昼夜境界線の求め方
日の出時刻は詳しく求めはじめると複雑な計算が必要になるので、
次の3段階の手順で緯度・経度が求められる。
1.
その日の0時0分の経度0度でも緯度(-85から+85度)の日出/日入時間を求める
(※緯度が90度では無いのはGoogleMapApiが+-85度までしか表示してないため)
(※時間が求められない場合は日が沈まないの白夜か、日が登らない極夜)
2.
地球は約24時間で360度(1分0.25度)自転してるとして「上で求めた時間×360度/24時間」とする事で
00時00分の各緯度(-85から+85度)の日出/日入の経度が求められる
(※正確な自転周期は23時間56分4.098 903 691秒)
3.
上は00時00分の経度なので、
現時刻の経度は「現在時間×360度/24時間」を引いた値が
※引くのは太陽が東(+座標)から西(-座標)に向かって動いてるため
この計算方法だと、地球は自転しながら太陽の周りを公転していので時間が24時に近づくほどズレが大きくなる欠点があるが1分程度と思われるで自分が必要とする精度はクリアしている。
例
2015年1月1日、経度0度、各緯度の日の出時刻(世界標準時)
・北緯60度の時 9:02
・北緯30度の時 6:56
・北緯 0度の時 6:00
約24時間で360度(1分0.25度)自転してるとして「各日の出時間×360度/24時間」とすると時間を00時00分の日の出の経度が求められる。
・北緯60度の時 東経135.5度
・北緯30度の時 東経104度
・北緯 0度の時 東経90度
現在時刻が6:00だったとすると、「現在時間×360度/24時間」で地球は0時0分から90度回転してるので
上記の角度から90度引くと現在の日出を観測できる座標となる。
・北緯60度の時 東経45.5度
・北緯30度の時 東経14度
・北緯 0度の時 東経0度
この点を結び、西側が夜、東側が昼になります。
Google Map API v3の注意点
・緯度は+85度から-85度まで、+-85度以上は地図が無い。
・東経と西経はつながっているため、ポリゴンの座標が離れすぎると東回りで線が引かれる時と西回りで線が引かれる時があるので注意する事。
例えば日本とアメリカの2点に線を引くプログラムをした場合、太平洋を越えて線が引かれる時とユーラシア大陸を超えて線が引かれる事があるので、中間点を指定する事で回避できる。
発生要件は不明だが、距離だけでは無く座標でも変わるので、昼夜境界線は相対位置や距離はかわならいけど時間で座標が西に動いていくので特定条件下で発生する可能性がある。
参考プログラムの一部
グローバル変数で指定
var polygon=[];
・ポリゴン表示方法
var pol;
pol.push(new google.maps.LatLng(緯度1,経度1));
pol.push(new google.maps.LatLng(緯度2,経度2));
pol.push(new google.maps.LatLng(緯度3,経度3));
polygon[0]=new google.maps.Polygon({paths: pol, strokeColor: “#000000”, strokeOpacity: 0.1, strokeWeight: 1, fillColor: “#000000”, fillOpacity: 0.35, zIndex:1});
polygon[0].setMap(map); //後で表示させる場合は実行しない。
・昼夜境界線は時間で動いていくので再計算・再表示が必要なので、ポリゴンの差し替え方法とリロード方法
var pol;
pol.push(new google.maps.LatLng(緯度1,経度1));
pol.push(new google.maps.LatLng(緯度2,経度2));
pol.push(new google.maps.LatLng(緯度3,経度3));
polygon[0].setPath( pol ); //ポリゴンを差し替える
setTimeout(“再計算関数()”, 30000); //30秒で再計算プログラムをロードさせる
・ポリゴン非表示にする
polygon[0].setMap(null);
・非表示にしたポリゴン表示する
polygon[0].setMap(map);
—————-