A toolkit for processing RINEX (Receiver Independent Exchange Format) GPS navigation and observation files to extract satellite positions and generate 3D orbital visualizations.
This project reads RINEX navigation files (.n files) containing GPS satellite ephemeris data.
Tech stacks:
- Install Anaconda on your PC
- Create the environment and install dependencies:
conda create -n rinex python=3.10 conda activate rinex pip install -r requirements.txt
- Run the script:
conda activate rinex python3 python/rinexnav.py --file=data/chur1610.19n --interval=15 --plot
-
Install Octave and required dependencies (see Dockerfile for full list)
-
Run the script:
cd matlab octave rinexnav_enhanced.m
Run Python processing:
docker-compose run --rm rinexpos \
python3 python/rinexnav.py \
--file=data/chur1610.19n --interval=15 --plotRun Octave/MATLAB code:
docker-compose run --rm rinexpos \
bash -c "cd matlab && octave rinexnav_enhanced.m"Run with explicit date:
docker-compose run --rm rinexpos \
python3 python/rinexnav.py \
--file=data/brdc0680.20n --date=20,3,8 --interval=100 --plotFor debugging (interactive container):
docker-compose up --build
# Then in another terminal:
docker-compose exec rinexpos bashPlot existing CSV data:
docker-compose run --rm rinexpos \
python3 python/plot_satellites.py \
results/chur1610_python.csv --max_epochs=1000Create animation:
docker-compose run --rm rinexpos \
python3 python/plot_satellites.py \
results/chur1610_python.csv --animation --max_epochs=1000Build and push:
# Login
echo $GITHUB_TOKEN | docker login --username suizer98
# Build, tag, and push
docker-compose build
docker tag rinexpos suizer98/rinexpos:latest
docker tag rinexpos-test suizer98/rinexpos-test:latest
docker push suizer98/rinexpos:latest
docker push suizer98/rinexpos-test:latestRun whole test suite:
docker-compose --profile test up --build test
docker-compose --profile test run testSee PythonTestKit for more details.
3D visualization of GPS satellite orbits showing the complex trajectories of satellites over time, with each satellite represented by a unique colored line. Both are showing the first 1000 epoch from the derieved data


