web-dev-qa-db-ja.com

日の出/日の入り時間を計算するにはどうすればよいですか?

私は日の出と日の入りの時間を追跡するのが好きです。過去数年間、私はお気に入りのプログラミング言語用の人気のあるライブラリで書かれた小さなプログラムでこれを行ってきました。この2か月間、私はいつもより定期的にこれらの時間を追跡してきましたが、分点の日の日の出時刻が前日と比較して8分急上昇したことに気づきました。私はこれが不可能であることを知っていて、 [〜#〜] noaa [〜#〜] と比較すると、私の立ち上がり時間と設定時間が数日間ずれていて、実際には約ずれているように見えました。一年のほとんどの間1分。

この時点で、私は自分で計算を実装したいと思います。この計算を行うために利用できるアルゴリズムまたは式は何ですか?

23
skiphoppy

日の出方程式 に関するウィキペディアの記事を読むことを検討してください。冒頭の段落は方程式を与えます:

どこ:

  • ωo時角 日の出(負の値をとる場合)または日の入り(正の値をとる場合)のいずれかでの度(°)
  • φは、地球上の観測者の緯度(度単位)です。
  • δは太陽です 赤緯 度単位
9
user57365

NOAAと一致させたい場合は、Jean Meeusの天文アルゴリズム(主に第15章)を参照する必要があります。そしてそれは複雑です!マーティンベケットは正しいです、あなたは日没を定義しなければなりません。通常、これは太陽の上肢の見かけの上昇またはセットであり、「標準」の高度を-5/6度(ゼロではない)にします。また、NOAAの精度で日の出や日の入りを直接計算することはできません。問題の日の見かけの赤経と赤緯の支配方程式を作成してから、時間の経過とともに見かけの赤経と赤緯を補間して、標準高度での正確な上昇時間と設定時間を見つける必要があります。

お役に立てれば。私は約1か月かけて消化しました[〜#〜] aa [〜#〜]同じことを見つけたとき、すべてのソーラーコードを書き直しましたが、それでも整理に1年以上かかりました私のコードが壊れたいくつかのコーナーケース。そのため、理解するのに少し時間がかかります。私はこのアルゴリズムの公開コードの例を知りませんし、現時点で共有するものもありませんが、可能であれば、いくつかの頭痛の種を解決するのを喜んでお手伝いします。

7
mattexx

日の出/日の入りを構成するものの定義はさまざまです。たとえば、 ephem "上昇と設定は、上肢が地平線に触れた瞬間(つまり、体の高度と半径の合計がゼロに等しいとき)として定義されます。" [PyEphemクイックリファレンス]

#!/usr/bin/env python
import datetime
import ephem # to install, run `pip install pyephem`

o = ephem.Observer()
o.lat, o.long, o.date = '34:3', '-118:15', datetime.datetime.utcnow()
Sun = ephem.Sun(o)
print "Los Angeles"
print "sunrise:", o.next_rising(Sun), "UTC"
print "sunset:",o.next_setting(Sun), "UTC"

出力

Los Angeles, CA
sunrise: 2010/3/30 13:42:43 UTC
sunset: 2010/3/30 02:11:50 UTC

オープンソースライブラリの場合は、新しいバグで新しいライブラリを作成する代わりに、修正することができます。

4
jfs

5分の範囲の精度を得るには、 'which' Sunset を考慮する必要があります。
太陽の底が地平線に触れる時間、または太陽の頂上が地平線の下を通過する時間を希望しますか?

太陽が地平線を横切るのに2分かかります。
1分レベルより下では、大気差も考慮する必要があります。

4
Martin Beckett

この本を見てください:
ピーター・デュフェット・スミスによる「あなたの計算機による実用的な天文学(ペーパーバック)」。
かなり古いですが、まだ印刷中です... リンク

3
Volker Voecking

Ruby均時差でこれを書いた。

include Math

# degrees to radians = PI/180
to_r = PI/180.0

#radians to degrees = 180/PI
to_d = 180.0/PI

puts "Day, Declination, EofT"

# test a celestial year worth of values.
for jday in 1..366

  et = -7.633 * sin(jday * (2 * PI)/365.24) + 9.65 * sin((jday - 78) * 180/92 * to_r)
  a_sin = sin(23.433 * to_r) * sin((2 * PI/366) * (jday - 81))
  declination = asin(a_sin) * to_d
  puts "#{jday}, #{declination}, #{et}"

end

次に、上記の式の場合:

# center disk and refraction factor have been considered.
cos_omega = sin(-0.83 * to_r) - tan(latitude * to_r) * tan(declination * to_r)
semi_diurnal_arc = acos(cos_omega)

これに特化したウェブサイト全体が http://www.analemma.com/ にあります。

  • これらの計算の鍵は、上記のpythonのような優れたライブラリです。
  • また、DateクラスとTimeクラスの使用法。私はルビーフォージでエフェムのようなものを探します。
2
Douglas

このNOAAページ の技術的定義と計算の詳細の見出しの下にいくつかの興味深いものを見ましたが、すでに読んでいると思います。

SO質問 " 時刻を指定した太陽の位置、緯度/経度 "への回答と上記が実際に必要なすべてである可能性があります。

補足として(質問に直接答えることはありません)、NOAAデータを取得して、計算する代わりにルックアップテーブルとして使用できない理由はありますか?最近のストレージは比較的安価になる傾向があります。

0
lc.

太陽の位置の計算に関する以前のエントリを確認することをお勧めします。 具体的には、私が指摘したSolposプログラムは、日の出/日の入りをサポートしています。

0
Toybuilder