Skip to content

Atmospheric Delays

Ionospheric

Atmospheric Delay Corrections: Ionospheric submodule.

Through the ionosphere, propagation delays are caused by dispersive effects.

Attributes

Classes

IonosphericAnalysisCenters

Bases: Enum

Ionospheric available analysis centers

Attributes

COD class-attribute instance-attribute
Python
COD = auto()
COR class-attribute instance-attribute
Python
COR = auto()
EHR class-attribute instance-attribute
Python
EHR = auto()
ESA class-attribute instance-attribute
Python
ESA = auto()
ESR class-attribute instance-attribute
Python
ESR = auto()
IGR class-attribute instance-attribute
Python
IGR = auto()
IGS class-attribute instance-attribute
Python
IGS = auto()
JPL class-attribute instance-attribute
Python
JPL = auto()
UPC class-attribute instance-attribute
Python
UPC = auto()
UHR class-attribute instance-attribute
Python
UHR = auto()
UPR class-attribute instance-attribute
Python
UPR = auto()
UQR class-attribute instance-attribute
Python
UQR = auto()

WrongAnalysisCenterNameError

Bases: ValueError

Wrong analysis center name for ionospheric data retrieval

TECMapReadingError

Bases: RuntimeError

Error encountered while reading the Ionospheric IONEX TEC Map file

IonosphericMapFileNotFoundError

Bases: FileNotFoundError

Could not find the specified ionospheric map file

TECIncidenceAngleMethod

Bases: Enum

Method for generating mapping function for Ionospheric delay evaluation from TEC data

Attributes

IPP class-attribute instance-attribute
Python
IPP = auto()
GROUND class-attribute instance-attribute
Python
GROUND = auto()
GROUND_CONVERTED class-attribute instance-attribute
Python
GROUND_CONVERTED = auto()

TECMapSolutionType

Bases: Enum

Solution type of TEC maps for Ionospheric delay evaluation from TEC data

Attributes

FINAL class-attribute instance-attribute
Python
FINAL = 'FIN'
RAPID class-attribute instance-attribute
Python
RAPID = 'RAP'

TECMapTimeResolution

Bases: Enum

Time resolution of TEC maps for Ionospheric delay evaluation from TEC data

Attributes

HALF_HOUR class-attribute instance-attribute
Python
HALF_HOUR = '30M'
HOUR class-attribute instance-attribute
Python
HOUR = '01H'
TWO_HOURS class-attribute instance-attribute
Python
TWO_HOURS = '02H'

IonosphericDelayEstimator

Ionospheric Delay Estimator (first order approximation, slant range) from CDDIS IONEX TEC MAP class. The delay is due to the refractive index of the medium the signal is passing through.

The ionosphere is the zone of the terrestrial atmosphere that contains a partially ionised medium, as result of the X and UV rays of Solar Radiation and the incidence of charged particles.

The propagation speed of the electromagnetic signals in the ionosphere depends on its electron density:

  • during the day, sun radiation causes ionisation of neutral atoms producing free electrons and ions (TEC)
  • during the night, the recombination process prevails, where free electrons and ions are recombined, lowering TEC

Ionosphere is a dispersive media, with the following Relation of Dispersion between \(\omega\) and \(k\) of the incoming wave:

\[ \omega^2 = c^2 \cdot k^2 + \omega_p^2 \]

where \(\omega_p\) is the critical frequency of the ionospheric plasma, meaning that only signals with \(\omega > \omega_p\) through the ionized plasma medium. Therefore, ionosphere causes a frequency dependent path delay for microwave signals.

Attributes

acquisition_time instance-attribute
Python
acquisition_time = acquisition_time
ionospheric_delay_scaling_factor instance-attribute
Python
ionospheric_delay_scaling_factor = ionospheric_delay_scaling_factor
carrier_freq instance-attribute
Python
carrier_freq = fc_hz
tec_mapping_method instance-attribute
Python
tec_mapping_method = tec_mapping_method
solution_type instance-attribute
Python
solution_type = tec_solution_type
time_resolution instance-attribute
Python
time_resolution = tec_time_resolution
analysis_center instance-attribute
Python
analysis_center = IonosphericAnalysisCenters[analysis_center.upper()]
ionospheric_map_folder instance-attribute
Python
ionospheric_map_folder = None

Methods:

__init__
Python
__init__(acquisition_time: PreciseDateTime, analysis_center: str, fc_hz: float, ionospheric_delay_scaling_factor: float, tec_mapping_method: TECIncidenceAngleMethod, tec_solution_type: TECMapSolutionType = TECMapSolutionType.FINAL, tec_time_resolution: TECMapTimeResolution = TECMapTimeResolution.HOUR, map_folder: Path | str | None = None) -> None

Ionosphere delay estimator class from TEC MAP file NASA CDDIS format. This class, through the method estimate delay, provides as output the first order approximation of the ionospheric path delay experiences by the electromagnetic signal of the sensor converted in slant range for each set of point target coordinates.

Parameters:

Name Type Description Default
acquisition_time PreciseDateTime

scene acquisition time, the time at which the ionospheric delay must be evaluated

required
analysis_center str

analysis center for solutions from those supported

required
fc_hz float

carrier frequency of the sensors signal

required
ionospheric_delay_scaling_factor float

scaling factor to be applied to the ionospheric delay

required
tec_mapping_method TECIncidenceAngleMethod

selected method to compute the mapping function

required
tec_solution_type TECMapSolutionType

selected type of solution for TEC maps, by default TECMapSolutionType.FINAL

FINAL
tec_time_resolution TECMapTimeResolution

selected type of time resolution for TEC maps, by default TECMapTimeResolution.HOUR

HOUR
map_folder Path | str | None

path to the folder where the TEC MAP file is placed, by default None

None

Raises:

Type Description
WrongAnalysisCenterNameError

if the analysis center is not among those implemented, this error is raised

read_ionosphere_map_file
Python
read_ionosphere_map_file(ionosphere_map_file: Path) -> tuple[list, list, np.ndarray, np.ndarray]

Read the Ionosphere IONEX map file to extract data on Total Electron Content.

Parameters:

Name Type Description Default
ionosphere_map_file Path

path to the ionosphere map file, not zipped

required

Returns:

Type Description
list

list of tec data arrays for each lat/lon

list

list of recording hours

ndarray

latitude axis (monotonically increasing)

ndarray

longitude axis (monotonically increasing)

estimate_delay
Python
estimate_delay(sat_xyz_coords: ndarray, point_targets_coords: ndarray) -> np.ndarray

Estimation of the ionospheric time delay as first order approximation of the ionospheric path delay in slant range.

The equation used is the following (latex):

\[ \Delta L = \frac{40.3 \cdot 10^{16}}{f_c} \cdot MF(z) \cdot v_{TEC} \]

where f_c is the carrier frequency of the signal piercing through the ionosphere, MF(z) is the mapping function mapping function for conversion into slant delay using the zenith angle z, and vTEC is the vertical total electron content of the ionosphere in that point, in TEC units (1 TECU = 10E16 electrons per m^2)

Parameters:

Name Type Description Default
sat_xyz_coords ndarray

satellite XYZ coordinates at which calibration targets are seen as numpy array of shape Nx3

required
point_targets_coords ndarray

point targets XYZ coordinates as numpy array of shape Nx3

required

Returns:

Type Description
ndarray

ionospheric delay

Functions:

generate_ionospheric_map_filename

Python
generate_ionospheric_map_filename(acq_time: PreciseDateTime, center: IonosphericAnalysisCenters, solution_type: TECMapSolutionType = TECMapSolutionType.FINAL, time_resolution: TECMapTimeResolution = TECMapTimeResolution.HOUR) -> str

Generating the map file name accordingly to the CDDIS format.

For more information on the naming convention see also:

https://cddis.nasa.gov/Data_and_Derived_Products/GNSS/atmospheric_products.html

Parameters:

Name Type Description Default
acq_time PreciseDateTime

time of interest to retrieve the correct ionospheric data

required
center IonosphericAnalysisCenters

analysis center name

required
solution_type IonosphericAnalysisCenters

TEC map solution type, by default TECMapSolutionType.FINAL

FINAL
time_resolution TECMapTimeResolution

TEC map time resolution, by default TECMapTimeResolution.HOUR

HOUR

Returns:

Type Description
str

name of the ionospheric map file

compute_delay

Python
compute_delay(acq_time: PreciseDateTime, targets_xyz_coords: ndarray, sat_xyz_coords: ndarray, analysis_center: str | IonosphericAnalysisCenters, fc_hz: float, map_folder: Path | str | None = None, delay_scaling_factor: float = 1.0, tec_mapping_method: TECIncidenceAngleMethod = TECIncidenceAngleMethod.GROUND_CONVERTED, tec_solution_type: TECMapSolutionType = TECMapSolutionType.FINAL, tec_time_resolution: TECMapTimeResolution = TECMapTimeResolution.HOUR) -> np.ndarray

Compute ionospheric signal delay from date and coordinates (sensor and ground).

Parameters:

Name Type Description Default
acq_time PreciseDateTime

scene acquisition time, the time at which the ionospheric delay must be evaluated

required
targets_xyz_coords ndarray

point targets XYZ coordinates as numpy array of shape Nx3

required
sat_xyz_coords ndarray

satellite XYZ coordinates at which calibration targets are seen as numpy array of shape Nx3

required
analysis_center str | IonosphericAnalysisCenters]

analysis center for solutions from those supported

required
fc_hz float

carrier frequency of the sensor's signal

required
map_folder Path | str | None

path to the folder where the TEC MAP file is placed, by default None

None
delay_scaling_factor float

scaling factor to be applied to the ionospheric delay, by default 1.0

1.0
tec_mapping_method TECIncidenceAngleMethod

selected method to compute the mapping function, by default TECIncidenceAngleMethod.GROUND_CONVERTED

GROUND_CONVERTED
tec_solution_type TECMapSolutionType

selected type of solution for TEC maps, by default TECMapSolutionType.FINAL

FINAL
tec_time_resolution TECMapTimeResolution

selected type of time resolution for TEC maps, by default TECMapTimeResolution.HOUR

HOUR

Returns:

Type Description
ndarray

ionospheric delay

Tropospheric

Atmospheric Delay Corrections: Tropospheric submodule.

Through neutral troposphere, propagation delays are caused by air refractivity gradients.

Air refractivity gradients in the troposphere are first due to the dry air pressure and temperature and, to a lesser extent, to air moisture and condensed water in clouds or rain. The dry air temperature and pressure can be considered as mostly vertically stratified, and thus lead to a large phase delay varying only with elevation in a radar scene. On the contrary, the air water vapor varies both vertically and laterally over short distances.

Attributes

SECONDS_IN_A_DAY module-attribute

Python
SECONDS_IN_A_DAY = 86400

DAYS_IN_YEAR module-attribute

Python
DAYS_IN_YEAR = 365.25

ATMOSPHERIC_PRESSURE_MB module-attribute

Python
ATMOSPHERIC_PRESSURE_MB = 1013.25

TROPOSPHERE_TEMP_LAPSE_RATE module-attribute

Python
TROPOSPHERE_TEMP_LAPSE_RATE = 0.0065

TROPOSPHERE_TEMP_REFERENCE module-attribute

Python
TROPOSPHERE_TEMP_REFERENCE = 288.15

GRAVITATIONAL_ACCELERATION module-attribute

Python
GRAVITATIONAL_ACCELERATION = 9.80665

MOLAR_MASS_AIR module-attribute

Python
MOLAR_MASS_AIR = 0.0289644

UNIVERSAL_GAS_CONSTANT module-attribute

Python
UNIVERSAL_GAS_CONSTANT = 8.3144598

SAASTAMOINEN_CNTS module-attribute

Python
SAASTAMOINEN_CNTS = (0.0022768, 0.00266, 2.8e-07)

Classes

TroposphericGridStationFileNotFoundError

Bases: FileNotFoundError

Could not find the specified grid points station coordinates file

TroposphericGridResolutionNotSupportedError

Bases: ValueError

Grid resolution provided is not supported

TroposphericMapModel

Bases: Enum

Tropospheric map data model

Attributes

DORIS class-attribute instance-attribute
Python
DORIS = auto()
GNSS class-attribute instance-attribute
Python
GNSS = auto()
GRID class-attribute instance-attribute
Python
GRID = auto()
SLR class-attribute instance-attribute
Python
SLR = auto()
VLBI class-attribute instance-attribute
Python
VLBI = auto()

TroposphericGRIDResolution

Bases: Enum

Tropospheric map resolution for GRID model

Attributes

FINE class-attribute instance-attribute
Python
FINE = '1x1'
MEDIUM class-attribute instance-attribute
Python
MEDIUM = '2.5x2'
COARSE class-attribute instance-attribute
Python
COARSE = '5x5'

TroposphericMapType

Bases: Enum

Tropospheric map data type

Attributes

GRAD class-attribute instance-attribute
Python
GRAD = auto()
LHG class-attribute instance-attribute
Python
LHG = auto()
RAYTR class-attribute instance-attribute
Python
RAYTR = auto()
V3GR class-attribute instance-attribute
Python
V3GR = auto()
VMF1 class-attribute instance-attribute
Python
VMF1 = auto()
VMF3 class-attribute instance-attribute
Python
VMF3 = auto()
VMF3o class-attribute instance-attribute
Python
VMF3o = auto()

TroposphericMapVersion

Bases: Enum

Tropospheric map data version

Attributes

EI class-attribute instance-attribute
Python
EI = auto()
FC class-attribute instance-attribute
Python
FC = auto()
OP class-attribute instance-attribute
Python
OP = auto()
RADIATE class-attribute instance-attribute
Python
RADIATE = auto()
TRP class-attribute instance-attribute
Python
TRP = auto()

TroposphericGridInterpolationMethod

Bases: Enum

Tropospheric grid interpolation method using griddata from scipy.interpolate, check the function for the available methods

Attributes

LINEAR class-attribute instance-attribute
Python
LINEAR = auto()
NEAREST class-attribute instance-attribute
Python
NEAREST = auto()
CUBIC class-attribute instance-attribute
Python
CUBIC = auto()

TroposphericDelayEstimator

Tropospheric Delay Estimator from Vienna Mapping Function 3 data. The delay is due to the refractive index of the medium the signal is passing through.

The Troposphere is neutral and non-dispersive for frequencies up to 30 GHz, so the path through this medium is not depended on the carrier frequency for microwave signals, in contrast to the ionosphere.

The refractive index of the troposphere is a function of pressure, temperature and partial water vapor pressure. The total delay can be decomposed into a wet and dry (hydrostatic) component. - hydrostatic part comprises approximately 90% of the overall delay and is well suited to pressure driven modelling. Closely linked to topography, reflector height has to be taken into account. - wet component undergoes rapid changes due to the high spatiotemporal variability of water vapor.

The equation to be solved is the following:

\[ \Delta L (\epsilon) = \Delta L_h^Z \cdot mf_h(\epsilon) + \Delta L_w^Z \cdot mf_w(\epsilon) \]

where \(\Delta L(\epsilon)\) is the total delay time and it is composed by an hydrostatic component \(h\) and a wet component \(w\). \(mf(\epsilon)\) are the wet and hydrostatic mapping functions generated in this algorithm starting from the Vienna Mapping Function 3 data and the spherical harmonics Legendre polynomials.

Attributes

acquisition_time instance-attribute
Python
acquisition_time = acquisition_time
interp_method instance-attribute
Python
interp_method = interpolation_method
map_model instance-attribute
Python
map_model = map_model
map_type instance-attribute
Python
map_type = map_type
map_version instance-attribute
Python
map_version = map_version
map_grid_res instance-attribute
Python
map_grid_res = map_grid_res
tropospheric_map_folder instance-attribute
Python
tropospheric_map_folder = None

Methods:

__init__
Python
__init__(acquisition_time: PreciseDateTime, interpolation_method: TroposphericGridInterpolationMethod, map_folder: Path = None, map_model: TroposphericMapModel = TroposphericMapModel.GRID, map_grid_res: TroposphericGRIDResolution = TroposphericGRIDResolution.FINE, map_type: TroposphericMapType = TroposphericMapType.VMF3, map_version: TroposphericMapVersion = TroposphericMapVersion.OP) -> None

Tropospheric delay estimation using Vienna Mapping Function 3 (VMF3) data. Empirical ""b" and "c" coefficients, "a" coefficients determined epoch-wise (00, 06, 12, 18 UT) from ray traced-delays at 3° elevation and 8 equally spaced azimuth angles.

Only "OP" (operational) "GRID" (grid-wise) data are supported in this application.

Reference articles: Landskron, D., Böhm, J. VMF3/GPT3: refined discrete and empirical troposphere mapping functions. J Geod 92, 349-360 (2018). "https://doi.org/10.1007/s00190-017-1066-2"

U. Balss et al., "Survey protocol for geometric SAR sensor analysis", German Aerospace Center (DLR), Tech. Univ. Munich (TUM), Remote Sensing Lab. Univ. Zurich, Zürich, Switzerland, Tech. Rep. DLRFRM4SAR-TN-200, Apr. 2018.

Data source: VMF Data Server: "https://vmf.geo.tuwien.ac.at/"

Parameters:

Name Type Description Default
acquisition_time PreciseDateTime

acquisition time of the scene, a.k.a. the time at which estimate the delay

required
interpolation_method TroposphericGridInterpolationMethod

method for data grid interpolation

required
map_folder Path

path to the folder containing the map files, by default None

None
map_model TroposphericMapModel

map file model, by default TroposphericMapModel.GRID

GRID
map_grid_res TroposphericGRIDResolution

map grid resolution, by default TroposphericGRIDResolution.FINE

FINE
map_type TroposphericMapType

map data type, by default TroposphericMapType.VMF3

VMF3
map_version TroposphericMapVersion

map data version, by default TroposphericMapVersion.OP

OP
read_vmf3_files staticmethod
Python
read_vmf3_files(files: list[Path]) -> list[pd.DataFrame]

Reading VMF3 OP GRID troposphere data files. VMF3 files are provided as tabular textual data, with an header. Data are divided in the following columns: lat: latitude in deg, lon: longitude in deg, ah: "a" coefficient, hydrostatic (dry gases contribution) aw: "a" coefficient, wet (water vapor contribution) zhd: zenith hydrostatic delay in meters, zwd: zenith wet delay in meters

Parameters:

Name Type Description Default
files list[Path]

list of path to files

required

Returns:

Type Description
list[DataFrame]

list of pandas dataframe from loaded files

estimate_delay
Python
estimate_delay(point_targets_coords: ndarray, sat_xyz_coords: ndarray) -> tuple[np.ndarray, np.ndarray]

Estimate the tropospheric wet and hydrostatic delays from VMF3 data.

Correcting zenith hydrostatic and wet delays by taking into account the height due to topography dependence.

Other formulas used in this method:

Saastamoinen J. formula, hydrostatic delay

\[ \Delta L_h^Z(h) = \frac{0.0022768 \cdot P}{1-0.00266 \cdot \cos(2\phi) -0.28 \cdot 10^{-6} \cdot h_{ell}} \]

wet delay exponential empirical decay correction by height

\[ \Delta L_{w_s}^Z(h) = \Delta L_{w_g}^Z(h) \cdot e^{-\frac{h_s - h_g}{2000}} \]

Parameters:

Name Type Description Default
point_targets_coords ndarray

point targets XYZ coordinates as numpy array of shape Nx3

required
sat_xyz_coords ndarray

satellite XYZ coordinates at which calibration targets are seen as numpy array of shape Nx3

required

Returns:

Type Description
ndarray

array of estimated hydrostatic delay, one for each point target

ndarray

array of estimated wet delay, one for each point target

Raises:

Type Description
RuntimeError

files provided are not in VMF3 format

Functions:

generate_tropospheric_map_name_for_vmf_data

Python
generate_tropospheric_map_name_for_vmf_data(acq_time: PreciseDateTime, map_type: TroposphericMapType) -> tuple[list[str], list[PreciseDateTime]]

Generating the name of the 4 files needed to perform the tropospheric delay estimation for VMF data.

Data can be found at this location: https://vmf.geo.tuwien.ac.at/trop_products/

A note on file selection criterion: files are selected with respect to the map data type and the acquisition time tropospheric map files are recorded every 6 hours across the day, every day, so there are 4 files pertaining to each day H00, H06, H12, H18 4 files are needed to perform a proper interpolation of values and estimate at best the tropospheric delay the main file, the closest to the acquisition time hour (approximated by defect) the previous file (the one 6 hours before the main one) the two files after the main one (6 hours after and 12 hours after)

Parameters:

Name Type Description Default
acq_time PreciseDateTime

acquisition time at which the tropospheric delay must be estimated

required
map_type TroposphericMapType

type of tropospheric map data

required

Returns:

Type Description
list[str]

list of file names

list[PreciseDateTime]

list of file dates in PreciseDatetime form

compute_delay

Python
compute_delay(acq_time: PreciseDateTime, targets_xyz_coords: ndarray, sat_xyz_coords: ndarray, map_folder: Path | str | None = None, map_resolution: TroposphericGRIDResolution = TroposphericGRIDResolution.FINE, interp_method: TroposphericGridInterpolationMethod = TroposphericGridInterpolationMethod.CUBIC) -> tuple[np.ndarray, np.ndarray]

Compute signal delay due to tropospheric refractivity gradients.

Parameters:

Name Type Description Default
acq_time PreciseDateTime

acquisition time of the scene, a.k.a. the time at which estimate the delay

required
targets_xyz_coords ndarray

point targets XYZ coordinates as numpy array of shape Nx3

required
sat_xyz_coords ndarray

satellite XYZ coordinates at which calibration targets are seen as numpy array of shape Nx3

required
map_folder Path | str | None

path to the folder containing the map files, by default None

None
map_resolution TroposphericGRIDResolution

map grid resolution, by default TroposphericGRIDResolution.FINE

FINE
interp_method TroposphericGridInterpolationMethod

method for data grid interpolation, by default TroposphericGridInterpolationMethod.CUBIC

CUBIC

Returns:

Type Description
ndarray

array of estimated hydrostatic delay [one for each point target]

ndarray

array of estimated wet delay [one for each point target]