Solar Glint¶
Predict specular reflection (glint) angles along flight lines for
water-observation missions. Includes the GlintArc
class for computing flight paths that follow constant glint geometry.
Glint geometry and arc planning.
The geometry is derived from optics first, then kinematics:
Specular reflection defines the aircraft midpoint position (offset from target along the solar azimuth by
alt * tan(SZA)).The turn center is placed on the opposite side of the aircraft from the target (toward the sun), guaranteeing the target is always outside the turn circle.
The aircraft flies a 180-degree banked turn around that center.
At the arc midpoint the view zenith equals SZA and the view azimuth opposes the solar azimuth, giving a glint angle of zero (perfect specular reflection).
Glint references¶
Cox, C. and Munk, W. (1954). Measurement of the roughness of the sea surface from photographs of the sun’s glitter. Journal of the Optical Society of America, 44(11), 838-850. doi:10.1364/JOSA.44.000838
Ayasse, A. K., Thorpe, A. K., Cusworth, D. H., Kort, E. A., Gorchov Negron, A., Heckler, J., Asner, G., and Duren, R. M. (2022). Methane remote sensing and emission quantification of offshore shallow water oil and gas platforms in the Gulf of Mexico. Environmental Research Letters, 17(8), 084039. doi:10.1088/1748-9326/ac8566
Solar position via the sunposition library:
Reda, I. and Andreas, A. (2004). Solar position algorithm for solar
radiation applications. Solar Energy, 76(5), 577-589.
doi:10.1016/j.solener.2003.12.003
- class GlintArc[source]¶
Bases:
objectArc-shaped flight path that tilts the sensor to maximize specular glint.
The aircraft position is derived from specular reflection geometry, then the turn center is placed on the opposite side of the aircraft from the target (toward the sun). This guarantees the target is always outside the turn circle.
At the arc midpoint the bank angle tilts the nadir-pointing sensor so that VZA = bank_angle and the view azimuth opposes the solar azimuth, producing a glint angle of zero (perfect specular reflection).
This implements the glint-arc observing strategy used by Ayasse et al. (2022) for airborne methane detection over offshore oil and gas platforms in the Gulf of Mexico (https://doi.org/10.1088/1748-9326/ac8566).
- Parameters:
target_lat (
float) – Latitude of the target in decimal degrees.target_lon (
float) – Longitude of the target in decimal degrees.observation_datetime (
datetime) – UTC datetime for solar position computation.altitude_msl – Aircraft altitude above mean sea level (pint Quantity).
speed – Aircraft speed (pint Quantity).
bank_angle (
Optional[float]) – Bank angle in degrees. Defaults to SZA when SZA <= 60.site_name (
Optional[str]) – Optional name for the target site.bank_direction (
str) –"left"or"right"(default"right").
- __init__(target_lat, target_lon, observation_datetime, altitude_msl, speed, bank_angle=None, site_name=None, bank_direction='right', collection_length=None)[source]¶
- property turn_radius¶
- property length¶
- property duration¶
- property waypoint1¶
- property waypoint2¶
- approach_line(length)[source]¶
Straight FlightLine leading tangentially into the arc start.
- Parameters:
length – Approach distance. Accepts a Quantity with length units or a plain float (assumed meters).
- Return type:
- Returns:
FlightLine from the entry point to the arc start waypoint.
- exit_line(length)[source]¶
Straight FlightLine departing tangentially from the arc end.
- Parameters:
length – Exit distance. Accepts a Quantity with length units or a plain float (assumed meters).
- Return type:
- Returns:
FlightLine from the arc end waypoint to the exit point.
- track(precision=100.0)[source]¶
Return the arc as a densified LineString.
- Parameters:
precision – Desired distance between interpolated points. Accepts a Quantity with length units or a plain float (assumed meters).
- Return type:
- calculate_target_and_glint_vectorized(sensor_lat, sensor_lon, sensor_alt, viewing_azimuth, tilt_angle, observation_datetime=None, solar_azimuth=None, solar_zenith=None)[source]¶
Compute target intersection and glint angle for sensor samples.
If
solar_azimuthandsolar_zenithare provided, the per-samplesunposcall is skipped — useful when callers have already sampled solar geometry along the track and broadcast it to match the tiled shape ofviewing_azimuth/tilt_angle.
- compute_glint_vectorized(flight_line, sensor, observation_datetime, output_geometry='geographic')[source]¶
Compute glint angles across a flight line’s sensor swath.
- Parameters:
flight_line (
FlightLine) – FlightLine object defining the flight path.sensor (
ScanningSensor) – Any object satisfying theScanningSensorprotocol — onlyhalf_angleis read.observation_datetime (
datetime) – The observation timestamp (UTC).output_geometry (
str) – “geographic” for target lat/lon Points, or “along_track” for (tilt, along_track_distance) Points.
- Returns:
target_latitude, target_longitude, glint_angle, tilt_angle, viewing_azimuth, along_track_distance.
- Return type:
GeoDataFrame with columns
- compute_glint_arc(glint_arc, sensor, output_geometry='geographic')[source]¶
Compute glint angles across a glint arc’s sensor swath.
Evaluates the glint-arc observing strategy of Ayasse et al. (2022) (https://doi.org/10.1088/1748-9326/ac8566), developed for airborne methane detection over offshore oil and gas platforms.
- Parameters:
- Returns:
target_latitude, target_longitude, glint_angle, tilt_angle, view_zenith, viewing_azimuth, along_track_distance.
- Return type:
GeoDataFrame with columns
- fraction_exceeding_glint_threshold(glint_gdf, threshold)[source]¶
Fraction of glint samples whose angle is below
thresholddegrees.A small glint angle means specular contamination, so values below the threshold are the bad ones (i.e. the part of the swath that “exceeds” the user’s tolerable glint level). Returns a fraction in [0, 1].
- Parameters:
glint_gdf (
GeoDataFrame) – Result ofcompute_glint_vectorized()orcompute_glint_arc(). Must contain aglint_anglecolumn in degrees.threshold (
float) – Glint angle threshold in degrees. Common values are 5° (severe contamination) and 25° (moderate contamination).
- Return type:
- Returns:
Fraction of samples with
glint_angle < threshold, in [0, 1]. Returns 0.0 for an empty input.