Astropy SkyCoord Integration

The library provides direct access to astropy SkyCoord objects for all coordinate frames and celestial bodies. This is 84x faster than manual Python loops for coordinate conversion.

Satellite Position Frames

import rust_ephem
from datetime import datetime, timezone

# Create ephemeris
tle1 = "1 25544U 98067A   20344.91777778  .00002182  00000-0  46906-4 0  9991"
tle2 = "2 25544  51.6460  44.6055 0002398  79.4451  23.5248 15.49364984256518"

begin = datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc)
end = datetime(2024, 1, 1, 1, 0, 0, tzinfo=timezone.utc)

ephem = rust_ephem.TLEEphemeris(tle1, tle2, begin, end, step_size=60)

# Access satellite positions as SkyCoord objects
gcrs_skycoord = ephem.gcrs  # GCRS frame (celestial)
itrs_skycoord = ephem.itrs  # ITRS frame (Earth-fixed)
teme_skycoord = ephem.teme     # TEME frame (SGP4 output)

# Each SkyCoord includes position, velocity, and proper frame
print(f"GCRS position: {gcrs_skycoord[0].cartesian.xyz}")
print(f"GCRS velocity: {gcrs_skycoord[0].velocity.d_xyz}")
print(f"ITRS position: {itrs_skycoord[0].cartesian.xyz}")

Sun, Moon, and Earth Positions

All celestial body positions include the spacecraft/observatory location as obsgeoloc and obsgeovel in their GCRS frame:

# Get Sun position as seen from spacecraft
sun_skycoord = ephem.sun
print(f"Sun position: {sun_skycoord[0].cartesian.xyz}")
print(f"Observer location: {sun_skycoord.frame.obsgeoloc[0]}")

# Get Moon position as seen from spacecraft
moon_skycoord = ephem.moon
print(f"Moon position: {moon_skycoord[0].cartesian.xyz}")

# Get Earth position relative to spacecraft
earth_skycoord = ephem.earth
print(f"Earth position: {earth_skycoord[0].cartesian.xyz}")
# Note: Earth position is the negative of spacecraft GCRS position

Ground Observatory Example

# Create ground observatory ephemeris
obs = rust_ephem.GroundEphemeris(
    latitude=19.8207,    # Mauna Kea
    longitude=-155.468,
    height=4205.0,
    begin=begin,
    end=end,
    step_size=60
)

# Access observatory and celestial positions
obs_gcrs = obs.gcrs      # Observatory in GCRS frame
obs_itrs = obs.itrs      # Observatory in ITRS frame
sun_from_obs = obs.sun   # Sun as seen from observatory
moon_from_obs = obs.moon # Moon as seen from observatory

# Calculate Sun altitude/azimuth
sun_altaz = sun_from_obs.transform_to(
    astropy.coordinates.AltAz(
        obstime=sun_from_obs.obstime,
        location=astropy.coordinates.EarthLocation.from_geocentric(
            *obs_itrs[0].cartesian.xyz
        )
    )
)
print(f"Sun altitude: {sun_altaz[0].alt}")
print(f"Sun azimuth: {sun_altaz[0].az}")

SPICE Ephemeris Example

# Create SPICE ephemeris
spice_ephem = rust_ephem.SPICEEphemeris(
    spk_path="spacecraft.bsp",
    naif_id=-999,
    begin=begin,
    end=end,
    step_size=60
)

# Access all frames as SkyCoord
gcrs = spice_ephem.gcrs
itrs = spice_ephem.itrs
sun = spice_ephem.sun
moon = spice_ephem.moon
earth = spice_ephem.earth

The SkyCoord objects include:

  • Full position and velocity information

  • Proper coordinate frame metadata

  • Observer location (obsgeoloc) and velocity (obsgeovel) for celestial bodies

  • Compatible with astropy’s transformation framework