将J2000的坐标转换为当前日期?

时间:2013-10-28 13:17:08

标签: astronomy

我正在使用VSOP2000数据文件并且能够在时间T计算太阳和月亮的笛卡尔坐标...问题是如何将该坐标(在J2000的时间范围内)转换为当前日期(时间T)?我只想知道算法。

2 个答案:

答案 0 :(得分:1)

您可能会考虑的一些事情。

  1. 您可以使用ASCOM Platform使用Transform类将坐标从JNow(本地topocentric)转换为J2000天体测量。

  2. 如果您不想依赖ASCOM,那么您可以从SourceForge获取它的源代码,您将看到它使用IAU's SOFA library(基础天文学标准)。有一个名为World Wide Astronomy的SOFA库的C#端口,但它有点儿麻烦。

  3. 您也可以查看AASharp,这是天文算法C版的一个端口

答案 1 :(得分: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)