NMEA 0183 for Surveyors: GGA, GST, and What Fix Quality Really Means

July 22, 2026 · Open Survey team

When a field app talks to a GNSS receiver over Bluetooth, the conversation is almost always NMEA 0183: a plain-text protocol from the 1980s, originally designed for marine instruments, that every receiver from a hobby module to a survey rover still speaks. Understanding a handful of its sentences tells you exactly what your app knows about your position, and just as importantly, what it might be hiding from you.

What NMEA 0183 is

NMEA 0183 is a stream of short ASCII lines, each called a sentence. Every sentence starts with a dollar sign, a talker ID ("GP" for GPS, "GN" for multi-constellation), and a sentence type, followed by comma-separated fields and a checksum. Because it is plain text over a serial link, it is trivially portable: any app that can read a Bluetooth serial stream can parse it. That universality is why a receiver-agnostic app can support hardware from Emlid to u-blox to Bad Elf with a single parser.

The sentences that matter for surveying

  • GGA — the core position sentence: time, latitude, longitude, fix quality, satellites used, HDOP, altitude, geoid separation, and correction age. This is the sentence NTRIP casters typically want the rover to send back, too.
  • GST — error statistics: the standard deviations of latitude, longitude, and altitude estimated by the receiver. This is where honest accuracy numbers come from.
  • RMC — the "recommended minimum": position, speed, course, date. Useful mainly because it carries the date, which GGA lacks.
  • GSA / GSV — satellite status: which satellites are used in the solution and DOP values (GSA), and which are in view with signal strengths (GSV).
  • VTG — course and speed over ground; marginal for static surveying but present in most streams.

GGA fix quality: the number that changes everything

Field 6 of GGA is a single digit that describes how the position was computed. The values a surveyor cares about:

ValueMeaningTypical accuracy
0Invalid, no fix
1GPS single (autonomous)Meters
2DGPS / differentialSub-meter class
4RTK fixed (integer ambiguities resolved)Centimeters
5RTK float (ambiguities not yet fixed)Decimeters, variable

The distinction between 4 and 5 is the whole game in RTK work. A float solution can wander by tens of centimeters while looking stable on screen; a fixed solution has resolved the carrier-phase ambiguities to integers and is genuinely centimeter-grade. A field app should display this state prominently and refuse (or at least loudly warn) when you try to store a control shot on float. For the background on why, see what RTK GNSS surveying is.

A GGA sentence, field by field

$GNGGA,172814.00,3723.4658910,N,12202.2698750,W,4,12,0.9,15.234,M,-32.10,M,1.2,0532*7A

$GNGGA        Talker GN (multi-constellation) + sentence type GGA
172814.00     UTC time 17:28:14.00
3723.4658910  Latitude 37° 23.4658910'  (degrees + decimal minutes)
N             North
12202.2698750 Longitude 122° 02.2698750'
W             West
4             Fix quality: 4 = RTK fixed
12            Satellites used in solution
0.9           HDOP
15.234,M      Altitude above mean sea level, meters
-32.10,M      Geoid separation (ellipsoid minus geoid), meters
1.2           Age of differential corrections, seconds
0532          Reference (base) station ID
*7A           Checksum

Two details are worth flagging. Latitude and longitude are in degrees plus decimal minutes, not decimal degrees, a formatting quirk that has produced many subtly wrong conversions. And the altitude is orthometric (geoid-referenced) with the geoid separation given separately; to recover the ellipsoidal height, add the separation back. Which geoid the receiver used is not stated in the sentence, one of several reasons bare coordinate files need metadata written down.

GST: why an app that ignores it cannot show honest RMS

GGA tells you the kind of fix; it does not tell you how good this particular position is. HDOP is only a geometry factor, not an error estimate. The receiver's actual error estimates live in GST, which reports the standard deviations of latitude, longitude, and altitude (and the parameters of the error ellipse) computed from the solution itself.

This matters because some apps show an "accuracy" number derived by multiplying HDOP by an assumed constant. That is a guess wearing a precision costume. An app that parses GST can display the receiver's own horizontal and vertical RMS per epoch, and can store those values with every shot. An app that ignores GST literally has no honest basis for the accuracy figure it displays. When evaluating field software (there are several options for Reach owners), whether it consumes GST is a revealing technical question.

Latency and update rate

NMEA is a live stream, typically at 1 Hz by default, with survey receivers configurable to 5 or 10 Hz. Two timing effects matter in practice:

  • Position latency. The position you see was computed slightly in the past: solution time plus serial and Bluetooth transmission delay. Standing still for a shot, this is irrelevant. Walking topo at a brisk pace with a 1 Hz stream, each stored point can trail your true position by a step. Slowing down at the moment of storage, or raising the update rate, addresses it.
  • Correction age. GGA's differential-age field reports how stale the RTK corrections are. Ages of a few seconds are normal; a climbing age means your NTRIP link is failing, and the solution will degrade from fixed to float shortly after. Watching this field is an early-warning system for connection problems.

Log everything, per shot

The whole NMEA stream is cheap text. There is no reason a field app should keep only latitude, longitude, and height and discard the rest. For defensible work, every stored observation should carry: fix type, horizontal and vertical RMS (from GST), PDOP and satellite count, correction age and source, receiver identity, and antenna height. Months later, when a point disagrees with record data, that metadata is the difference between diagnosing the shot ("float fix, 8-second correction age, next time re-observe") and shrugging. It is also the raw material for judging residuals in a site calibration.

This is the standard Open Survey is being built around: the app (currently in development) plans to record fix type, H/V RMS, PDOP, satellite count, correction age, receiver identity, and antenna height with every observation, from any Bluetooth NMEA receiver.

Open Survey is in development

We're building a free, open-source surveying app for iPhone and iPad — built-in GPS to centimeter RTK, with a browser workspace and no paywalled linework. Learn more and follow along →