Как рассчитать долготу с помощью PyEphem - PullRequest
5 голосов
/ 04 мая 2011

пытался вычислить солнечную широту и долготу, используя PyEphem, но не соответствовал эфемериде
СОЛНЦЕ: 2011 МАЙ 04 Мы 04 14:46:08 13TA12 = приблизительно 43 градуса (согласно веб-сайту www.findyourfate.com)

a = Sun()
a.compute('2011-05-04')
>>> a.hlon
274:18:49.1
>>> a.hlat
0:00:00.1

Что может быть не так? Как рассчитать долготу планеты / солнца. Helio / геоцентрической.

Ответы [ 2 ]

15 голосов
/ 03 июня 2011

Интересный вопрос, заслуживающий подробного ответа.

Первая проблема.PyEphem берет свои даты в виде YYYY/mm/dd, а не YYYY-mm-dd.

>>> from ephem import *
>>> Date('2011-05-04')
2010/6/26 00:00:00
>>> Date('2011/05/04')
2011/5/4 00:00:00

(Такое поведение кажется крайне бесполезным. Я сообщил об этом Брэндону Крейгу Роудсу как об ошибке и началв PyEphem версии 3.7.5.1 это поведение было исправлено.)

Вторая проблема.В PyEphem hlon - это обычно гелиоцентрическая долгота тела (долгота в системе координат, ориентированной на солнце).Это не имеет смысла для солнца.Так, как особое недокументированное исключение , когда вы смотрите на hlon и hlat Солнца, вы получаете гелиоцентрическую долготу и широту Земли .

(Было бы неплохо, если бы это было задокументировано. Я тоже об этом сообщил , а PyEphem 3.7.5.1 теперь содержит документацию, которая следует моей рекомендации.)

То, что вы хотите вместо этого, я считаю, эклиптическая долгота Солнца.Вы можете найти эклиптические координаты тела, используя функцию Пифема Ecliptic:

>>> sun = Sun()
>>> sun.compute('2011/05/04')
>>> Ecliptic(sun).lon
43:02:58.9

Однако findyourfate.com сообщает "13TA12" (то есть 13 ° 12 ′ Тельца), что соответствует 43:12:00 в PyEphem).Что случилось с пропавшим 0:09?Я думаю, что это сводится к выбору эпохи (то есть, какую прецессию нужно учитывать).По умолчанию PyEphem использует стандартную астрономическую эпоху J2000.0 .Но findyourfate.com, похоже, использует эпоху :

>>> sun.compute('2011/05/04', '2011/05/04')
>>> Ecliptic(sun).lon
43:12:29.0

Надеюсь, все ясно: спросите, если нет.


Если вы хотите сгенерировать всю таблицу в Python, вы можете сделать это, как показано в коде ниже.Я не знаю простой способ вычисления лунного узла с помощью PyEphem, поэтому я не реализовал этот бит.(Я ожидаю, что вы можете сделать это с помощью итеративного поиска, но я не пробовал.)

from ephem import *
import datetime
import itertools
import math

zodiac = 'AR TA GE CN LE VI LI SC SG CP AQ PI'.split()

def format_zodiacal_longitude(longitude):
    "Format longitude in zodiacal form (like '00AR00') and return as a string."
    l = math.degrees(longitude.norm)
    degrees = int(l % 30)
    sign = zodiac[int(l / 30)]
    minutes = int(round((l % 1) * 60))
    return '{0:02}{1}{2:02}'.format(degrees, sign, minutes)

def format_angle_as_time(a):
    """Format angle as hours:minutes:seconds and return it as a string."""
    a = math.degrees(a) / 15.0
    hours = int(a)
    minutes = int((a % 1) * 60)
    seconds = int(((a * 60) % 1) * 60)
    return '{0:02}:{1:02}:{2:02}'.format(hours, minutes, seconds)

def print_ephemeris_for_date(date, bodies):
    date = Date(date)
    print datetime.datetime(*date.tuple()[:3]).strftime('%A')[:2],
    print '{0:02}'.format(date.tuple()[2]),
    greenwich = Observer()
    greenwich.date = date
    print format_angle_as_time(greenwich.sidereal_time()),
    for b in bodies:
        b.compute(date, date)
        print format_zodiacal_longitude(Ecliptic(b).long),
    print

def print_ephemeris_for_month(year, month, bodies):
    print
    print (datetime.date(year, month, 1).strftime('%B %Y').upper()
           .center(14 + len(bodies) * 7))
    print
    print 'DATE  SID.TIME',
    for b in bodies:
        print '{0: <6}'.format(b.name[:6].upper()),
    print
    for day in itertools.count(1):
        try:
            datetuple = (year, month, day)
            datetime.date(*datetuple)
            print_ephemeris_for_date(datetuple, bodies)
        except ValueError:
            break

def print_ephemeris_for_year(year):
    bodies = [Sun(), Moon(), Mercury(), Venus(), Mars(), Jupiter(), 
              Saturn(), Uranus(), Neptune(), Pluto()]
    for month in xrange(1, 13):
        print_ephemeris_for_month(year, month, bodies)
        print
1 голос
/ 24 ноября 2013

Есть дополнительный персонаж, который должен пойти, чтобы заставить это работать. Рядом с последней строкой в ​​последнем ответе:

Ecliptic (b). Long должно измениться на Ecliptic (b) .lon

По крайней мере, в версии 2.7 32-разрядная на моем компьютере с 64-разрядной ОС Windows 7.

Также было бы неплохо, если бы таблица была распечатана в градусах для Ecliptic Longitude. :)

...