mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - 日・月の出・入・南中スクリプト作成!

[ プログラミング ] [ Ruby ]

こんばんは。

先日は「旧暦カレンダー作成Rubyスクリプト」を紹介しました。

今回は、日の出・入の時刻・方位角、日の南中の時刻・高度、月の出・入の時刻・方位角、月の南中の時刻・高度を計算するRubyスクリプトを作成してみました。 コマンドラインで日付、緯度、経度、標高を指定して実行すると計算結果を出力します。( 時刻は日本時間(UTC+9)固定 )

【2016-06-09 追記】
RubyGems ライブラリ mk_calendar - RubyGems.org(or komasaru/mk_calendar - GitHub) を作成しました。
今後はできればこちらのライブラリの方をご活用ください。
【追記ここまで】

1500行ほどのスクリプトなので、このページでは表示できませんが、ソースをダウンロードできるようにしておきます。興味のある方はどうぞ。

使用方法

動作確認について

当Rubyスクリプトは WindowsXP(SP3) にインストールした Ruby1.9.2-p290 で動作確認しています。 別途Gemパッケージ等の導入も不要です。 他の環境(Linux等)で実行させるには文字コードの変更が必要になる場合があります。

使用方法

ダウンロードした圧縮ファイルを解凍後、コマンドプロンプトで引数を指定して"sun_moon.rb"を実行するだけです。

1
>ruby sun_moon.rb 第1引数 第2引数 第3引数 第4引数 [ 第5引数 ]

引数について

日付・緯度・経度・標高は必須です。オプションは省略すると全情報を出力します。 オプションを省略した場合の出力順は下記の第5引数の説明に記載のアルファベット順となります。 オプションを指定した場合は指定した順に出力します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
引数 : 第1 ( 日  付 )     [必須]   [ 99999999 ]
           計算対象の日付(グレゴリオ暦)を半角8桁数字で指定します。

       第2 ( 緯  度 )     [必須]   [ [+|-]999.99999999 | [+|-]999:99:99.99 ]
           緯度を 度 または 度・分・秒 で指定します。
           ( 北緯はプラス、南緯はマイナス )
           ( 度 の小数点以下、度・分・秒 の分以下は省略可 )

       第3 ( 経  度 )     [必須]   [ [+|-]999.99999999 | [+|-]999:99:99.99 ]
           経度を 度 または 度・分・秒 で指定します。
           ( 東経はプラス、西経はマイナス )
           ( 度 の小数点以下、度・分・秒 の分以下は省略可 )

       第4 ( 標  高 )     [必須]   [ 9999.99999999 ]
           標高をメートルで指定します。
           ( 小数点以下分以下は省略可 )

       第5 ( オプション ) [省略可] [ abcdefghijkl ]
           出力項目を下記の半角小文字アルファベットが指定可能です。
           ( 無指定なら全指定と判断 )
            a : 日の出時刻
            b : 日の出方位角
            c : 日の入時刻
            d : 日の入方位角
            e : 日の南中時刻
            f : 日の南中高度
            g : 月の出時刻
            h : 月の出方位角
            i : 月の入時刻
            j : 月の入方位角
            k : 月の南中時刻
            l : 月の南中高度

使用例

オプション指定無し

指定の日付・緯度・経度・標高の全情報を出力します。 2011年9月15日の島根県庁(北緯35.47222222度、東経133.05055556度、標高は0メートルと仮定)の場合です。

1
2
3
>ruby sun_moon.rb 20110915 35.47222222 133.05055556 0
2011/09/15 [ 35.47222222N, 133.05055556E, 0.0m ] 05:49:46 85.35 18:16:11 274.41
12:03:16 57.73 19:22:20 73.47 08:13:32 284.28 01:29:21 65.17

オプションに日の出・入時刻のみ出力する例

指定の日付・緯度・経度・標高の全情報を出力します。 2011年9月15日の島根県庁(北緯35度28分20秒、東経133度03分02秒、標高は0メートルと仮定)の場合です。

1
2
>ruby sun_moon.rb 20110915 35:28:20 133:03:03 0 ac
2011/09/15 [ 35:28:20N, 133:03:03E, 0.0m ] 05:49:46 18:16:11

各種計算の丸め方法や、大気差の計算条件・方法などに多少の誤差はあります。 当方が任意の位置の任意の日付で確認してみたところ、以下のような誤差が発生します。

  • 日・月の出・入・南中時刻 プラスマイナス1秒未満
  • 日・月の出・入方位角 プラスマイナス0.0001度未満
  • 日の南中高度 プラスマイナス0.01度未満
  • 月の南中高度 プラスマイナス1度未満

色々検索して確認してみましたが、時刻を分単位、方位角・高度を100分の1単位で丸めれば、どれも結果は似たようなものになります。 地球に大気がある限り気温・気圧の変化が大気差に反映するので、正確に計算するのは難しいです。 計算する際に使用したロジックはある文献(当記事文末参照)によるものです。あらゆるサイト等で公開されている計算結果も大体このロジックを使用していると思います。 要するに、当方が作成したRubyスクリプトによる計算結果も同様に誤差の範囲内になると考えています。

※このRubyスクリプトは個人的に利用することが目的で作成しています。実行結果の保証はいたしません。個人の責任の元ご利用ください。 ※また、ベクター等にアップするつもりも(今のところは)ありません。 ※その他、再配布等についてはRubyスクリプト内ヘッダ部に記載のコメントをご確認ください。

参考にしたサイト・文献


ちなみに、今回のRubyスクリプトも Visual Basic か Visual C# に移植して Exe を作成できればと思っています。

以上。

Comments