我正在使用 VSOP2000 数据文件,并且能够计算时间 T 的太阳和月亮的笛卡尔坐标......问题是如何将该坐标(在 J2000 的时间范围内)转换为当前日期(时间 T )? 我只是想知道算法。
问问题
5076 次
2 回答
1
您可能会考虑几件事。
您可以使用ASCOM 平台将坐标从 JNow(局部地心)转换为 J2000 天体测量,使用
Transform
该类。如果您不想依赖 ASCOM,那么您可以从 SourceForge 获取它的源代码,您会看到它使用了IAU 的 SOFA 库(基础天文学标准)。SOFA 库有一个名为 World Wide Astronomy 的 C# 端口,但它有点错误。
您还可以查看AASharp,这是天文算法的 C 版本的一个端口
于 2017-05-19T20:18:49.530 回答
0
J2000 只是 JD2451545.0 ( ref ),因此您可以将 J2000 转换为 JD 并按照算法从 JD 获取公历日期。这是一些基于天文算法第 7 章的 Python 代码。
from datetime import datetime, timedelta
class J2000:
def __init__(self, value):
self.value = value
def to_JD(self):
return self.value + 2451545.0
def to_datetime(self):
jd = self.to_JD()
# based on AA Ch7
z = int(jd + 0.5)
f = jd + 0.5 - z
alpha = int((z - 1867216.25) / 36524.25)
a = z + 1 + alpha - int(alpha / 4)
b = a + 1524
c = int((b - 122.1) / 365.25)
d = int(365.25 * c)
e = int((b - d) / 30.6001)
day = b - d - int(30.6001 * e) + f
d = int(day) # day
d_frac = day - d # fractional day
m = e - 1 if e < 14 else e - 13 # month
y = c - 4716 if m > 2 else c - 4715 # year
return datetime(y, m, d) + timedelta(days=d_frac)
例如:
j = J2000(2456647 - 2451545) # J2000 for 12/20/13 12:00:00
j.to_datetime()
=> datetime.datetime(2013, 12, 20, 12, 0)
于 2013-12-20T20:56:03.017 回答