Положение наблюдателя (широта/долгота)

Я играю с pyephem и jplephem, и я не могу понять, как отслеживать путь наблюдателя (или заданную широту/долготу/дату) во времени с этим пакетом. Что я хотел бы сделать, так это записать положение (x, y, x) во времени предоставленной широты/долготы/даты на Земле по отношению к Солнцу. Представьте себе путь, созданный трассером на поверхности Земли w.r.t. солнце.

Есть ли способ легко получить положение точки на поверхности Земли по отношению к барицентру Земли в данный момент времени?

Заранее спасибо.


person Cooper    schedule 04.10.2017    source источник
comment
Вы можете получить положение Земли и положение Солнца от JPLEphem. Вы также можете получить подробные сведения о вращении, прецессии и нутации Земли. Теперь найдите пересечение предпочитаемого вами эллипсоида (или геоида) с вектором Земля-Солнце в данный момент времени.   -  person Mad Physicist    schedule 04.10.2017
comment
При этом этот вопрос слишком широк для SO. Если у вас есть конкретный вопрос по кодированию из одной из ваших попыток, я был бы рад помочь.   -  person Mad Physicist    schedule 04.10.2017


Ответы (1)


Библиотека PyEphem построена поверх астрономической библиотеки под названием libastro, которая, увы, не предоставляет доступа к лежащим в ее основе векторам. А jplephem ничего не знает о положении планет в Солнечной системе.

Но астрономическая библиотека Skyfield, для которой был написан jplephem, делает и то, и другое. Вот как вы могли бы узнать положение x, y, z местоположения Земли относительно Солнца:

from skyfield.api import load, Topos

# Let's consider 72 hours starting at midnight UTC on January 2.

duration_hours = 72

ts = load.timescale()
t = ts.utc(2018, 1, 2, range(duration_hours))

# Load a planetary ephemeris.

planets = load('de421.bsp')
earth, sun = planets['earth'], planets['sun']

# Print where the US Naval Observatory was each hour relative to the Sun.

usno = Topos('38.9215 N', '77.0669 W', elevation_m=92.0)
result = sun.at(t).observe(earth + usno)
for time, position_au in zip(t, result.position.au.T):
    print(time.utc_jpl(), position_au)

Полученные строки выглядят так:

A.D. 2018-Jan-04 21:00:00.0000 UT [-0.24130305  0.87456403  0.37915831]
A.D. 2018-Jan-04 22:00:00.0000 UT [-0.2420075   0.87440863  0.37908723]
A.D. 2018-Jan-04 23:00:00.0000 UT [-0.24271409  0.87425296  0.37901595]

Вот домашняя страница Skyfield:

http://rhodesmill.org/skyfield/

person Brandon Rhodes    schedule 03.01.2018
comment
Ничего себе, это работает удивительно просто. Большое спасибо, Брэндон! - person Cooper; 08.01.2018