PVCoordinatesProvider in OneWayGNSSPhase

Dear Bryan,

I’m using OneWayGNSSPhase.java in my POD software. The GNSS satellites are available from the SP3 file. The constructor requires the remote satellite, which is PVCoordinatesProvider type. Now I have no idea how to create a PVCoordinatesProvider object. I know it is an interface and need to write a class to implement it. But I don’t understand the logic and, of course, how to do it.

I used the following code to have the remote satellite:

TimeStampedPVCoordinates remoteSat = new TimeStampedPVCoordinates(sp3Sat.getCoordinates().get(i).getDate(),

Could you please help me with this matter? I appreciate it.

Thank you and best regards

Hi Amir,

PVCoordinatesProvider is probably one of Orekit’s top level interfaces. It is implemented by a lot of important objects and other interfaces. That’s the reason why I choose to set a PVCoordinatesProvider in the measurement constructor. Indeed, you can use many different Orekit’s classes to define the GNSS satellite as a PVCoordinatesProvider: Propagator and Orbit are the two mains.

Using a SP3 file you can easily build a BoundedPropagator which is an implementation of Propagator and therefore an implementation of PVCoodinatesProvider. Here an example:

// Build the BoundedPropagator (implemantation of PVCoordinatesProvider)
final SP3Parser parser = new SP3Parser();
final SP3File file = parser.parse("your SP3 file name");
final SP3Ephemeris ephemeris = file.getSatellites().get("The ID of the remote satellite in the SP3 file");
final BoundedPropagator propagator = ephemeris.getPropagator();

// Build the one-way GNSS phase measurement
final OneWayGNSSPhase phase = new OneWayGNSSPhase(propagator, dtRemote, dateOfTheMeasurement, phaseValue, wavelength, sigma, weight, localSatellite);

Best regards,

Hi Bryan,

Thank you so much for your reply. It is informative, as usual. I will ask it again in the forum.

However, The logic of choosing a propagator here is still unclear to me. The main reason to choose a propagator for the GNSS orbit is to propagate it to the requested time. It is fine with the orbit; But in POD, the precise GNSS satellite clocks should not be interpolated or extrapolated, especially when we are using the IGS SP3 file with 15 min sample intervals. We generally use the CODE clocks with a 5-sec sample interval or other real-time 1Hz clocks.

Sorry to ask many questions. There is a misunderstanding for me, which may become clear when I have more experience with the Orekit package.

Best regards

Using a BoundedPropagator will perform the propagation by interpolation of the data in the SP3 file. The interpolation is performed by using the data close to the desired epoch (i.e. measurement epoch). It is not an orbit propagation in the sens of the theory of perturbations. No perturbation model must be configured. Here we are just interpolating precise data.

This is exactly the same approach as if you were building the PVCoordinatesProvider as in your example above. Except that the interpolation is done within the measurement and not before the creation of the measure. It is an easier approach.

The initialization of the orbit (PVCoordinatesProvider parameter) and the clock (dtRemote parameter) is completely independent. To initialize the clock you can either use the SP3 file providing the orbit or the CODE clock products. The only thing take you have to take into account is that the clock offset must corresponds to the measurement epoch.


Thank you for clarification. Now I understand how it works.

Best regards