The international open-access remote sensing landscape is anchored by two premier satellite constellations: the USGS/NASA Landsat Program (with continuous historical Earth observations dating back to Landsat 1 in 1972 through to operational Landsat 8 and 9) and the European Space Agency's (ESA) Copernicus Sentinel-2 constellation. Together, these missions deliver free, global multispectral imagery at spatial resolutions ranging from 10 to 60 meters. In this guide, we conduct a head-to-head comparison of sensor architectures, band configurations, processing levels, and programmatic data retrieval using STAC APIs.
📋 Prerequisites
- Basic knowledge of satellite bands and electromagnetic radiation.
- Access to a web browser or Python environment.
- Understanding of spatial and temporal resolution.
🛠️ Technical Environment
Required Software: Python / pystac-client & odc-stac (Recommended: Python 3.10+)
Practice Dataset: Element84 Earth Search STAC Catalog (Sentinel-2 L2A)
Source Portal: AWS Open Data / Copernicus
CRS / Format: UTM (Cloud-Optimized GeoTIFF via HTTPS)
Step-by-Step Workflow & Methodological Execution
Module 1: Landsat 8-9 OLI/TIRS vs Sentinel-2 MSI Specifications
• USGS Landsat 8-9 (Operational Land Imager & Thermal Infrared Sensor): - Spatial Resolution: 30m multispectral, 15m panchromatic band, 100m thermal. - Revisit Time: 16 days individually; 8 days combined constellation. - Band Architecture: 11 bands including dedicated coastal/aerosol (B1), Cirrus cloud detection (B9), and dual thermal channels (B10 & B11). - Swath Width: 185 km. • ESA Sentinel-2A/B (Multi-Spectral Instrument): - Spatial Resolution: 10m (RGB + NIR Band 8), 20m (Red Edge Bands 5-7, Narrow NIR 8a, SWIR 11-12), 60m (Atmospheric bands 1, 9, 10). - Revisit Time: 5 days with two-satellite constellation at equator. - Band Architecture: 13 bands featuring revolutionary 'Red Edge' bands specifically engineered for chlorophyll content and vegetation stress modeling. - Swath Width: 290 km.
Module 2: Data Processing Levels (Level-1C vs Level-2A)
Understanding data levels ensures you do not process uncorrected imagery: • Level-1C (Top of Atmosphere - TOA Reflectance): Measures radiant energy arriving at the satellite sensor aperture at the top of the atmosphere. Includes atmospheric scattering, ozone absorption, and haze interference. Suitable for general cartography, but unsuited for quantitative scientific modeling. • Level-2A (Bottom of Atmosphere - BOA / Surface Reflectance): Atmospheric correction algorithms (such as ESA's Sen2Cor or USGS LaSRC) model atmospheric aerosol optical depth and water vapor, removing atmospheric interference to produce true ground surface reflectance. Level-2A is mandatory for accurate NDVI time-series, LULC classification, and cross-sensor comparisons.
Module 3: Querying Imagery via STAC (SpatioTemporal Asset Catalog)
Modern spatial data pipelines avoid manual downloads from portals like USGS EarthExplorer. Instead, they query cloud-native SpatioTemporal Asset Catalogs (STAC): • STAC Standard: A standardized JSON specification allowing programmatic discovery of Cloud-Optimized GeoTIFFs (COGs) stored on AWS, Microsoft Planetary Computer, and Google Cloud. • Streaming Bands: Rather than downloading a 1 GB zipped scene, STAC and Rasterio allow windowed reads—streaming only the exact 10m Red and NIR bands directly into Python memory for your specific farm coordinates.
⚠️ Common Errors & Troubleshooting
❌ 'pystac_client.exceptions.APIError: 504 Gateway Timeout'
💡 Resolution: Narrow down your datetime range or limit the bounding box (bbox) coordinates to reduce server query overhead.
❌ Band arrays have mismatched pixel shapes
💡 Resolution: Sentinel-2 has 10m visible bands and 20m SWIR bands; resample bands to a common 10m grid using 'odc.stac.load(resolution=10)'.
💡 Expert Tips & Best Practices
- Use SpatioTemporal Asset Catalogs (STAC) to query satellite scenes by cloud cover and date in under 2 seconds.
- Take advantage of Cloud-Optimized GeoTIFFs (COGs) to download only the sub-window bounding box of your study area.
🐍 Python STAC API Dynamic Sentinel-2 Scene Discovery
from pystac_client import Client
import geopandas as gpd
# Connect to Microsoft Planetary Computer open STAC API
catalog = Client.open("https://planetarycomputer.microsoft.com/api/stac/v1")
# Define spatial bounding box (MinLon, MinLat, MaxLon, MaxLat)
bbox = [77.10, 28.50, 77.30, 28.70] # Delhi Capital Region
# Search catalog for cloud-free Sentinel-2 Level-2A items
search = catalog.search(
collections=["sentinel-2-l2a"],
bbox=bbox,
datetime="2023-11-01/2023-12-01",
query={"eo:cloud_cover": {"lt": 10}}
)
items = list(search.items())
print(f"Discovered {len(items)} matching cloud-free scenes.")
for item in items[:3]:
print(f"Scene ID: {item.id} | Date: {item.datetime} | Cloud Cover: {item.properties['eo:cloud_cover']:.1f}%")
# Assets contain direct HTTPS links to individual Cloud-Optimized GeoTIFF bands
b4_url = item.assets['B04'].href
print(f"Direct Band 4 (Red) Stream URL: {b4_url[:60]}...")