Burst Mode: Sentinel-1 SLC Burst Search and Download
Overview
Phidown provides comprehensive support for searching and downloading individual Sentinel-1 SLC bursts. This feature allows you to access the fundamental imaging units of Sentinel-1 TOPSAR data without downloading entire SLC products.
What are Sentinel-1 Bursts?
Sentinel-1 operates in Interferometric Wide (IW) and Extra-Wide (EW) modes using a ScanSAR technique called TOPSAR (Terrain Observation with Progressive Scans SAR). In these modes, the radar antenna repeatedly switches between several adjacent sub-swaths, collecting short sequences of radar pulses during each observation. Each of these short pulse sequences is known as a burst, which represents the smallest imaging unit in Sentinel-1 SLC data.
A standard IW or EW SLC product combines data from many bursts. Each sub-swath is processed into an image containing a series of slightly overlapping bursts, and all sub-swaths (three for IW, five for EW) are then merged to form the final SLC product. Although the product contains multiple bursts, each burst can also be processed and used individually.
Key Characteristics
Available from: August 2, 2024 onwards
IW Mode: 3 sub-swaths (IW1, IW2, IW3)
EW Mode: 5 sub-swaths (EW1, EW2, EW3, EW4, EW5)
Polarizations: VV, VH, HH, HV
On-Demand Processing: Bursts are generated dynamically upon request
Searching for Bursts
Enabling Burst Mode
To search for bursts instead of full products, set burst_mode=True
in the query_by_filter
method:
from phidown.search import CopernicusDataSearcher
searcher = CopernicusDataSearcher()
searcher.query_by_filter(
burst_mode=True,
start_date='2024-08-01T00:00:00',
end_date='2024-08-03T00:00:00',
top=10
)
df = searcher.execute_query()
Available Burst Parameters
When burst_mode=True
, you can use the following burst-specific filters:
Parameter |
Type |
Description |
Example Values |
---|---|---|---|
|
int |
Unique identifier for a specific burst location |
|
|
int |
Global unique burst identifier |
|
|
str |
Swath name |
|
|
str |
Name of the parent SLC product |
|
|
str |
Type of parent product |
|
|
str |
Acquisition mode |
|
|
str |
Polarization |
|
|
str |
Sentinel-1 satellite |
|
|
int |
Relative orbit number |
|
|
int |
Datatake identifier |
|
You can also combine burst-specific parameters with standard filters like start_date
, end_date
, aoi_wkt
, and orbit_direction
.
Search Examples
Example 1: Basic Burst Search with Temporal Filter
The simplest burst search uses only temporal filters:
from phidown.search import CopernicusDataSearcher
searcher = CopernicusDataSearcher()
# Configure search for bursts with temporal filter
searcher.query_by_filter(
burst_mode=True,
start_date='2024-08-01T00:00:00',
end_date='2024-08-03T00:00:00',
top=10,
count=True
)
# Execute the query
df = searcher.execute_query()
print(f'Number of results: {len(df)}')
print(f'Total available results: {searcher.num_results}')
# Display first few results
searcher.display_results(top_n=5)
Example 2: Burst Search with Spatial Filter (AOI)
Combine burst mode with spatial filtering using a WKT polygon:
# Define an area of interest (example: region in central Europe)
aoi_wkt = """POLYGON((12.655118166047592 47.44667197521409,
21.39065656328509 48.347694733853245,
28.334291357162826 41.877123516783655,
17.47086198383573 40.35854475076158,
12.655118166047592 47.44667197521409))"""
searcher = CopernicusDataSearcher()
# Configure search with AOI and temporal filter
searcher.query_by_filter(
burst_mode=True,
aoi_wkt=aoi_wkt,
start_date='2024-08-01T00:00:00',
end_date='2024-08-03T00:00:00',
top=10,
count=True
)
# Execute and display results
df = searcher.execute_query()
print(f'Found {len(df)} bursts in the specified area')
Example 3: Search by Specific Burst ID
Retrieve all acquisitions of a specific burst:
searcher = CopernicusDataSearcher()
# Search for a specific burst ID
searcher.query_by_filter(
burst_mode=True,
burst_id=15804,
start_date='2024-08-01T00:00:00',
end_date='2024-08-15T00:00:00',
top=20,
count=True
)
df = searcher.execute_query()
print(f'Found {len(df)} acquisitions of burst 15804')
Example 4: Filter by Swath and Polarization
Search for bursts from a specific swath with specific polarization:
searcher = CopernicusDataSearcher()
# Search for IW2 swath with VV polarization
searcher.query_by_filter(
burst_mode=True,
swath_identifier='IW2',
polarisation_channels='VV',
start_date='2024-08-01T00:00:00',
end_date='2024-08-03T00:00:00',
top=10,
count=True
)
df = searcher.execute_query()
print(f'Found {len(df)} bursts from swath IW2 with VV polarization')
Example 5: Search Bursts from a Specific Parent Product
Retrieve all bursts from a specific parent SLC product:
searcher = CopernicusDataSearcher()
parent_product = 'S1A_IW_SLC__1SDV_20240802T060719_20240802T060746_055030_06B44E_E7CC.SAFE'
searcher.query_by_filter(
burst_mode=True,
parent_product_name=parent_product,
start_date='2024-08-01T00:00:00',
end_date='2024-08-15T00:00:00',
polarisation_channels='VV',
top=1000
)
df = searcher.execute_query()
print(f'Found {len(df)} bursts in parent product')
Example 6: Filter by Orbit Parameters
Combine orbit parameters for consistent time-series analysis:
searcher = CopernicusDataSearcher()
searcher.query_by_filter(
burst_mode=True,
orbit_direction='DESCENDING',
relative_orbit_number=8,
operational_mode='IW',
start_date='2024-08-01T00:00:00',
end_date='2024-08-10T00:00:00',
top=20,
count=True
)
df = searcher.execute_query()
print(f'Found {len(df)} bursts from descending orbit #8')
Example 7: Advanced Multi-Parameter Search
Combine multiple parameters for highly targeted searches:
searcher = CopernicusDataSearcher()
searcher.query_by_filter(
burst_mode=True,
burst_id=15804,
swath_identifier='IW2',
parent_product_type='IW_SLC__1S',
orbit_direction='DESCENDING',
relative_orbit_number=8,
operational_mode='IW',
polarisation_channels='VV',
platform_serial_identifier='A', # Sentinel-1A
start_date='2024-08-01T00:00:00',
end_date='2024-08-15T00:00:00',
top=20,
count=True
)
df = searcher.execute_query()
print(f'Found {len(df)} bursts matching all criteria')
Downloading Bursts
Authentication
To download bursts, you need to obtain an access token using your CDSE credentials:
from phidown.downloader import get_token
access_token = get_token(
username='your_cdse_username',
password='your_cdse_password'
)
On-Demand Burst Download
Bursts are generated on-demand rather than retrieved from pre-stored files. This means S3 commands are not applicable. Instead, a POST request is sent to the CDSE service, which dynamically produces and returns the requested burst.
from pathlib import Path
from phidown.downloader import download_burst_on_demand
# Get burst ID from search results
burst_id = df.iloc[0]['Id']
# Download the burst
download_burst_on_demand(
burst_id=burst_id,
token=access_token,
output_dir=Path('./output')
)
Complete Download Workflow
Here’s a complete example combining search and download:
import os
from pathlib import Path
from phidown.search import CopernicusDataSearcher
from phidown.downloader import get_token, download_burst_on_demand
# Step 1: Authenticate
username = os.environ['CDSE_USERNAME']
password = os.environ['CDSE_PASSWORD']
token = get_token(username=username, password=password)
# Step 2: Search for bursts
searcher = CopernicusDataSearcher()
searcher.query_by_filter(
burst_mode=True,
burst_id=15804,
swath_identifier='IW2',
polarisation_channels='VV',
start_date='2024-08-01T00:00:00',
end_date='2024-08-03T00:00:00',
top=5
)
df = searcher.execute_query()
# Step 3: Download bursts
output_dir = Path('./bursts')
output_dir.mkdir(exist_ok=True)
for idx, row in df.iterrows():
burst_id = row['Id']
print(f'Downloading burst {burst_id}...')
download_burst_on_demand(
burst_id=burst_id,
token=token,
output_dir=output_dir
)
Common Use Cases
InSAR Time Series
Search for specific burst IDs across multiple dates with consistent orbit parameters:
searcher.query_by_filter(
burst_mode=True,
burst_id=15804,
relative_orbit_number=8,
orbit_direction='DESCENDING',
start_date='2024-08-01T00:00:00',
end_date='2024-12-31T00:00:00',
top=1000
)
Regional Analysis
Use AOI with swath/polarization filters to get bursts covering your study area:
searcher.query_by_filter(
burst_mode=True,
aoi_wkt=your_polygon_wkt,
swath_identifier='IW2',
polarisation_channels='VV',
start_date='2024-08-01T00:00:00',
end_date='2024-08-31T00:00:00'
)
Product Decomposition
Retrieve all bursts from a parent SLC product for individual processing:
searcher.query_by_filter(
burst_mode=True,
parent_product_name='S1A_IW_SLC__1SDV_...',
top=1000
)
Systematic Monitoring
Filter by relative orbit number and burst ID for regular acquisitions:
searcher.query_by_filter(
burst_mode=True,
burst_id=15804,
relative_orbit_number=8,
start_date='2024-08-01T00:00:00',
end_date='2024-12-31T00:00:00'
)
Valid Parameter Values
- Swath Identifiers
IW mode:
'IW1'
,'IW2'
,'IW3'
EW mode:
'EW1'
,'EW2'
,'EW3'
,'EW4'
,'EW5'
- Parent Product Types
'IW_SLC__1S'
(Interferometric Wide SLC)'EW_SLC__1S'
(Extra Wide SLC)
- Operational Modes
'IW'
(Interferometric Wide)'EW'
(Extra Wide)
- Polarization Channels
'VV'
(Vertical-Vertical)'VH'
(Vertical-Horizontal)'HH'
(Horizontal-Horizontal)'HV'
(Horizontal-Vertical)
- Platform Serial Identifiers
'A'
(Sentinel-1A)'B'
(Sentinel-1B)
- Orbit Directions
'ASCENDING'
'DESCENDING'
Important Notes
Note
Burst data is only available from August 2, 2024 onwards.
Warning
Bursts are generated on-demand, which means download times may be longer than for pre-stored products. The first request for a specific burst may take several minutes as the system processes it.
Tip
For InSAR time series, always use the same burst_id
and relative_orbit_number
to ensure spatial consistency across acquisitions.
See also
search for general search functionality
download for standard product downloads
API Reference
- phidown.downloader.get_token(username, password)[source]
Acquire an access token from Copernicus Data Space Ecosystem.
This function authenticates with the CDSE identity service using username and password credentials to obtain a Keycloak access token for API access.
- Parameters:
- Returns:
The access token string to be used for authenticated API requests.
- Return type:
- Raises:
AssertionError – If username or password is empty.
requests.exceptions.HTTPError – If the authentication request fails.
Example
>>> token = get_token('myuser@example.com', 'mypassword') Acquired keycloak token!
- phidown.downloader.download_burst_on_demand(burst_id, token, output_dir)[source]
Download and save a Sentinel-1 burst product from CDSE.
This function requests on-demand processing of a single Sentinel-1 burst and downloads the resulting product as a ZIP file. The burst is identified by its UUID from the CDSE catalogue.
- Parameters:
- Raises:
AssertionError – If burst_id or token is empty.
RuntimeError – If burst processing fails or returns non-200 status.
- Return type:
Example
>>> from pathlib import Path >>> token = get_token('user@example.com', 'password') >>> download_burst('12345678-1234-1234-1234-123456789abc', token, Path('./output')) Processing burst... Processing has been successful! Saving output product... Output product has been saved to: ./output/burst_12345678.zip
- CopernicusDataSearcher.query_by_filter(base_url='https://catalogue.dataspace.copernicus.eu/odata/v1/Products', collection_name='SENTINEL-1', product_type=None, orbit_direction=None, cloud_cover_threshold=None, attributes=None, aoi_wkt=None, start_date=None, end_date=None, top=1000, count=False, order_by='ContentDate/Start desc', burst_mode=False, burst_id=None, absolute_burst_id=None, swath_identifier=None, parent_product_name=None, parent_product_type=None, parent_product_id=None, datatake_id=None, relative_orbit_number=None, operational_mode=None, polarisation_channels=None, platform_serial_identifier=None)[source]
Set and validate search parameters for the Copernicus data query.
- Parameters:
base_url (str) – The base URL for the OData API.
collection_name (str, optional) – Name of the collection to search. Defaults to ‘SENTINEL-1’.
product_type (str, optional) – Type of product to filter. Defaults to None.
orbit_direction (str, optional) – Orbit direction to filter (e.g., ‘ASCENDING’, ‘DESCENDING’). Defaults to None.
cloud_cover_threshold (float, optional) – Maximum cloud cover percentage to filter. Defaults to None.
attributes (Dict[str, Union[str, int, float]], optional) – Additional attributes for filtering. Defaults to None.
aoi_wkt (str, optional) – Area of Interest in WKT format. Defaults to None.
start_date (str, optional) – Start date for filtering (ISO 8601 format). Defaults to None.
end_date (str, optional) – End date for filtering (ISO 8601 format). Defaults to None.
top (int, optional) – Maximum number of results to retrieve. Defaults to 1000.
count (bool, optional) – Whether to include count of results. Defaults to False.
order_by (str, optional) – Field and direction to order results by. Defaults to “ContentDate/Start desc”.
burst_mode (bool, optional) – Enable Sentinel-1 SLC Burst mode searching. Defaults to False.
burst_id (int, optional) – Burst ID to filter (burst mode only). Defaults to None.
absolute_burst_id (int, optional) – Absolute Burst ID to filter (burst mode only). Defaults to None.
swath_identifier (str, optional) – Swath identifier (e.g., ‘IW1’, ‘IW2’) (burst mode only). Defaults to None.
parent_product_name (str, optional) – Parent product name (burst mode only). Defaults to None.
parent_product_type (str, optional) – Parent product type (burst mode only). Defaults to None.
parent_product_id (str, optional) – Parent product ID (burst mode only). Defaults to None.
datatake_id (int, optional) – Datatake ID (burst mode only). Defaults to None.
relative_orbit_number (int, optional) – Relative orbit number (burst mode only). Defaults to None.
operational_mode (str, optional) – Operational mode (e.g., ‘IW’, ‘EW’) (burst mode only). Defaults to None.
polarisation_channels (str, optional) – Polarisation channels (e.g., ‘VV’, ‘VH’) (burst mode only). Defaults to None.
platform_serial_identifier (str, optional) – Platform serial identifier (e.g., ‘A’, ‘B’) (burst mode only). Defaults to None.
- Return type: