Short answer
NAD83 and WGS84 are not the same datum, even though they share essentially the same ellipsoid (GRS80 vs the WGS84 ellipsoid, which differ by fractions of a millimetre). NAD83 is anchored to the stable interior of the North American tectonic plate and moves with it; WGS84 is kept aligned with the global ITRF reference frame. Because North America drifts ~2-2.5 cm/year, the two frames — which agreed to within a metre in the late 1980s — now differ by roughly 1-2 metres in the contiguous US, more toward Alaska. Whether that matters depends entirely on your tolerance: invisible on a state-wide thematic map, unacceptable for cadastral, engineering, or precise GNSS work. The fix is to track the datum explicitly and apply a real transformation, not to assume the two are interchangeable.
Why they drift apart
A geographic datum is a realization of a reference frame: a set of station coordinates plus a model of how the Earth's surface relates to an ellipsoid.
- WGS84 is maintained by the US NGA and successive realizations (G730, G1150, G1674, G1762, G2139…) are aligned to the ITRF, an Earth-centred frame that does not co-rotate with any single plate. A point on the ground in Kansas therefore changes its WGS84 latitude/longitude slowly over time as the plate carries it.
- NAD83 (specifically NAD83(2011) and the older NAD83(CORS96), HARN, etc.) is defined so that the stable North American plate is, by construction, motionless. A monument in Kansas keeps essentially the same NAD83 coordinate decade to decade.
So the offset between them is not a fixed bias — it grows. This is also why "WGS84" alone is ambiguous: a 1990s WGS84 dataset and a current one differ. The forthcoming US NATRF2022 will replace NAD83 and be explicitly plate-fixed relative to ITRF, formalizing this relationship.
When the difference matters (and when it doesn't)
It matters when:
- You combine survey-grade GNSS (often delivered in ITRF/WGS84 or NAD83(2011) with an epoch) with cadastral or engineering layers. A 1-2 m shift can move a boundary across a fence line.
- You are stacking authoritative data — county parcels (State Plane NAD83) against a WGS84 GPS track — and computing intersections or distances.
- You work in Alaska or near plate boundaries, where the offset and its rate are larger.
It usually does not matter when:
- The output is a small-scale overview map where 1-2 m is far below symbol width and line weight.
- All your data already shares one datum and you never mix in raw WGS84/ITRF observations.
The danger is silent: most North American basemaps are Web Mercator (EPSG:3857, WGS84-based), so WGS84 data "snaps" visually to them while NAD83 data is shifted by a metre or two — easy to miss at zoom-out, costly at survey scale.
The right transformation
The mistake is letting software apply a null transformation (treating NAD83 ≈ WGS84 as identical). For sub-metre work, use a published datum transformation.
In PROJ / QGIS, when you reproject from NAD83 to WGS84, QGIS offers a list of available operations with their accuracy. Pick one with a stated accuracy rather than the "ballpark" identity. The transformation pipeline for NAD83(2011) to a current ITRF/WGS84 realization uses a time-dependent (14-parameter) Helmert transform — which is why the epoch of your data matters.
In PostGIS, reproject explicitly and be aware that a plain ST_Transform between 4269 (NAD83) and 4326 (WGS84) may apply only a null transform unless a more specific pipeline is requested:
-- Naive: may treat NAD83 and WGS84 as identical
SELECT ST_Transform(geom, 4326) FROM parcels;
-- Explicit pipeline (PostGIS 3.4+ / PROJ) for control
SELECT ST_TransformPipeline(geom,
'urn:ogc:def:coordinateOperation:EPSG::<op_code>', 4326) FROM parcels;
Check epsg.io for the specific EPSG codes: EPSG:4269 = NAD83 geographic, EPSG:4326 = WGS84 geographic, EPSG:6318 = NAD83(2011) geographic.
Worked example: choosing an analysis CRS
You receive parcel data in State Plane (NAD83) and a field GPS track logged in WGS84 lon/lat, and you must compute the area of overlap.
-
Identify the declared CRS of each layer before touching geometry. Confirm State Plane zone (e.g. EPSG:2229, California Zone 5, US survey feet) and that the GPS track is EPSG:4326.
-
Decide the analysis CRS by the measurement task and extent. For a county-scale area you want a projected CRS in metres or feet whose zone matches the AOI — the parcels' State Plane NAD83 zone, or UTM NAD83 (e.g. EPSG:26911 for UTM 11N) if the area spans State Plane zones.
-
Reproject both layers into that one CRS, applying a real datum transformation for the WGS84 track:
ogr2ogr -t_srs EPSG:26911 -s_srs EPSG:4326 track_utm.gpkg track.gpkg ogr2ogr -t_srs EPSG:26911 parcels_utm.gpkg parcels.gpkg -
Verify units. Confirm the CRS uses metres (or US survey feet — never mix the two; US survey foot vs international foot differs by ~2 ppm, which matters over State Plane distances).
-
Validate. Measure a known fence length or parcel dimension and compare to record; overlay against ortho imagery and confirm alignment within tolerance.
-
Document the source CRS, the analysis CRS, the transformation used (and its accuracy), and the data epoch in the project notes.
Common pitfalls and why they happen
- Assuming NAD83 == WGS84. True in the 1980s, false now — the plate has moved. Software defaults to a null transform because it is "good enough" for display, which trains people to ignore a real offset.
- Using Web Mercator (EPSG:3857) for measurements. It is a global pseudo-Mercator with severe area/distance distortion away from the equator; it exists for tile rendering, not analysis.
- Assigning a CRS to "move" a layer. Assigning (defining) a CRS only labels existing coordinates; it is correct only when the coordinates truly are in that CRS. To change positions you reproject. Conflating the two is the classic "my layer jumped" bug.
- Ignoring the US survey foot vs international foot. State Plane historically uses the US survey foot; picking the wrong foot quietly biases every coordinate.
- Dropping the epoch. With dynamic frames, a coordinate without a date is incomplete for precise work.
QA and validation
- Confirm every layer's declared CRS and datum (not just "GCS").
- Check the chosen transformation's stated accuracy; reject silent null transforms for sub-metre work.
- Overlay against high-accuracy reference imagery and a known control point.
- Verify horizontal and vertical units; elevation often hides a separate vertical datum (NAVD88 vs ellipsoidal).
- Record source CRS, analysis CRS, transformation, units, and epoch.
Bathyl perspective
We treat the coordinate chain as part of the deliverable, not an afterthought: source datum, the exact transformation applied (with its accuracy), the analysis CRS, units, and epoch all travel with the data. In North America the NAD83/WGS84 distinction is small enough to ignore on an overview map and large enough to break a boundary survey — so the only safe default is to make the datum explicit and let the tolerance of the task decide.
Related reading
- Geographic vs Projected CRS
- Vertical CRS for Elevation Data
- Why Your GIS Layers Do Not Line Up
- GIS and spatial analysis