I’ve been trying to compute the ionospheric delay between a specific GPS satellite and a receiver at a specific time. I’m doing this because I want to compare the uncorrected measured pseudorange values to other measurements.
I thought it’d be the easiest to start with delays computed from a IONEX file, so I’ve used this: GlobalIonosphereMapModel (OREKIT 13.1.2 API)
I’ve been using this IONEX file: EMR0OPSFIN_20252880000_01D_01H_GIM.INX (1.6 MB), which I’ve retrieved from here: Earthdata Login .
I load the IONEX file like this, and this runs w/o issues:
from java.io import File
from org.orekit.data import DataContext, DirectoryCrawler
from org.orekit.models.earth.ionosphere import GlobalIonosphereMapModel
# Point to the IONEX file
ionex_dir = File(r'C:\Users\MyName\Downloads\IONEX')
ionex_fname = 'EMR0OPSFIN_20252880000_01D_01H_GIM.INX'
manager = DataContext.getDefault().getDataProvidersManager()
manager.addProvider(DirectoryCrawler(ionex_dir))
# Create the ionosphere model
iono_model = GlobalIonosphereMapModel(ionex_fname)
I then take my receiver’s position, which I know from another source, and construct the needed TopocentricFrame to get this:
# receiver_pv comes from an OEM, which I don't show here for brevity.
epoch = AbsoluteDate(2025, 10, 15, 0, 0, 6.0, TimeScalesFactory.getUTC())
receiver_geo_point = earth.transform(receiver_pv.getPosition(),
j2000, epoch)
receiver_topo_frame = TopocentricFrame(earth, receiver_geo_point, 'RX')
These are initialised correctly:
In [4]: receiver_geo_point
Out[4]: <GeodeticPoint: {lat: -37.8356164374 deg, lon: -84.0953655701 deg, alt: 576,329.4309704629}>
In [5]: receiver_topo_frame
Out[5]: <TopocentricFrame: RX>
I then get the state of the GPS satellite, here PRN09, from an SP3 file:
In [6]: almanac # From SP3, which I've tested against a reference and it's read correctly.
Out[6]: <SP3Ephemeris: org.orekit.files.sp3.SP3Ephemeris@341814d3>
propagator = almanac.getPropagator()
prn09_pv = propagator.getPVCoordinates(epoch, j2000)
prn09_pt = EphemerisHandlers.EphemerisPoint.from_orekit_j2k_pv(prn09_pv)
prn09_state = SpacecraftState(prn09_pt.get_orekit_cartesian_orbit())
This gives a correct state:
In [7]: prn09_state
Out[7]: <SpacecraftState: SpacecraftState{orbit=Cartesian parameters: {P(3751761.187842153, -2.6251963800329804E7, -163328.23606034936), V(2184.7523157592145, 319.63584050937396, -3190.500677653312)}, attitude=org.orekit.attitudes.Attitude@4397ad89, mass=1000.0, additional={}, additionalDot={}}>
Computing the delay should now be easy:
frequency = 1575.42e6 # L1 frequency in Hz
delay_prn09 = iono_model.pathDelay(prn09_state, receiver_topo_frame,
epoch, frequency, None)
However, the delay I get is zero:
In [8]: delay_prn09
Out[8]: 0.0
How is this possible? What am I doing wrong? The elevation of PRN09 is pretty high, and the IONEX file time span also should be OK (I get the same error even further away from the start of the IONEX file epoch range):
In [12]: receiver_topo_frame.getElevation(prn09_state.getPVCoordinates().getPosition(), prn09_state.getFrame(), epoch)
Out[12]: 0.6177845133215872
I ‘ve noticed this sentence in the docs:
Note that this model
pathDelaymethods requires thetopocentric frameto lie on aOneAxisEllipsoidbody shape, because the single layer on which pierce point is computed must be an ellipsoidal shape at some altitude.
So, I’ve also tried it with a receiver located on the Earth surface, and that seems to work:
In [9]: land_geo_point = GeodeticPoint(35.7, 139.8, 0.0)
In [10]: land_topo_frame = TopocentricFrame(earth, land_geo_point , 'Tokyo')
In [11]: iono_model.pathDelay(prn09_state, land_topo_frame , epoch, frequency, None)
Out[11]: 3.9532514475323284 # Makes sense.
Is there a way to use the IONEX files for non-earthbound (i.e. spaceborne) GPS receivers? If not, what other options exist to compute the ionospheric delay?
I’ve seen the GRAPHIC method was implemented in Orekit, and I could try to use this (I only have single-frequency measurements): GRAPHICCombination (OREKIT 13.1.2 API) , but I can’t see any examples of how to use it. The documenation doesn’t even mention units that the methods take… Are there any examples of how to use this and similar measurement combinations? I’ve only found this, but it’s a bit sant in details: Ionosphere free LC - #7 by bcazabonne . And anyway, this doesn’t help me compute the ionospheric delay, but the corrected measurement, it seems.









