Ionosphere free LC

Hi @bcazabonne,

I have used OneWayGNSSPhase or OneWayGNSSRange and have GNSS measurement of a LEO receiver. I need to combine them by using the ionosphere-free combination. Can you please give an example of how to use IonosphereFreeCombination and combine two, e.g., OneWayGNSSRange measurements? I appreciate it.

Best regards

Hi @AmirAllahvirdi,

The combination of measurements does not depends on the nature of the measurement (Range, Phase, OneWayRange, OneWayPhase, etc.). You must use ObservationData objects to perform the combination of measurements. Each observation in a Rinex file corresponds to an ObservationData when parsing the Rinex file in Orekit. Theforefore, ObservationData are used to build the measurements and they can be combined to build combined measurements.

Please note that the combination of measurements can be performed only if:

  1. You have different observations at different frequencies for a same epoch (e.g. C1 and C2).
  2. And the signal code of the observations is the same. For instance, an iono-free combination cannot be performed between C1 and P2 observations.

If I assume a GPS satellite as emitter of the observations, something like that could answer your question:

    // Satellite system
    final SatelliteSystem system = SatelliteSystem.GPS;

    // Initialize the ionosphere-free combination
    final IonosphereFreeCombination ifComb = MeasurementCombinationFactory.getIonosphereFreeCombination(system);

    // Time scale
    final TimeScale utc = TimeScalesFactory.getUTC();

    // LEO satellite
    final ObservableSatellite receiver = new ObservableSatellite(0);

    // Initialize two random observations
    final AbsoluteDate epoch = new AbsoluteDate("2007-09-27T00:00:00.000", utc);
    final ObservationData obs1 = new ObservationData(ObservationType.C1, 21579415.208, 3, 7);
    final ObservationData obs2 = new ObservationData(ObservationType.C2, 21579420.972, 3, 7);

    // Perform the combination of measurements
    final CombinedObservationData combined = ifComb.combine(obs1, obs2);

    // Build a "ionosphere-free" OneWayGNSSRange measurement
    final OneWayGNSSRange measurement = new OneWayGNSSRange(remote, dtRemote,
                                                            epoch, combined.getValue(),
                                                            1.0, 1.0, receiver);

Here you have a ionosphere-free measurement. Therefore, you don’t need to add a ionosphere measurement modifier to the measurement.

It is also possible to perform the combination of measurements directly on an ObservationDataSet (i.e. list of ObservationData at a same epoch and for a single satellite). The advantage of doing that is that the different verifications (different frequency, same signal code, etc.) is done internally by the algorithm of combination of measurements. At the end, you have a CombinedObservationDataSet containing all the possible ionosphere-free combination of measurements for the given data set. The getMeasurementType() method of CombinedObservationData allow you to know the nature of the combined measurement (Range, Phase, etc.). Here a small example:

    // Read the Rinex file
    final RinexLoader loader = new RinexLoader(...);

    // Loop on observation data set
    for (final ObservationDataSet observationDataSet : loader.getObservationDataSets()) {

        // Initialise a ionosphere-free combination of measurements
        final IonosphereFreeCombination ifComb = MeasurementCombinationFactory.getIonosphereFreeCombination(system);

        final CombinedObservationDataSet combinedDataSet = ifComb.combine(observationDataSet);

        for (final CombinedObservationData cod : combinedDataSet.getObservationData()) {

            // If Range
            if (cod.getMeasurementType() == MeasurementType.PSEUDO_RANGE) {
                // Initialize a OneWayGNSSRange
            } else if (cod.getMeasurementType() == MeasurementType.CARRIER_PHASE) {
                // Initialize a OneWayGNSSPhase


Best regards,

1 Like

Thank you @bcazabonne