Within Skyfield, if I have a vector (x, y, z) from the center of the earth, how can I back-convert it to a point on the "Celestial Sphere" (i.e. Right Ascension and Declination)?
For example purposes, suppose I have a few points in the orbit of a telescope around the earth, and I want to calculate the exact RA and Dec of the direction normal to the orbit - for whatever reason.
Effects like aberration and gravitation can be neglected here - I'm just looking to transform a direction in ICRF to RA and Dec.
In pseudocode:
from skyfield.api import load
import numpy as np
eph = load('de421.bsp')
ts = load.timescale()
now = ts.now()
vec = np.array([3141, 2718, 5820], dtype=float)
nvec = vec / np.sqrt((vec**2).sum()) # normalize for the heck of it
earth = eph['earth']
evec = earth.at(now).vector(vec) # pseudocode
print "It's pointing toward: ", evec.radec() # pseudocode
Happily, converting a direction vector in the ICRF to a right ascension and declination is completely independent of the position of the Earth or anything else — it is a question that only involves how some x,y,z coordinates would be expressed as polar coordinates, which is to say that it is a quick problem of geometry.
Using Skyfield:
Which outputs:
This even avoids having to import NumPy manually, because the
ICRF
class auto-detects if it has been passed a Python list and automatically converts it into a NumPy array for you.