20190728 Ublox-Z9P, RINEX, NRCAN, EU, EUREF, and ETRS89

I realize this sounds is one of those incredibly annoying recipes in a cook-book, where the list of ingredients are so esoteric that one wonders why it is in the book in the first place.

However, the centimeter-level abilities of the Z9P will probably make this a FAQ pretty soon.


Collect a RINEX from your receiver. I used gpsd’s gpsrinex tool.

Create an account and log into NRCAN’s free PPP service

Set Processing to Static and ITRF, upload your file and wait for the result to arrive in your mailbox.

When it does, download the “full” data-set and extract it somewhere.

Find the following lines in the something.sum file:


POS   X IGS14 19:193:78465      3558659.1400      3558658.2813    -0.8587     0.0152  1.0000
POS   Y IGS14 19:193:78465       713470.0500       713470.3035     0.2535     0.0097  0.3477  1.0000
POS   Z IGS14 19:193:78465      5227272.8800      5227271.1274    -1.7526     0.0159  0.8679  0.4555  1.0000

Make sure the “SYST” column contains “IGS14”, if it does not, you probably had JavaScript disabled when you uploaded your RINEX file.

Next go to EUREF’s coordinate transformation tool

Select Input::Frame = IRTF2014

Select Output::Frame = ETRS89

Select Options::Change epoch format: Year/Month/Date

Set Input::Epoch to the date the observations were made

Set Output::Epoch to the same date

Clear the input field and add the coordinates from the ESTIMATED column in your NRCAN output:

myreceiver 3558658.2813 713470.3035 5227271.1274

If you are a numerical masochist, check the show intermediate steps button.

Click Transform

Now the output field shows you the XYZ coordinates in ETRS89:

myreceiver 3558658.86030  713469.88960 5227270.72530

To turn that into locals coordinate, you need to a height model of which each country has at least one.

If you live in Denmark you can use Valdemar:

Select GPS-transformation

Select Fra system = crt_erts89 and enter the XYZ numbers

Select Til system = utm32Hetrs89_h_dvr90 and press Beregn

The result is UTM32 coordinates with the Danish DVR90 sea-level model:

N              E             Normal Højde
6142511.109m   647954.503m   32.274m

You can use the uncertainty from NRCANs PDF file with those numbers.

If you look in the NRCAN something.sum file you can find a line like this:

PRJ  UTM   32 647955.001  6142511.755    0.999869       0.999857          N

And the difference is not trivial:

$ python3
>>> import math
>>> math.hypot(
... 6142511.109-6142511.755,
... 647954.503-647955.001
... )
0.8156715022946069              # Distance in meter
>>> 0.8156715022946069/30
0.0271890500764869              # 2.7cm/year on average since 1989
>>> 6142511.109-6142511.755
-0.6459999997168779             # Offset North-South
>>> 647954.503-647955.001
-0.4980000000214204             # Offset East-West

With a normal GPS receiver this would not matter, but with dual-band and RTK, it is about 10 times over the measurement uncertainty.

So what is ETRS89 and why can’t my GNSS receiver just output it ?

The coordinate system GPS and other GNSS systems work in, is defined by the IGS and it is a topic, several topics, all of its own.

The Tl;DR. part is that the slabs of bedrock continents sit on moves in this coordinate system, continental drift, you’ve heard about it, on the order of centimeters or decimeters per year, depending on which continent.

EU sits on a tectonic plate which moves about 2-3 cm north-east every year.

This means that if we measured coordinates, for instance corners of plots of land, and stuck them in a database, like the national cadastra, they would have to be revised every year, to keep up with any new measurements made.

EU decided that is not workable, and defined the ETRS89 coordinate system to be stuck to the tectonic plate.

This means that you do a conversion from IGS/GNSS to ETRS89 coordinates when you measure, so the coordinates you put in the databases will be good for decades and probably centuries.

The trouble is that the conversion from WGS84/GNSS to ETRS89 is not trivial, but more importantly, it is not static. The exact conversion depends not only on where but also when.

Swedens Lantmäteriet has a report about ETRS89 conversions in the Baltic Sea Area with some good plots which show the differences and a easy to follow explanation of the math.

The good news is that if you lock your base-station down with the ETRS89 coordinates found using the procedure above, your rover will pick that up and output ETRS89 coordinates too.

Since your base-station is not moving, once you have set the ETRS89 coordinates, it is good to go for at least a decade, unlike if you used WGS84 coordinates, in which case you would need to update it every year to keep precision in low centimeters.


Now you know precisely where I live.

If you find it too stressful to watch paint dry or grass grow, with a Ublox Z9P you can watch continental drift instead.