LoginSignup
2
3

More than 3 years have passed since last update.

SunCalcを使ってJavaScriptで日の出・日の入りや月の出・月の入りを計算する

Last updated at Posted at 2020-12-08

はじめに

日の出・日の入りや月の出・月の入りなどの天文計算は複雑で、自分で実装するとなると面倒である。そこでSunCalcというライブラリを用いて、JavaScriptで計算してみることにした。また、計算結果を国立天文台ウェブサイトのものと比較した。

SunCalcはnpmを用いてインストールし、node.jsで実行した。用いたバージョンは以下の通りである。SunCalc自体は他のパッケージへの依存性はなくDateオブジェクトで入出力を行うが、ここでは日時計算ライブラリのMoment.jsを用いている。

package.json
    "dependencies": {
        "moment": "^2.29.1",
        "suncalc": "^1.8.0"
    }

コード例

以下に日の出・日の入りの時刻と方位、南中時刻と高度、月の出・月の入りの時刻と方位、月齢を求めるコード例を示す。

  • SunCalc自体はDateオブジェクトで入出力を行うが、日時計算のためMoment.jsを用いてラップしている。
  • SunCalcでは方位角は南から西回りで表現されるが、北から東回りで表現するために180°を加えている。
  • 135°E以西で00JSTのdateをSunCalc.getTimesに渡すと前日の日の出・南中・日の入りが返ってくることがあるので、12JSTのdateを渡している。
  • 月齢(phase)は日数では無く、0から1までの浮動小数点数で返される。もし日数に直す場合は、月の満ち欠け周期(29.3-29.8日で可変)を用いて計算する必要がある
  • 月齢(phase)の計算は、正午月齢と比較するために12JSTの値を出力している。
sun.js
import moment from "moment";
import SunCalc from "suncalc";

const RADTODEG = 180 / Math.PI;

function calcSun(datem, longitude, latitude) {
    const { sunrise, sunset, solarNoon } = SunCalc.getTimes(
        datem
            .clone()
            .hour(12)
            .toDate(),
        latitude,
        longitude
    );
    let sunriseAzimuth, sunsetAzimuth, noonElevation;
    if (sunrise) {
        const { azimuth } = SunCalc.getPosition(sunrise, latitude, longitude);
        sunriseAzimuth = azimuth * RADTODEG + 180;
    } else {
        sunriseAzimuth = null;
    }
    if (sunset) {
        const { azimuth } = SunCalc.getPosition(sunset, latitude, longitude);
        sunsetAzimuth = azimuth * RADTODEG + 180;
    } else {
        sunsetAzimuth = null;
    }
    if (solarNoon) {
        const { altitude } = SunCalc.getPosition(
            solarNoon,
            latitude,
            longitude
        );
        noonElevation = altitude * RADTODEG;
    } else {
        noonElevation = null;
    }
    return {
        sunrise: sunrise ? moment(sunrise) : null,
        sunriseAzimuth,
        noon: solarNoon ? moment(solarNoon) : null,
        noonElevation,
        sunset: sunset ? moment(sunset) : null,
        sunsetAzimuth
    };
}

function calcMoon(datem, longitude, latitude) {
    const date = datem.toDate();
    const times = SunCalc.getMoonTimes(date, latitude, longitude);
    const date12 = datem
        .clone()
        .hour(12)
        .toDate();
    const { phase } = SunCalc.getMoonIllumination(date12);
    let moonriseAzimuth, moonsetAzimuth;
    if (times.rise) {
        const { azimuth } = SunCalc.getMoonPosition(
            times.rise,
            latitude,
            longitude
        );
        moonriseAzimuth = azimuth * RADTODEG + 180;
    } else {
        moonriseAzimuth = null;
    }
    if (times.set) {
        const { azimuth } = SunCalc.getMoonPosition(
            times.set,
            latitude,
            longitude
        );
        moonsetAzimuth = azimuth * RADTODEG + 180;
    } else {
        moonsetAzimuth = null;
    }
    return {
        moonrise: times.rise ? moment(times.rise) : null,
        moonset: times.set ? moment(times.set) : null,
        moonriseAzimuth,
        moonsetAzimuth,
        phase
    };
}

比較結果

2020年12月の東京(35.6581N, 139.7414E)について、国立天文台ウェブサイトのこよみの計算SunCalcの計算結果を比較した。

日の出・日の入り・南中時刻については1分程度の差があった。方位や高度については0.1°程度の差があった。

月の出・月の入りについては最大8分程度の差があった。方位については1°程度の差があった。月齢については直接比較できないが、30倍すると概ね一致することは確認できる。

太陽

国立天文台

年月日 方位[°] 南中 高度[°] 入り 方位[°]
2020/12/01 6:32 116.5 11:30:04 32.5 16:28 243.4
2020/12/02 6:33 116.7 11:30:27 32.4 16:28 243.2
2020/12/03 6:34 116.9 11:30:50 32.2 16:28 243.0
2020/12/04 6:35 117.1 11:31:14 32.1 16:28 242.8
2020/12/05 6:36 117.3 11:31:39 32.0 16:28 242.7
2020/12/06 6:36 117.4 11:32:04 31.8 16:28 242.5
2020/12/07 6:37 117.6 11:32:30 31.7 16:28 242.4
2020/12/08 6:38 117.7 11:32:56 31.6 16:28 242.2
2020/12/09 6:39 117.8 11:33:23 31.5 16:28 242.1
2020/12/10 6:40 117.9 11:33:50 31.4 16:28 242.0
2020/12/11 6:40 118.1 11:34:17 31.3 16:28 241.9
2020/12/12 6:41 118.2 11:34:45 31.3 16:28 241.8
2020/12/13 6:42 118.2 11:35:14 31.2 16:29 241.7
2020/12/14 6:43 118.3 11:35:42 31.1 16:29 241.6
2020/12/15 6:43 118.4 11:36:11 31.1 16:29 241.6
2020/12/16 6:44 118.5 11:36:40 31.0 16:29 241.5
2020/12/17 6:44 118.5 11:37:10 31.0 16:30 241.5
2020/12/18 6:45 118.5 11:37:39 31.0 16:30 241.4
2020/12/19 6:46 118.6 11:38:09 31.0 16:31 241.4
2020/12/20 6:46 118.6 11:38:39 30.9 16:31 241.4
2020/12/21 6:47 118.6 11:39:09 30.9 16:32 241.4
2020/12/22 6:47 118.6 11:39:38 30.9 16:32 241.4
2020/12/23 6:48 118.6 11:40:08 30.9 16:33 241.4
2020/12/24 6:48 118.6 11:40:38 31.0 16:33 241.4
2020/12/25 6:49 118.6 11:41:08 31.0 16:34 241.5
2020/12/26 6:49 118.5 11:41:38 31.0 16:34 241.5
2020/12/27 6:49 118.5 11:42:07 31.1 16:35 241.6
2020/12/28 6:50 118.4 11:42:36 31.1 16:36 241.6
2020/12/29 6:50 118.3 11:43:05 31.2 16:36 241.7
2020/12/30 6:50 118.2 11:43:34 31.2 16:37 241.8
2020/12/31 6:50 118.2 11:44:03 31.3 16:38 241.9

SunCalc

年月日 方位[°] 南中 高度[°] 入り 方位[°]
2020/12/01 6:33 116.7 11:31:32 32.5 16:29 243.6
2020/12/02 6:34 116.9 11:31:55 32.4 16:29 243.4
2020/12/03 6:35 117.1 11:32:18 32.2 16:29 243.2
2020/12/04 6:36 117.2 11:32:42 32.1 16:29 243.0
2020/12/05 6:37 117.4 11:33:06 32.0 16:29 242.9
2020/12/06 6:38 117.6 11:33:30 31.9 16:29 242.7
2020/12/07 6:38 117.7 11:33:55 31.7 16:29 242.6
2020/12/08 6:39 117.8 11:34:21 31.6 16:29 242.4
2020/12/09 6:40 118.0 11:34:47 31.5 16:29 242.3
2020/12/10 6:41 118.1 11:35:13 31.4 16:29 242.2
2020/12/11 6:41 118.2 11:35:40 31.3 16:29 242.1
2020/12/12 6:42 118.3 11:36:07 31.3 16:29 241.9
2020/12/13 6:43 118.4 11:36:35 31.2 16:29 241.9
2020/12/14 6:44 118.5 11:37:02 31.1 16:30 241.8
2020/12/15 6:44 118.5 11:37:30 31.1 16:30 241.7
2020/12/16 6:45 118.6 11:37:58 31.0 16:30 241.6
2020/12/17 6:45 118.7 11:38:27 31.0 16:30 241.6
2020/12/18 6:46 118.7 11:38:55 31.0 16:31 241.5
2020/12/19 6:47 118.7 11:39:24 30.9 16:31 241.5
2020/12/20 6:47 118.8 11:39:53 30.9 16:32 241.5
2020/12/21 6:48 118.8 11:40:21 30.9 16:32 241.5
2020/12/22 6:48 118.8 11:40:50 30.9 16:33 241.5
2020/12/23 6:49 118.8 11:41:19 30.9 16:33 241.5
2020/12/24 6:49 118.7 11:41:48 30.9 16:34 241.5
2020/12/25 6:49 118.7 11:42:17 30.9 16:34 241.5
2020/12/26 6:50 118.7 11:42:46 31.0 16:35 241.6
2020/12/27 6:50 118.6 11:43:14 31.0 16:35 241.6
2020/12/28 6:50 118.6 11:43:43 31.1 16:36 241.7
2020/12/29 6:51 118.5 11:44:11 31.1 16:37 241.7
2020/12/30 6:51 118.4 11:44:40 31.2 16:37 241.8
2020/12/31 6:51 118.3 11:45:08 31.2 16:38 241.9

国立天文台

年月日 方位[°] 入り 方位[°] 正午月齢[日]
2020/12/01 17:06 61.4 7:01 297.4 15.9
2020/12/02 17:52 59.5 7:59 299.9 16.9
2020/12/03 18:44 59.2 8:54 300.9 17.9
2020/12/04 19:42 60.7 9:45 300.1 18.9
2020/12/05 20:44 63.9 10:31 297.6 19.9
2020/12/06 21:48 68.7 11:12 293.5 20.9
2020/12/07 22:54 74.8 11:48 288.0 21.9
2020/12/08 --:-- ----- 12:22 281.6 22.9
2020/12/09 0:01 81.7 12:53 274.4 23.9
2020/12/10 1:08 89.3 13:25 266.9 24.9
2020/12/11 2:17 97.1 13:57 259.3 25.9
2020/12/12 3:29 104.7 14:33 252.2 26.9
2020/12/13 4:42 111.5 15:14 246.0 27.9
2020/12/14 5:56 116.9 16:01 241.4 28.9
2020/12/15 7:07 120.4 16:56 238.9 0.4
2020/12/16 8:13 121.5 17:57 238.7 1.4
2020/12/17 9:09 120.3 19:02 240.7 2.4
2020/12/18 9:57 117.2 20:08 244.6 3.4
2020/12/19 10:36 112.6 21:12 249.7 4.4
2020/12/20 11:10 107.2 22:13 255.5 5.4
2020/12/21 11:39 101.2 23:11 261.8 6.4
2020/12/22 12:06 94.9 --:-- ----- 7.4
2020/12/23 12:31 88.7 0:08 268.2 8.4
2020/12/24 12:57 82.5 1:03 274.5 9.4
2020/12/25 13:23 76.6 1:59 280.7 10.4
2020/12/26 13:52 71.1 2:55 286.5 11.4
2020/12/27 14:25 66.3 3:53 291.7 12.4
2020/12/28 15:03 62.5 4:51 296.0 13.4
2020/12/29 15:47 60.0 5:50 299.1 14.4
2020/12/30 16:37 59.1 6:47 300.7 15.4
2020/12/31 17:34 60.0 7:41 300.6 16.4

SunCalc

年月日 方位[°] 入り 方位[°] 正午phase
2020/12/01 16:58 60.6 7:02 298.1 0.52
2020/12/02 17:45 58.6 8:01 300.9 0.55
2020/12/03 18:38 58.2 8:58 302.0 0.58
2020/12/04 19:38 59.8 9:50 301.1 0.62
2020/12/05 20:42 63.4 10:37 298.3 0.65
2020/12/06 21:50 68.5 11:18 293.8 0.69
2020/12/07 22:57 74.9 11:56 288.1 0.72
2020/12/08 --:-- ----- 12:29 281.1 0.76
2020/12/09 0:06 82.3 13:02 273.8 0.79
2020/12/10 1:16 90.0 13:33 266.1 0.83
2020/12/11 2:26 97.9 14:06 258.7 0.87
2020/12/12 3:36 105.2 14:43 251.9 0.91
2020/12/13 4:48 111.5 15:24 246.2 0.95
2020/12/14 5:58 116.3 16:11 242.1 0.98
2020/12/15 7:07 119.4 17:06 240.0 0.02
2020/12/16 8:09 120.3 18:05 239.9 0.06
2020/12/17 9:04 119.1 19:08 241.9 0.09
2020/12/18 9:52 116.2 20:11 245.5 0.13
2020/12/19 10:32 111.9 21:14 250.3 0.16
2020/12/20 11:05 106.6 22:14 255.9 0.19
2020/12/21 11:36 100.9 23:13 262.0 0.22
2020/12/22 12:02 94.6 --:-- ----- 0.25
2020/12/23 12:29 88.5 0:09 268.3 0.28
2020/12/24 12:53 82.3 1:05 274.8 0.31
2020/12/25 13:19 76.3 2:01 281.0 0.34
2020/12/26 13:48 70.8 2:57 286.9 0.37
2020/12/27 14:19 65.8 3:54 292.3 0.40
2020/12/28 14:55 61.7 4:53 296.8 0.43
2020/12/29 15:38 59.1 5:51 300.1 0.47
2020/12/30 16:28 58.0 6:49 301.9 0.49
2020/12/31 17:25 58.8 7:42 301.8 0.53
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3