見出し画像

Python module ephem(4.1.5) の使い方



Install 

ubuntsu 上(raspberry-pi OSを含む)でのインストレーション。
ephemを使用するためのpython 仮想環境も作成しその中で計算・作業を行う。

$ python3 -m venv ephem
$ source ephem/bin/activate
(ephem)$
(ephem)$ cd ephem
(ephem)$ mkdir work
(ephem)$ pip3 install ephem==4.1.5
(ephem)$
(ephem)$ python3
>>> import ephem

主な使い方

時刻の指定

ephem内部で使用される時刻は、必ずUTCである。日本での時刻を使用する場合は時差9時間を踏まえた変換が必要である。
Pythonで使用されるモジュールdatetimeではhost上のlocal timeが使用される事が多いため、間違えない様に変換を行う必要がある。

ephem.localtime(UTC_TIME)を使用する事が可能。

timezoneを使用する場合は、以下の薄明時刻計算例を参照とする。

観測場所の指定方法

XEphemデータベースに事前に定義されている都市をephem.city()から指定する事が可能である。'Tokyo', 'Osaka'等、time zone指定で使用される都市名はephemの観測地点としてXEphemに登録されている様である。  
(PyEphem knows 122 world cities.)
新に観測地点を定義する場合、Observer objectからinstanceを作成し、
都市名,緯度(°),経度(°),標高(m)を指定する。緯度、経度は°以下を小数点で表示した(分(')秒(")を用いない)文字列で与え、標高は整数値で与える事に注意。
東京・大阪などの「主要」都市でない場合や、東京都内で有っても、実際の観測地点がXEphemに登録されている情報(緯度経度標高)と異なる場合は新たにインスタンスを作成しこれらの情報を設定しなければならない。
例として、以下に長野県諏訪市のAMEDASの設置点を指定する場合を記す。

(ephem) $ python3
>>> import ephem
>>> import datetime
>>> # Suwa City AMEDAS location
>>> suwa=ephem.Observer()
>>> suwa.name='Suwa'
>>> suwa.lat='36.045'
>>> suwa.lon='138.108'
>>> suwa.elevation=760
>>> 

日出,日没時刻の計算

天文年鑑(誠文堂新光社)では日出、日没は、太陽上縁が地平線と接するタイミングで定義しており。ephemに依る日出・日没時刻計算もこの定義に準ずる。

観測場所objectの.dateフィールドに希望する時刻をUTCで指定する。
その後、対象天体として太陽(ephem.Sun()で事前定義されている)を指定しメンバー関数.next_rising(sun)で指定時刻の後に発生する直近の日出時刻を、メンバー関数.next_setting(sun)で指定時刻の後に発生する直近の日没時刻をそれぞれUTCで計算する事が出来る。
時差を反映した観測場所のlocal timeで表示する為にはephem.localtime()を
使用する。 指定時刻以前の日出,日没時刻を計算する場合は、メンバー関数
.previous_rising(sun),  .previous_setting(sun) を使用する。

>>>
>>> suwa.date=datetime.datetime.utcnow()
>>> print(suwa.date)
2024/2/4 18:12:22
>>> print(ephem.localtime(suwa.date))
2024-02-05 03:12:21.789127
>>>
>>> sun=ephem.Sun()
>>> 
>>> print(suwa.next_rising(sun))
2024/2/4 21:44:54
>>> print(ephem.localtime(suwa.next_rising(sun)))
2024-02-05 06:44:54.497752
>>>
>>> print(suwa.next_setting(sun))
2024/2/5 08:17:32
>>> print(ephem.localtime(suwa.next_setting(sun)))
2024-02-05 17:17:31.564506
>>>

月出,月没時刻の計算

天文年鑑(誠文堂新光社)では月出、月没は、月の中心が地平線と接するタイミングで定義しているが、ephemに依る月出・月没時刻計算は日出・日没同様、月の上縁が地平線に接するタイミングを月出・月没の定義とする
そのため、ephemに依る月出・月没時刻の計算結果は天文年鑑に記載されている時刻と約2分程度の差が発生する
日出,日没と異なり、一日の中で発生する月出,月没の順序は日によって異なるため指定時刻前後両方で発生する月出,月没を計算した上で指定時刻と比較して事象発生の前後関係を把握する必要がある。
対象となる天体月はephem.Moon()としてephemに定義済である。

>>>
>>> moon=ephem.Moon()
>>>
>>> mpr=suwa.previous_rising(moon)
>>> print(mpr)
2024/2/4 17:22:22
>>> print(ephem.localtime(mpr))
2024-02-05 02:22:21.516998
>>>
>>> mps=suwa.previous_setting(moon)
>>> print(mps)
2024/2/4 02:19:21
>>> print(ephem.localtime(mps))
2024-02-04 11:19:21.088698
>>>
>>> mnr=suwa.next_rising(moon)
>>> print(mnr)
2024/2/5 18:29:15
>>> print(ephem.localtime(mnr))
2024-02-06 03:29:15.062036
>>>
>>> mns=suwa.next_setting(moon)
>>> print(mns)
2024/2/5 03:00:03
>>> print(ephem.localtime(mns))
2024-02-05 12:00:03.038652
>>>
>>>

薄明開始時刻の計算

  • 薄明の定義(-6°,-12°,-18°)

日出前、或いは日没後の太陽の中心が水平線以下に有る状態で、太陽光の影響により薄明るさが有る状態を薄明と呼ぶ。薄明の明るさ(暗さ)の程度がどの様な人間活動に影響が有るかどうかにより、市民薄明(Civil Twilight), 航海薄明(Nautical Twilight),天文薄明(Astronomial Twilight)と呼ぶ。

  • 市民薄明(Civil/Citizen Twilight)

太陽中心が日出前・日没後に水平線下6°より上に有る時間。太陽が東側に有る時(日出前)、市民薄明開始時刻、西側に有る(日没後)時市民薄明終了時刻となる。市民薄明開始から市民薄明終了までの間、照明等が無い状態での一般市民生活が可能となる。

  • 航海薄明(Nautical Twilight)

太陽中心が水平線下6°から12°の間に有る時間。太陽が東側に有る時(日出前)、航海薄明開始時刻、西側に有る(日没後)時航海薄明終了時刻となる。航海薄明開始から航海薄明終了までの間、目視での船舶航海が可能となる。

  • 天文薄明(Astronomical Twilight)

太陽中心が水平線下12°から18°の間に有る時間。太陽が東側に有る時(日出前)、天文薄明開始時刻、西側に有る(日没後)時、天文薄明終了時刻となる。天文薄明終了から天文薄明開始までの間、天文観測可能な暗さとなる。

各薄明開始時刻を計算するためには指定時刻として観測地点インスタンスのdate変数としてlocal timeで深夜(0時等)を設定し、観測地点インスタンスのメンバー変数地horizon(地平線)をそれぞれ-6°,-12°,-18°で設定してメンバー関数.revious_setting(sun,use_center_True)を,
各薄明終了時刻を計算するためにはメンバー関数next_rising(sun,use>>_center=True)を使用する。

>>> from zoneinfo import ZoneInfo
>>> suwa.date=datetime.datetime(2024,2,5,0,0,0,tzinfo=ZoneInfo(key='Asia/Tokyo'))
>>> suwa.date
45325.125
>>> print(suwa.date)
2024/2/4 15:00:00
>>> ephem.localtime(suwa.date)
datetime.datetime(2024, 2, 5, 0, 0)
>>> print(ephem.localtime(suwa.date))
2024-02-05 00:00:00
>>>
>>> suwa.horizon='-6'
>>> civil_end=suwa.previous_setting(sun,use_center=True)
>>> civil_start=suwa.next_rising(sun,use_center=True)
>>> print(civil_end,civil_start)
2024/2/4 08:43:46 2024/2/4 21:17:41
>>> print(ephem.localtime(civil_end),ephem.localtime(civil_start))
2024-02-04 17:43:46.029822 2024-02-05 06:17:41.131168
>>>
>>> suwa.horizon='-12'
>>> nautical_end=suwa.previous_setting(sun,use_center=True)
>>> nautical_start=suwa.next_rising(sun,use_center=True)
>>> print(nautical_end,nautical_start)
2024/2/4 09:13:34 2024/2/4 20:47:57
>>> print(ephem.localtime(nautical_end),ephem.localtime(nautical_start))
2024-02-04 18:13:33.708422 2024-02-05 05:47:57.020092
>>>
>>> suwa.horizon='-18'
>>> astronomical_end=suwa.previous_setting(sun,use_center=True)
>>> astronomical_start=suwa.next_rising(sun,use_center=True)
>>> print(astronomical_end,astronomical_start)
2024/2/4 09:43:39 2024/2/4 20:17:54
>>> print(ephem.localtime(astronomical_end),ephem.localtime(astronomical_start))
2024-02-04 18:43:39.331368 2024-02-05 05:17:54.387018
>>>

その他の使い方

子午線通過(南中,子午線下方通過)時刻の計算

メンバー関数.previous_transit(), .next_transit()は、指定時刻に対する対象天体の(直前の)子午線通過(南中)時刻と、子午線下方通過時刻と、直後の子午線通過時刻と子午線下方通過時刻。

>>> print(ephem.localtime(suwa.previous_transit(sun)))
2024-02-04 12:00:54.670852
>>> print(ephem.localtime(suwa.next_transit(sun)))
2024-02-05 12:01:00.457336
>>>
>>> print(ephem.localtime(suwa.next_antitransit(sun)))
2024-02-05 00:00:57.663196
>>> print(ephem.localtime(suwa.previous_antitransit(sun)))
2024-02-04 00:00:51.480271
>>>

この記事が気に入ったらサポートをしてみませんか?