Skip to content

Observation Geometry

Calculate azimuth and elevation independently of TEC, using broadcast navigation loaded once with read_rinex_nav. The TEC Calculation guide shows the complete workflow.

compute_az_el

compute_az_el(
    observations: DataFrame | LazyFrame,
    header: RinexObsHeader,
    navigation: NavigationData,
    *,
    overwrite: bool = False,
) -> pl.LazyFrame

Append satellite azimuth and elevation to observations from one station.

Parameters:

Name Type Description Default
observations DataFrame or LazyFrame

Wide or long observations with time, station and prn. Time must be timezone-aware UTC or timezone-naive GPS. Existing rx_lat/rx_lon columns override header coordinates in degrees; height follows the header's receiver history in metres.

required
header RinexObsHeader

Observation time-scale and receiver-position metadata.

required
navigation NavigationData

Broadcast ephemerides loaded by read_rinex_nav. Reuse this object across calls to avoid repeated decoding and indexing.

required
overwrite bool

Replace both angle columns if either already exists. False raises rather than mixing existing and newly computed angles.

False

Returns:

Type Description
LazyFrame

Original rows, columns and time values plus Float64 azimuth/elevation in degrees. Azimuth is clockwise from north in [0, 360); elevation is in [-90, 90]. Unavailable geometry is null; no elevation filter or TEC quality control is applied. Query collection and satellite propagation complete before return; angle evaluation remains lazy.

Raises:

Type Description
TypeError

If navigation is not NavigationData or time is not Datetime.

ValueError

If required columns are absent, time/PRN is invalid, multiple stations are present, or existing angle columns would be overwritten.