10.1 Satellite Oceanography
Satellites revolutionized oceanography by providing global, repeated measurements. They observe sea surface temperature, height, color, salinity, and windsβessential for understanding ocean dynamics and climate.
Key Satellite Measurements
Sea Surface Temperature (SST)
Infrared + microwave radiometers. MODIS, VIIRS. Β±0.3Β°C accuracy. Weather, climate, fisheries.
Sea Surface Height (SSH)
Radar altimetry. Jason, Sentinel-6. Β±2 cm accuracy. Currents, eddies, sea level rise.
Ocean Color
Visible spectrometers. SeaWiFS, MODIS, OLCI. Chlorophyll, productivity, water quality.
Sea Surface Salinity (SSS)
Microwave radiometry. Aquarius, SMOS, SMAP. Β±0.2 PSU. Water cycle, circulation.
Altimetry Principles
\( SSH = h_{orbit} - R - \sum \text{corrections} \)
horbit: satellite altitude, R: radar range to surface
Corrections
Ionosphere, troposphere, tides, inverse barometer
Applications
Geostrophic currents, mesoscale eddies, El NiΓ±o monitoring
Major Satellite Missions
TOPEX/Poseidon β Jason β Sentinel-6
Altimetry. 1992-present. 10-day repeat. Sea level reference.
MODIS (Terra/Aqua)
SST, ocean color. 2000-present. Daily global.
Sentinel-3
ESA. SST, color, altimetry. Operational oceanography.
SWOT (2022)
Wide-swath altimetry. Submesoscale features. Revolutionary.
Python: SSH & Currents
#!/usr/bin/env python3
"""satellite_oceanography.py - SSH to geostrophic current"""
import numpy as np
import matplotlib.pyplot as plt
def geostrophic_velocity(ssh, dx, f=1e-4, g=9.81):
"""
Calculate geostrophic velocity from SSH gradient
u = -(g/f) * d(SSH)/dy
v = (g/f) * d(SSH)/dx
"""
dssh_dy = np.gradient(ssh, dx, axis=0)
dssh_dx = np.gradient(ssh, dx, axis=1)
u = -(g / f) * dssh_dy
v = (g / f) * dssh_dx
return u, v
# Create synthetic SSH field with an eddy
nx, ny = 50, 50
dx = 10e3 # 10 km
x = np.arange(nx) * dx
y = np.arange(ny) * dx
X, Y = np.meshgrid(x, y)
# Gaussian eddy (anticyclonic - positive SSH)
x0, y0 = nx*dx/2, ny*dx/2
R = 100e3
ssh = 0.2 * np.exp(-((X - x0)**2 + (Y - y0)**2) / R**2)
# Calculate currents
u, v = geostrophic_velocity(ssh, dx)
speed = np.sqrt(u**2 + v**2)
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# SSH
im1 = axes[0].contourf(X/1e3, Y/1e3, ssh*100, levels=20, cmap='RdBu_r')
plt.colorbar(im1, ax=axes[0], label='SSH (cm)')
axes[0].set_xlabel('x (km)'); axes[0].set_ylabel('y (km)')
axes[0].set_title('Sea Surface Height')
# Currents
skip = 3
axes[1].quiver(X[::skip, ::skip]/1e3, Y[::skip, ::skip]/1e3,
u[::skip, ::skip], v[::skip, ::skip])
im2 = axes[1].contourf(X/1e3, Y/1e3, speed, levels=10, cmap='viridis', alpha=0.5)
plt.colorbar(im2, ax=axes[1], label='Speed (m/s)')
axes[1].set_xlabel('x (km)')
axes[1].set_title('Geostrophic Currents')
plt.tight_layout()