Can a ground station see a given satellite right now? This is a question of geometry, line-of-sight, and (a little) atmosphere. This week you build the math and the code.
Visibility from the ground is the bread and butter of practical satellite tracking. "When can I see the ISS from my backyard?" "Will Starlink overfly me tonight?" "Does my ground station have line-of-sight to GOES-19?" All three reduce to the same geometric question: given a satellite ephemeris and an observer location, when is the satellite above the observer's horizon, and at what direction (azimuth) and how high (elevation) in the sky?
From any point on Earth's surface, a satellite's position relative to you can be described by two angles:
A satellite is "visible" when its elevation is greater than zero. For practical purposes (atmospheric absorption, trees, buildings), most ground stations consider visibility to start at ~10° elevation. Astronomy observations often require >30° elevation to escape atmospheric turbulence.
A satellite pass has three key moments:
For an ISS pass, the entire cycle takes 4–10 minutes depending on geometry. A "great" pass has a culmination >70°; an unusable pass culminates <10°.
from skyfield.api import load, wgs84
ts = load.timescale()
iss = EarthSatellite(line1, line2, "ISS", ts)
observer = wgs84.latlon(40.7128, -74.0060) # NYC
# Look for events in next 24 hours
t0 = ts.now()
t1 = ts.tt_jd(t0.tt + 1.0)
times, events = iss.find_events(observer, t0, t1, altitude_degrees=10.0)
# events: 0=rise, 1=culminate, 2=set
for t, ev in zip(times, events):
alt, az, _ = (iss - observer).at(t).altaz()
print(f"{t.utc_iso()} event={ev} alt={alt.degrees:.1f}° az={az.degrees:.1f}°")
Pass visibility assumes nothing blocks the line of sight. For a real ground station, you also need to account for:
topos.altaz(refraction=True).From the satellite's perspective, the inverse question is: which observers can see me right now? The answer is a circular "footprint" on Earth's surface. For a LEO satellite at 400 km altitude with a 5° minimum elevation, the footprint radius is ~2,100 km — a circle covering most of the eastern United States.
The lab takes a user-supplied lat/lon and finds the next visible ISS pass within the next 24 hours, outputting AOS time, TCA time + max elevation, and LOS time as JSON. This is the same logic that powers launchdetect.com/satellite-tracker/'s "next visible pass" feature.
Given a lat/lon, propagate the ISS and find the next overhead pass (max elevation > 30°). Output the pass start, max-elevation time + angle, and pass end as JSON.
Test yourself. Answer key on the certificate-track page (Gold-tier feature: progress tracking and auto-grading).