ECEF в J2000 с использованием Skyfield

Скажем, у меня есть (ECEF) широта, долгота и расстояние до Земли для объекта в определенное время. Мне нужно получить координаты J2000. Что я делаю

import skyfield.api
planets = skyfield.api.load('de421.bsp')
earth = planets['earth']
ts = skyfield.api.load.timescale()
sat = earth + skyfield.api.Topos(latitude_degrees=latitude, longitude_degrees=longitude)
obs = earth.at(ts.utc(time)).observe(sat)
x, y, z = obs.km

Затем я бы нормализовал [x, y, z] и умножил его на расстояние до Земли. Есть два вопроса:

  1. Это правильно?
  2. Есть ли более быстрый способ без загрузки de421.bsp?

person matiasg    schedule 11.07.2017    source источник


Ответы (1)


Результат должен быть точным, но есть действительно более простой способ - ваша догадка, которую вы должны спросить, действительно здесь! Попробуйте прочитать раздел «Определение положения спутника» документации спутника Земли:

http://rhodesmill.org/skyfield/earth-satellites.html#generating-a-ssatellite-position

Я думаю, вы обнаружите, что для достижения того же результата можно сделать что-то вроде этого:

sat = skyfield.api.Topos(latitude_degrees=latitude, longitude_degrees=longitude)
x, y, z = sat.at(ts.utc(time)).position.km

Но я не уверен, как именно будет выглядеть ваш код, поскольку я нигде в вашем коде не вижу расстояния до Земли, о котором вы говорили, и ваш код ссылается на переменную sa, которая иначе не используется (возможно, вы имели в виду sat?) - но, надеюсь, документация поможет вам двигаться дальше!

person Brandon Rhodes    schedule 12.07.2017
comment
это прекрасно, большое спасибо! sa действительно sat (исправляем). И расстояние до земли будет использоваться в конце, умножая результат, чтобы получить правильное расстояние (во всяком случае, эта часть не была так важна, поэтому я ее пропустил). - person matiasg; 12.07.2017