swissEphemerisを使って占星術ソフトを作る際のステップ。
  • 1. swiss Ephemerisを組み込む
  • 2. 天文歴ファイルのパスを指定する
  • 3. ユリウス日を算出
  • 4. 天体の位置を算出
  • 5. ハウスを算出

1. swiss Ephemerisを組み込む

自分のプログラムにswiss Ephemerisの関数を使えるようにしないといけません。

いくつかの言語にはライブラリとして移植されているのでそのパッケージを組み込めば良いですが、コンパイルという概念の無いphpやrubyはc言語を改造して専用バイナリを作る必要があります。

2. 天文歴ファイルのパスを指定する

天文暦本体はバイナリファイルになっていて、swissEphemerisにこれのパスを渡してあげないとちゃんと読み込まれず、結果がへんてこな値(JPL Ephemeris:NASAが提供している天文歴)になってしまうので注意。ファイルのリード処理なので言語によってやり方が違います。

3. ユリウス日を算出

ユリウス日とはunixtimeみたいなもので、-4712年1月1日からの日数のこと。現在2024年だと2460300くらいになるはず。で、それを求めるのがswe_utc_time_zoneという関数。これの戻り値からユリウス日を求められます。

ちなみにAMATERUのソースコードには

    ユリウス日を求める場合はつねにこのクラスを利用しスイスエフェメリスのSweDateは
    使わない。
というのはユリウス日は天体や暦計算にはよく使用するので、 スイスエフェメリスに依存していると、ライセンスの問題等で不便がある。
プログラムを単純化できるという理由から、ユリウス日を求める公式は使用せず、 カレンダーのミリ秒表現から直接変換する方法を使っている。

という記載がありこの関数使ってません。

4. 天体の位置を算出

呼び方は2パターンあって、ユリウス日から求めるパターン(swe_calc_ut)とエフェメリス時刻(swe_calc)から求めるパターンがあります。(確か昔のバージョンはエフェメリス時刻しかなかった)

エフェメリス時刻は

    /* Ephemeris time (ET) = Universal time (UT) + swe_deltat(UT) */

となっており、swe_deltatという関数から求められるdeltaTをユリウス日に足し算したものとなりますが、面倒なので自分はswe_calc_utを使っちゃいます。

フラグについてはfunctionを参照。

5. ハウスの算出

これはswe_house関数で算出できます。ハウスシステムについてはfunctionを参照。

サンプル

C言語ですが、こんな感じになります。

    swe_set_ephe_path("./ephe");
    swe_utc_time_zone(year, month, day, hour, minute, second, 9.0, &utc_year, &utc_month, &utc_day, &utc_hour, &utc_minute, &utc_second);
    swe_utc_to_jd(utc_year, utc_month, utc_day, utc_hour, utc_minute, utc_second, 1, dret, serr);

    for (i = 0; i < 10; i++) {
        swe_calc_ut(dret[1], i, iflag, x, serr);
        if (x[3] < 0) {
            printf("planet,%d,%f,R\n", i, x[0]);
        } else {
            printf("planet,%d,%f\n", i, x[0]);
        }
    }
    swe_houses(dret[1], lat, lng, 'P', cusps, ascmc);

その他

進行図とかソーラーリターンのサポートはしていないので、自分で日付の計算をしましょう。セカンダリーなら(対象の日付 - 出生図の日付) / 365.2424の数他の天体を進める。プライマリーなら(対象の日付 - 出生図の日付) / 365.2424で出した日付で計算などなど。