Satellite Overpasses and Visibility
When is a satellite visible from your location? You need line of sight — the satellite must be above your horizon and not blocked by Earth itself. This model derives the geometry of satellite visibility, calculates elevation and azimuth angles, and predicts overpass times for any ground station.
Prerequisites: 3d geometry, line of sight, elevation angle, azimuth, vector geometry
1. The Question
When will the International Space Station pass over Denver?
A satellite orbits Earth in a known path. A ground observer at a specific latitude and longitude wants to know:
- When is the satellite above my horizon?
- Where in the sky should I look (elevation angle, compass direction)?
- How long will it be visible?
The mathematical question: Given the satellite’s position and the observer’s position, calculate the line-of-sight geometry.
2. The Conceptual Model
Line of Sight
The satellite is visible if:
- Above the local horizon: Elevation angle > 0°
- Not blocked by Earth: The straight line from observer to satellite doesn’t intersect Earth’s surface
- Sufficient elevation: Practical visibility often requires elevation > 10° (atmospheric effects, obstructions)
Horizon Range
Even if a satellite is “overhead” in terms of ground track, it may be beyond the horizon if it’s too far away laterally.
Maximum range to horizon from altitude $h$:
\[d_{\text{max}} = \sqrt{2R_{\oplus}h + h^2}\]For LEO satellites (~400 km), this is roughly 2300 km surface distance.
Elevation and Azimuth
From the observer’s perspective:
- Elevation angle ($E$): Angle above the horizon (0° = horizon, 90° = zenith)
- Azimuth ($Az$): Compass bearing (0° = north, 90° = east, 180° = south, 270° = west)
These are the look angles — where to point your antenna or telescope.
3. Building the Mathematical Model
Step 1: Position Vectors
Observer position (lat, lon, altitude ≈ 0):
\[\mathbf{r}_{\text{obs}} = R_{\oplus} \begin{pmatrix} \cos(\text{lat}) \cos(\text{lon}) \\ \cos(\text{lat}) \sin(\text{lon}) \\ \sin(\text{lat}) \end{pmatrix}\]Satellite position at time $t$:
\[\mathbf{r}_{\text{sat}}(t) = \begin{pmatrix} x_{\text{sat}}(t) \\ y_{\text{sat}}(t) \\ z_{\text{sat}}(t) \end{pmatrix}\](Calculated from orbital parameters using ground track methods from Model 14)
Range vector (from observer to satellite):
\[\mathbf{\rho} = \mathbf{r}_{\text{sat}} - \mathbf{r}_{\text{obs}}\]Step 2: Local Horizon Frame
Define a coordinate system at the observer’s location:
- East ($\mathbf{\hat{e}}$): Points east (tangent to latitude circle)
- North ($\mathbf{\hat{n}}$): Points north (tangent to meridian)
- Up ($\mathbf{\hat{u}}$): Points away from Earth’s center (local vertical)
Up direction (unit radial vector):
\[\mathbf{\hat{u}} = \frac{\mathbf{r}_{\text{obs}}}{|\mathbf{r}_{\text{obs}}|} = \begin{pmatrix} \cos(\text{lat}) \cos(\text{lon}) \\ \cos(\text{lat}) \sin(\text{lon}) \\ \sin(\text{lat}) \end{pmatrix}\]East direction:
\[\mathbf{\hat{e}} = \begin{pmatrix} -\sin(\text{lon}) \\ \cos(\text{lon}) \\ 0 \end{pmatrix}\]North direction:
\[\mathbf{\hat{n}} = \begin{pmatrix} -\sin(\text{lat}) \cos(\text{lon}) \\ -\sin(\text{lat}) \sin(\text{lon}) \\ \cos(\text{lat}) \end{pmatrix}\]These form an orthonormal basis (all unit length, all perpendicular).
Step 3: Transform Range Vector to Local Frame
Project the range vector $\mathbf{\rho}$ onto the local East-North-Up frame:
\(\rho_e = \mathbf{\rho} \cdot \mathbf{\hat{e}}\) \(\rho_n = \mathbf{\rho} \cdot \mathbf{\hat{n}}\) \(\rho_u = \mathbf{\rho} \cdot \mathbf{\hat{u}}\)
These are the topocentric coordinates — position relative to the observer’s local horizon.
Step 4: Calculate Elevation Angle
The elevation angle is the angle above the horizontal plane:
\[E = \arcsin\left(\frac{\rho_u}{|\mathbf{\rho}|}\right)\]| Where $ | \mathbf{\rho} | = \sqrt{\rho_e^2 + \rho_n^2 + \rho_u^2}$ is the slant range (direct distance from observer to satellite). |
Alternative form:
\[E = \arctan\left(\frac{\rho_u}{\sqrt{\rho_e^2 + \rho_n^2}}\right)\]Visibility condition: $E > 0°$ (satellite is above horizon)
Step 5: Calculate Azimuth
The azimuth is the compass bearing in the horizontal plane:
\[Az = \arctan2(\rho_e, \rho_n)\](Note: atan2(y, x) gives the angle from the positive x-axis; here we use atan2(east, north) to measure clockwise from north)
Converting to compass degrees:
- 0° = North
- 90° = East
- 180° = South
- 270° = West
If the result from atan2 is negative, add 360°.
4. Worked Example by Hand
Problem: An observer is at Denver (39.7°N, 105.0°W). A satellite is at position:
\[\mathbf{r}_{\text{sat}} = \begin{pmatrix} -2000 \\ 3000 \\ 5500 \end{pmatrix} \text{ km}\](a) Calculate the range vector $\mathbf{\rho}$.
(b) Transform to local East-North-Up coordinates.
(c) Calculate elevation angle and azimuth.
(d) Is the satellite visible?
Solution
(a) Observer and range vector
Denver position ($R_{\oplus} = 6371$ km):
\[\mathbf{r}_{\text{obs}} = 6371 \begin{pmatrix} \cos(39.7°) \cos(-105.0°) \\ \cos(39.7°) \sin(-105.0°) \\ \sin(39.7°) \end{pmatrix}\] \[= 6371 \begin{pmatrix} 0.766 \times (-0.259) \\ 0.766 \times (-0.966) \\ 0.640 \end{pmatrix} = \begin{pmatrix} -1264 \\ -4718 \\ 4077 \end{pmatrix} \text{ km}\]Range vector:
\[\mathbf{\rho} = \mathbf{r}_{\text{sat}} - \mathbf{r}_{\text{obs}} = \begin{pmatrix} -2000 - (-1264) \\ 3000 - (-4718) \\ 5500 - 4077 \end{pmatrix} = \begin{pmatrix} -736 \\ 7718 \\ 1423 \end{pmatrix} \text{ km}\](b) Local frame basis vectors
Up:
\[\mathbf{\hat{u}} = \begin{pmatrix} \cos(39.7°) \cos(-105.0°) \\ \cos(39.7°) \sin(-105.0°) \\ \sin(39.7°) \end{pmatrix} = \begin{pmatrix} -0.198 \\ -0.740 \\ 0.640 \end{pmatrix}\]East:
\[\mathbf{\hat{e}} = \begin{pmatrix} -\sin(-105.0°) \\ \cos(-105.0°) \\ 0 \end{pmatrix} = \begin{pmatrix} 0.966 \\ -0.259 \\ 0 \end{pmatrix}\]North:
\[\mathbf{\hat{n}} = \begin{pmatrix} -\sin(39.7°) \cos(-105.0°) \\ -\sin(39.7°) \sin(-105.0°) \\ \cos(39.7°) \end{pmatrix} = \begin{pmatrix} 0.166 \\ 0.618 \\ 0.766 \end{pmatrix}\]Project range onto local frame:
\[\rho_e = \mathbf{\rho} \cdot \mathbf{\hat{e}} = (-736)(0.966) + (7718)(-0.259) + (1423)(0) = -711 - 2000 = -2711 \text{ km}\] \[\rho_n = \mathbf{\rho} \cdot \mathbf{\hat{n}} = (-736)(0.166) + (7718)(0.618) + (1423)(0.766) = -122 + 4770 + 1090 = 5738 \text{ km}\] \[\rho_u = \mathbf{\rho} \cdot \mathbf{\hat{u}} = (-736)(-0.198) + (7718)(-0.740) + (1423)(0.640) = 146 - 5711 + 911 = -4654 \text{ km}\](c) Elevation and azimuth
Slant range:
\[|\mathbf{\rho}| = \sqrt{(-2711)^2 + (5738)^2 + (-4654)^2} = \sqrt{7.35 \times 10^6 + 3.29 \times 10^7 + 2.17 \times 10^7} = \sqrt{6.36 \times 10^7} = 7975 \text{ km}\]Elevation angle:
\[E = \arcsin\left(\frac{-4654}{7975}\right) = \arcsin(-0.584) = -35.7°\]Azimuth:
\[Az = \arctan2(-2711, 5738) = \arctan2(-2711, 5738) \times \frac{180}{\pi} \approx -25.3°\]Convert to compass bearing: $-25.3° + 360° = 334.7°$ (NNW)
(d) Visibility
Elevation angle is −35.7° → Satellite is below the horizon (not visible).
The negative elevation means the satellite is on the opposite side of Earth from Denver.
5. Computational Implementation
Below is an interactive satellite visibility calculator.
Current Satellite Position:
Latitude:
Longitude:
Slant Range: km
Elevation Angle: °
Azimuth: ° ()
Visibility:
Try this:
- Animate Time: Watch the satellite rise and set
- Find Next Pass: Jump to the next time the satellite is above 10° elevation
- Move the observer’s location: Different latitudes see different passes
- Notice: Peaks in the elevation plot correspond to satellite overpasses
- The chart shows when the satellite is visible (elevation > 0°) and when it’s usefully above the horizon (>10°)
Key insight: Visibility is periodic — the satellite passes overhead multiple times per day at predictable intervals determined by the orbital period and Earth’s rotation.
6. Polar Overpass Diagram
Below is a polar plot showing satellite passes from the observer’s perspective — a local sky map with zenith at center and horizon at the perimeter.
Reading the plot: Center = zenith (directly overhead), outer ring = horizon. Each colored arc is one satellite pass. Wider bands show sensor swath coverage.
Try this:
- Change latitude: Higher latitudes see more polar orbit passes (inclination 98°)
- Adjust swath width: Set to 185 km (Landsat), 290 km (Sentinel-2), or 500 km (MODIS)
- Time window: 24 hours shows daily coverage pattern; 48 hours reveals repeat geometry
- Toggle swath: Turn off swath display to see just the satellite ground tracks
- Notice how passes at different azimuths provide multi-directional coverage
Key insight: The polar plot reveals the viewing geometry from the observer’s perspective. Multiple passes from different directions provide stereoscopic potential and reduce shadow/illumination bias in imagery.
7. Interpretation
Reading the Polar Plot
The polar overpass diagram is a local sky map from the observer’s viewpoint:
- Center: Zenith (directly overhead, 90° elevation)
- Outer ring: Horizon (0° elevation)
- Radial distance: Zenith angle (90° - elevation)
- Angular position: Azimuth (compass bearing)
Each colored arc represents one satellite pass. The arc shows the satellite’s path across the sky as seen from the ground station.
Swath coverage: The dashed lines flanking each pass show the sensor’s ground coverage footprint. Points on the ground within this swath are imaged during the pass.
Applications:
- Mission planning: Which passes provide coverage of a target area?
- Stereo imaging: Passes from different azimuths enable 3D reconstruction
- Illumination analysis: Morning passes (eastern azimuths) vs. evening passes (western azimuths) have different sun angles
- Antenna scheduling: Determine optimal times for data downlink based on elevation angle
Swath Width and Coverage
The sensor swath is the width of the strip of Earth’s surface imaged in a single pass.
Wide swath (e.g., MODIS 2330 km):
- Fewer passes needed for global coverage
- Lower spatial resolution (250 m–1 km)
- Daily global coverage possible
Narrow swath (e.g., Landsat 185 km):
- Many passes needed for global coverage
- Higher spatial resolution (15–30 m)
- 16-day revisit cycle for exact repeat
Swath geometry depends on:
- Sensor field of view (FOV): Angular width of detector array
- Pointing capability: Can the sensor look sideways (off-nadir)?
- Altitude: Higher satellites see wider swaths but with coarser resolution
Look angle from swath width:
For a nadir-pointing sensor at altitude $h$ with ground swath width $W$:
\[\text{Half-swath angle} \approx \arctan\left(\frac{W/2}{R_{\oplus} + h}\right)\]This is the angular extent from the satellite’s perspective.
Coverage Gaps and Overlaps
From the polar plot, you can identify:
- Gaps: Regions of sky with no passes (equatorial zones for polar orbits from high latitudes)
- Overlap: Multiple passes covering the same area from different angles
- Coverage uniformity: Are passes evenly distributed in azimuth?
Example: At 40°N with a sun-synchronous orbit (98° inclination):
- Passes cluster in north-south directions
- East-west coverage comes from orbital precession over days
- No truly equatorial passes (inclination limits)
Maximum Elevation Angle
The highest point in the sky the satellite reaches depends on:
- How close the ground track passes to the observer
- Satellite altitude (higher satellites appear lower in the sky from the same ground track distance)
Zenith pass ($E = 90°$): Satellite directly overhead — ground track passes through observer’s location.
Low pass ($E < 30°$): Satellite is near the horizon — ground track is far from observer.
Visibility Duration
For LEO satellites:
- Typical pass duration: 5–10 minutes
- Maximum elevation depends on orbital geometry
- Number of visible passes per day: varies with inclination
For geostationary satellites:
- Continuously visible from the same location (if above horizon)
- Elevation angle is constant
- Only visible from latitudes within ~±81° of equator
Antenna Tracking
Ground stations with directional antennas must track the satellite:
- Azimuth changes as satellite moves across the sky
- Elevation changes from rise to set
- Tracking systems use predicted ephemerides (orbital predictions) to point the antenna
Two-line element sets (TLEs): Standard format for distributing orbital parameters. Used to generate predictions.
7. What Could Go Wrong?
Forgetting to Check Both Conditions
A satellite can be:
- Above the horizon from your location but behind Earth (blocked by the planet)
- Close in slant range but below the horizon (on the other side of Earth)
Always check: elevation angle > 0° AND not blocked by Earth’s sphere.
Assuming Visibility = Ground Track Proximity
The satellite’s ground track is where it’s directly overhead. But you can see satellites whose ground track is hundreds of kilometers away — they just appear lower in the sky.
Horizon distance for 400 km altitude satellite: ~2300 km surface distance.
Neglecting Atmospheric Refraction
Near the horizon, Earth’s atmosphere bends light rays, making satellites appear slightly higher than their geometric position.
Refraction correction: ~0.5° at horizon, negligible above 10° elevation.
Mixing Up Azimuth Conventions
Mathematical convention: Angle from positive x-axis, counterclockwise.
Compass convention: Angle from north, clockwise.
Always use atan2(east, north) for compass azimuth, not atan2(north, east).
8. Extension: Access Time and Revisit Frequency
Access time: Total time per day a satellite is visible above a minimum elevation (e.g., 10°).
For a polar orbit at 800 km:
- Each pass: ~10 minutes above 10° elevation
- Passes per day: ~14
- Total access time: ~140 minutes/day (if all passes are visible)
Revisit frequency: How often a satellite can image the same ground location.
Factors:
- Orbital period
- Swath width (sensor coverage width)
- Off-nadir pointing capability (can the satellite look sideways?)
Example: Landsat 8 has a 16-day exact repeat cycle (same ground track every 16 days) but can image any location every ~8 days due to overlapping swaths.
9. Math Refresher: Dot Product for Projections
Projecting a Vector onto a Direction
Given vector $\mathbf{v}$ and unit vector $\mathbf{\hat{u}}$, the component of $\mathbf{v}$ in the direction of $\mathbf{\hat{u}}$ is:
\[v_{\parallel} = \mathbf{v} \cdot \mathbf{\hat{u}}\]Geometric meaning: The length of $\mathbf{v}$’s shadow when projected onto $\mathbf{\hat{u}}$.
Example: Range vector $\mathbf{\rho}$ projected onto “up” direction gives the vertical component (used to compute elevation angle).
Orthonormal Basis
Three unit vectors $\mathbf{\hat{e}}$, $\mathbf{\hat{n}}$, $\mathbf{\hat{u}}$ form an orthonormal basis if:
-
Each has length 1: $ \mathbf{\hat{e}} = \mathbf{\hat{n}} = \mathbf{\hat{u}} = 1$ - All are perpendicular: $\mathbf{\hat{e}} \cdot \mathbf{\hat{n}} = 0$, etc.
Any vector can be expressed as:
\[\mathbf{v} = (v \cdot \mathbf{\hat{e}})\mathbf{\hat{e}} + (v \cdot \mathbf{\hat{n}})\mathbf{\hat{n}} + (v \cdot \mathbf{\hat{u}})\mathbf{\hat{u}}\]This is what we do when converting the range vector to topocentric (East-North-Up) coordinates.
Summary
- Visibility requires satellite above local horizon: elevation angle $E > 0°$
-
Elevation angle: $E = \arcsin(\rho_u / \mathbf{\rho} )$ where $\rho_u$ is vertical component - Azimuth: $Az = \arctan2(\rho_e, \rho_n)$ compass bearing (0° = N, 90° = E)
- Local horizon frame: East-North-Up basis vectors at observer’s location
- Maximum slant range for LEO satellites: ~2000–2500 km
- Pass duration: typically 5–10 minutes for LEO
- Multiple passes per day, predictable from orbital parameters
- Geostationary satellites appear fixed in the sky
Phase II Complete: Models 13–15 provide the foundation for orbital mechanics and satellite tracking. Future extensions could cover:
- Sensor swath geometry and coverage calculations
- Off-nadir pointing and agile satellites
- Constellation design for continuous coverage
- Doppler shift and radio tracking
- Two-line element set interpretation