A general workflow for contributing high-precision GNSS-RTK tracks collected using non-WGS84 reference stations
Posted by Dzertanoj on 30 November 2025 in English.It’s relatively common for various national and regional GNSS correction networks to be referenced in a CRS other than WGS84 used in OpenStreetMap. The reason for this practice is that countries and regions use their own coordinate systems, most suitable for the territory they cover.
For example, the Oregon Real-Time GNSS Network (USA) uses NAD83 (2011) epoch 2010.00, according to their website.
It means that any RTK measurement taken while receiving NTRIP correction data from such a network will be referenced to the same CRS. That applies directly to the NMEA data output of the receiver, despite it normally being implied to be in WGS84. The majority of receivers available to amateurs are incapable of being configured to be aware of that. (The only sub-$1k receiver core I’m aware of that can “understand” the NTRIP CRS defined manually is Septentrio Mosaic.)
So, unless you perform a transformation from said CRS to WGS84, your tracks are going to be completely unsuitable for submission into the OSM public tracks database.
However, there’s a pretty straightforward way to perform the required transformation. Unfortunately, it’s “a little” longer than ideal for the exact same reason that NMEA data is implied to be in WGS84, so feeding a NMEA log directly may result in the reader ignoring the input CRS override.
The key tool for this is, coincidentally, JOSM. Here’s the workflow that functions just fine in my experience:
- Record the “raw” NMEA output log from your RTK-enabled receiver while performing the measurements.
- Load this log file into JOSM without simplification.
- Convert it into an editable layer using the context menu in the layer list.
- Optionally, “clean” the log (remove low-accuracy segments, etc.).
- Save the layer content into a GeoJSON file.
- Use a transformation tool of your choice (e.g.
ogr2ogr) to perform the transformation, set GeoJSON as an output format. (I’m not going to dive into exploring the choice of tools and/or transformation parameters here.) - Load the transformed GeoJSON back into JOSM.
- Convert it into a GPX layer.
- Export the resulting layer as a GPX file.
This entire hassle is meant to retain the additional information typically found in GPS track files. So a track point doesn’t look like a pair of coordinates, but like this:
<trkpt lat="45.35513644019843" lon="-122.60441061871428">
<ele>54.7008</ele>
<time>2025-11-29T21:21:56Z</time>
<fix>rtk</fix>
<sat>38</sat>
<course>47.9</course>
<hdop>0.4</hdop>
<vdop>0.7</vdop>
<pdop>0.8</pdop>
<ageofdgpsdata>1.0</ageofdgpsdata>
<dgpsid>412</dgpsid>
<stdhdev>0.01</stdhdev>
<stdvdev>0.022</stdvdev>
</trkpt>
The only known issue with this method is that the elevation values might not get transformed at all, depending on the transformation parameters and tools used.
For instance, if transformations are performed using ogr2ogr, for a 3D CRS, it expects a structure like this containing the Z-coordinate:
"geometry": {
"type": "Point",
"coordinates": [
-122.61229189617,
45.35316629967,
54.7008
]
}
It’s not going to read "gpx:ele": "54.7008" property generated by JOSM and use it.
The reverse seems to be true for JOSM when you import the transformed GeoJSON back.
Discussion
Comment from Javier_Jimenez on 1 December 2025 at 22:43
Hi. I’m the main contributor of ntrip-catalog.org , an open source/data repository to automatically find that information that is missing: the CRS of the NTRIP provider. Looks like you suffered that too. Please, help us to contact more providers to contribute to the repository with their data. Thanks!
PS next year it is going to be fun having in parallel NAD83(2011) and NATRF2022
Comment from Dzertanoj on 2 December 2025 at 07:27
@Javier_Jimenez, I’m not sure what you are talking about. I didn’t suffer from any lack of information about the CRS used by ORGN; it’s pretty clearly documented on their website, which I linked above.
Comment from StephaneP on 7 December 2025 at 12:17
So you think the osm data is using a WGS84 CRS? That not always the case. @StephaneP/diary/390290
Instead of converting the local CRS RTK trace to another one, don’t you think it would be better to add the CRS as a metadata ?
Comment from Javier_Jimenez on 7 December 2025 at 17:38
@StephaneP I mentioned your article in this talk in FOSS4G: https://www.youtube.com/watch?v=M2ck3cAGvhg , in the slide 35
Comment from Javier_Jimenez on 7 December 2025 at 17:47
@Dzertanoj you know the CRS of ORGN, and you have to introduce it manually to postprocess the data. Be sure that many users do not know about it, or they don’t care. Wouldn’t it be much better if the software were tagging automatically the coordinates? That is less error prone. That’s the purpose of https://ntrip-catalog.org As an open source/data project, it needs the contribution of the NTRIP providers. Do you know how they are going to do with NATRF2022?
Comment from Dzertanoj on 7 December 2025 at 21:22
@StephaneP I don’t “think” OSM is using WGS84; it’s a general assumption/historical practice (and also a huge architectural flaw, for the exact reason you mentioned) that isn’t enforced in any meaningful manner.
Until there is any sort of provision for handling the CRS metadata you suggested adding, it would be pointless to do so. Pointless, because instead of increasing practical certainty, it would do that only formally. To do it practically, it would require either (or both) OSM database to support on-the-fly transformation together with the correct handling of such metadata, or a solid awareness of OSM data users (including every OSM editing software) of data being stored in different CRSs. Without that, data stored in a CRS other than the assumed one would not get properly transformed/
Transforming data to match the general assumption, on the other hand, eliminates one layer of uncertainty and the currently inevitable data handling error. If in the future, provisions for real-time transformations, time-based CRSs, and multiple CRS data storage are created, I’d be happy to get back to this question. Until then, it’s (unfortunately) nothing but philosophical discussion. I’m not a core services developer, nor can I become one, so that’s not something I can influence directly.
Comment from Dzertanoj on 7 December 2025 at 21:56
@StephaneP,
To explain why I am convinced that it’s a general assumption, I’d like to quote this: osm.wiki/OSM_XML#Contents If anyone wants to argue about this matter or present an “alternative view” on that, they are welcome to start by listing any existing provisions for any other CRSs in the data storage, handling, and export mechanisms.