SAR access analysis
Lox models synthetic aperture radar (SAR) payloads via
SarPayload and SarAccessAnalysis.
The payload declares an angular envelope (look or incidence) and a looking
side; the analysis computes per-AOI access windows by scanning the
side-looking annular region under the ground track.
Example: Sentinel-1 over Europe
import lox_space as lox
sentinel1a = lox.SGP4("""\
SENTINEL-1A
1 39634U 14016A 26079.20000000 .00000050 00000+0 37000-4 0 9991
2 39634 98.1817 105.0000 0001300 90.0000 270.0000 14.59197557600008""")
# Sentinel-1 IW mode: ~29°–46° incidence, right-looking
payload = lox.SarPayload.with_incidence_angles(
29.0 * lox.deg, 46.0 * lox.deg, lox.LookSide.Right
)
sc = lox.Spacecraft("s1a", sentinel1a, sar_payload=payload)
t0 = sentinel1a.time()
t1 = t0 + 6 * lox.hours
scenario = lox.Scenario(t0, t1, spacecraft=[sc])
europe = lox.Aoi(
[(-10.0, 35.0), (20.0, 35.0), (20.0, 60.0), (-10.0, 60.0), (-10.0, 35.0)]
)
analysis = lox.SarAccessAnalysis(
scenario,
aois=[("europe", europe)],
step=30 * lox.seconds,
)
results = analysis.compute()
for window in results.windows("s1a", "europe"):
iv = window.interval()
print(f"{iv.start()} → {iv.end()} ({float(iv.duration()):.0f}s)")
print(window.direction())
Looking side
SarPayload selects the illuminated side via LookSide:
lox.LookSide.Right— right-looking only (e.g. legacy fixed-side platforms such as Sentinel-1).lox.LookSide.Left— left-looking only.lox.LookSide.Either— roll-agile (e.g. modern small-sat SAR such as ICEYE or Capella).
Angle conventions
Either constructor can be used depending on which angle convention is more natural for a given sensor specification:
# Look angle: measured at the spacecraft (off-nadir)
payload = lox.SarPayload.with_look_angles(
20.0 * lox.deg, 45.0 * lox.deg, lox.LookSide.Either
)
# Incidence angle: measured at the ground point (off-vertical)
payload = lox.SarPayload.with_incidence_angles(
22.0 * lox.deg, 46.0 * lox.deg, lox.LookSide.Right
)
Look and incidence angles are related via the spacecraft altitude and Earth's mean radius:
sin(incidence) = sin(look) · (R + h) / R
The analysis converts between them per-sample using the actual altitude; no reference altitude is baked into the payload.
Limitations
- Spherical Earth. Both look↔incidence conversion and ground-range geometry use mean radius. The error is negligible below ~30° incidence and grows slowly at higher angles.
- Large AOIs across the ground track. The detector evaluates distance to the nearest AOI point. For AOIs wider than the inner annulus radius that straddle the ground track, this can produce false negatives — split such AOIs into smaller polygons or use point targets.
- No squint, modes, or acquisition-quality outputs. A single angular envelope per payload; no per-mode swath, NESZ, or resolution.
SarPayload
SAR (Synthetic Aperture Radar) payload — side-looking annular access geometry.
Construct via :meth:with_look_angles (look angle at the satellite) or
:meth:with_incidence_angles (incidence angle at the ground point).
Assign to a spacecraft via the sar_payload parameter.
Examples:
>>> import lox_space as lox
>>> payload = lox.SarPayload.with_incidence_angles(29.0 * lox.deg, 46.0 * lox.deg, lox.LookSide.Right)
>>> sc = lox.Spacecraft("s1a", orbit, sar_payload=payload)
LookSide
Which side of the ground track a SAR payload can image.
Left and Right are defined relative to the spacecraft's instantaneous
Earth-fixed velocity at the sub-satellite point.
SarAccessAnalysis
SAR access analysis: per-(spacecraft, AOI) access windows.
Only spacecraft carrying a sar_payload contribute.
Parameters:
-
–scenarioScenario containing spacecraft with
sar_payload. -
–aoisList of (id, Aoi) tuples defining the areas of interest.
-
–ensembleOptional pre-computed Ensemble.
-
–stepOptional time step for event detection (default: 60s).
-
–body_fixed_frameOptional body-fixed frame override.
Examples:
>>> import lox_space as lox
>>> payload = lox.SarPayload.with_incidence_angles(29.0 * lox.deg, 46.0 * lox.deg, lox.LookSide.Right)
>>> sc = lox.Spacecraft("s1a", orbit, sar_payload=payload)
>>> scenario = lox.Scenario(t0, t1, spacecraft=[sc])
>>> aoi = lox.Aoi([(10, 45), (11, 45), (11, 46), (10, 46), (10, 45)])
>>> analysis = lox.SarAccessAnalysis(scenario, aois=[("rome", aoi)])
>>> results = analysis.compute()
Methods:
-
compute–Compute access intervals for all (spacecraft, AOI) pairs.
compute
compute() -> AccessResults
Compute access intervals for all (spacecraft, AOI) pairs.
If no ensemble was provided, the scenario is propagated automatically. Spacecraft without a SAR payload are skipped.