Field Guide

Coordinate Systems, EPSG Codes, and the Datum Trap

Drone deliverables fail in the GIS handoff more often than they fail in the field. Almost every one of those failures is a coordinate reference system declared wrong, missing, or silently mismatched. Here is what a CRS actually is, why each piece matters, and the mistakes that cost projects.

Why it matters

An EPSG code is a contract between every tool that touches your data

The rover, the drone, the processing engine, the GIS the client opens, and the .prj on the shapefile all have to agree. When they disagree the data still loads — it just lands somewhere wrong. The most expensive errors in survey-grade drone work hide inside that silence.

Wrong zone, wrong county

Pick state plane East when the job is in the Central zone and your ortho lands ~110 miles west of where it belongs. The data still "loads". The map is just wrong.

Right zone, wrong units

Declare metres when the rover wrote US survey feet and every coordinate scales by 3.281. The pattern looks right at first glance until measurements come back wildly off.

Right everything except realization

Plain NAD83 vs NAD83(2011) is a 5–15 cm shift across the US Southwest. Inside the project residuals look fine. Against external control, everything is biased the same direction.

Anatomy

The five things a CRS pins down

A coordinate reference system is not one thing — it is a stack of decisions. An EPSG code is just shorthand for a specific combination of all five.

Projection

The math that flattens the round Earth onto a flat grid. Transverse Mercator, Lambert Conformal Conic, UTM. Every projection trades off distortion in shape, area, distance, or direction. State plane zones are tuned to keep distortion under ~1:10,000 inside their footprint and grow rapidly outside it.

Ellipsoid

The mathematical shape used to model the Earth. WGS84 and GRS80 (the basis for NAD83) are the two you will encounter. They differ by less than a metre globally and are functionally interchangeable for drone work — but the datum that sits on top of the ellipsoid is where the real divergence lives.

Datum

How that ellipsoid is anchored to the actual Earth — which point is "the origin", how it is oriented. WGS84 is anchored to the Earth's centre of mass; NAD83 is anchored to the North American plate so the grid moves with the continent. The two diverge by roughly 1–2 metres in CONUS today.

Realization

A specific snapshot of the datum, computed from a finite set of measured ground stations. NAD83 (1986), NAD83(HARN) (1990s), and NAD83(2011) are all "NAD83" but place the same physical point in slightly different grid coordinates — typically 5–15 cm apart in the US Southwest.

Units

Metres, US survey feet, or international feet. US survey feet and international feet differ by 2 ppm — about 6 mm per kilometre — so on a 500-acre survey the wrong foot definition shifts everything by roughly an inch. State plane zones are usually published in both metres and ftUS as separate EPSG codes.

Worked example

Reading a real GCP file

A New Mexico job, fresh off the rover. Here is how to identify the CRS in under a minute — and the missteps that would still make it wrong.

Sample row from a Topcon Magnet export
Point Name: GCP7
Northing : 1,716,429.23
Easting  : 1,697,734.09
Elevation: 6,519.43
Latitude : 35°43'02.37"N
Longitude: 106°03'24.86"W
  1. 1Magnitudes: Northing 1.71M, Easting 1.69M. Numbers in the millions almost always mean US survey feet — metres state plane sits in the hundreds of thousands. Elevation 6,519 confirms it (Albuquerque sits at ~5,300 ft, ~1,600 m).
  2. 2Lat/lon → zone: 35.7°N, -106.05°W puts the job in central New Mexico — Sandoval County, north of Albuquerque. That is NM Central zone.
  3. 3False-easting fingerprint: NM Central ftUS uses false easting 500,000 ftUS at central meridian -106.25°. The job is at -106.05°, about 60,000 ft east of the meridian. 500,000 + 60,000 ≈ 560,000... but the file shows 1,697,734. Wait, that does not match.
  4. 4Reconciling: The rover used a project-local origin, common in Topcon/Trimble jobs. The pattern still scans as state plane ftUS — false-easting math holds when the project is referenced to a base station with its own offset. The CRS is still EPSG:2258 — NAD83 / NM State Plane Central (ftUS). The job sheet would confirm whether the rover was on plain NAD83 or NAD83(2011).
  5. 5What would go wrong: Picking EPSG:2257 (NM East) by mistake — same family, same units, same ftUS fingerprint, but a different central meridian. The job would land in eastern NM, near Roswell, ~110 miles off. Or declaring EPSG:32113 (NM Central metres) and shrinking the whole site by 3.281×.
The hidden trap

NAD83 vs NAD83(HARN) vs NAD83(2011)

Three EPSG codes can declare the same projection, the same units, the same zone — and still place the same point in three slightly different spots. That difference will not show up in your residuals. It will show up against external control.

RealizationEraNM Central ftUSUse it when
NAD83 (1986)OriginalEPSG:2258The rover or job sheet does not specify a realization. Default for most US drone work today.
NAD83(HARN)1990sEPSG:2903Surveyor explicitly tells you the rover was set to HARN. Rare on modern jobs.
NAD83(2011)CurrentEPSG:6531High-accuracy work where the rover was explicitly configured for NAD83(2011) and the deliverable contract requires it.

The shift is real but invisible inside your project.

Inside the bounds of a 50-acre survey, choosing the wrong realization shifts every point by the same 5–15 cm in the same direction. GCP residuals look perfect. Photo alignment looks perfect. The error only surfaces when the deliverable is overlaid against county GIS, NAIP imagery, or a separate surveyor's control. If your client uses any of those, this matters. See realization mismatch in the errors section below.

Errors & missteps

The nine ways a CRS goes wrong

Every item below has a symptom you can spot, a root cause, and a fix. These are the patterns we see most often when survey-grade drone deliverables fail QA.

#01Critical

Picking the wrong state plane zone

Symptom
Your orthomosaic loads tens or hundreds of miles from where the project actually is. QGIS shows the points in the right state but in the wrong county. Distances measured on the map are wrong by a percent or more.
Root cause
State plane is sliced into multiple zones per state — New Mexico has East (EPSG:2257), Central (2258), and West (2259). Each zone has a different central meridian, so coordinates from one zone fed into another's projection produce a real-world location that drifts west or east as you move away from the central meridian. A coordinate ~110 miles off-meridian creates a ~110-mile location error.
Fix
Match the EPSG code to the county the job is in. Bernalillo, Santa Fe, Sandoval, Los Alamos, Doña Ana → Central (2258). Chaves, Eddy, Lea, Curry, Quay → East (2257). Hidalgo, Grant, Catron → West (2259). When in doubt, check what the surveyor wrote in the rover job notes — never guess from the EPSG number alone.
#02Critical

Feet vs metres mismatch

Symptom
Coordinates are in the millions of "metres" or in the hundreds of thousands of "feet". The ortho lands somewhere in the right state but at roughly 3.28× the wrong easting/northing. Or it lands at 1/3.28 the right values.
Root cause
Many state plane zones publish a metre-units variant and a US-survey-feet variant under different EPSG codes. NM Central is EPSG:32113 (metres) or EPSG:2258 (ftUS). Declaring metres while the rover wrote ftUS scales every coordinate by ~3.281.
Fix
Look at the magnitudes. NM Central in metres lives around easting 350,000–700,000 and northing 300,000–700,000. NM Central in ftUS lives around easting 1.4M–1.8M and northing 1.0M–1.9M. If the values look like millions, you almost certainly want the ftUS code.
#03Medium

US survey feet vs international feet

Symptom
Everything looks right but a known control monument is consistently off by a few centimetres at the edge of the project, growing with distance from the false-easting origin.
Root cause
US survey foot = 1200/3937 m exactly. International foot = 0.3048 m exactly. The two differ by 2 ppm. On a survey 500,000 ftUS east of the central meridian, that is a real shift of about 1 metre.
Fix
In the United States, state plane is almost always US survey feet (ftUS) — the EPSG codes that end up in -ft, like 2257/2258/2229, are ftUS. Stick with ftUS unless your surveyor or contract specifies international feet.
#04High

Datum realization mismatch (NAD83 vs HARN vs 2011)

Symptom
GCPs check residuals look great inside the project (5 cm), but when you overlay against county GIS, USGS quads, or NAIP imagery, everything is shifted by 5–15 cm in a consistent direction.
Root cause
The rover delivered coordinates in NAD83(2011) but the GCP file or processing pipeline declared plain NAD83 (the 1986 realization), or vice versa. Same projection, same ellipsoid, but the realization timestamp moves all anchor stations by centimetres. HARN is the 1990s realization, 2011 is the current one — neither is "NAD83 (1986)".
Fix
Ask the surveyor or read the rover's coordinate system settings. Modern rovers (Emlid, Trimble, Topcon, Leica) typically default to NAD83(2011) when configured for the US, or stay on WGS84/ITRF. HARN is rarely a default — if the job sheet does not say HARN, it is not HARN. Use plain NAD83 (e.g. EPSG:2258) unless told otherwise.
#05High

Shapefile or GeoTIFF without a .prj or with a wrong .prj

Symptom
You hand off a deliverable, the client opens it, and it lands at (0, 0) on the equator, or it loads but every QA measurement is off by an exact factor.
Root cause
A shapefile is not just the .shp — it is a sidecar of files including the .prj that declares the CRS. If the .prj is missing, GIS software guesses (badly). If the .prj is there but says EPSG:2257 when you actually processed in 2258, every consumer will silently reproject onto the wrong meridian.
Fix
Verify the .prj on every export. Open it in a text editor — it should match the EPSG you processed in. For GeoTIFF, run `gdalinfo` and confirm the AUTHORITY line. Build the EPSG check into your QA checklist before any delivery.
#06High

Rover datum disagrees with drone EXIF datum

Symptom
GCP residuals are unexpectedly high (10–30 cm) even though both the rover and drone report centimetre accuracy individually. Residuals are systematic — most points pull the same direction.
Root cause
The drone's onboard GPS writes WGS84 coordinates to image EXIF. The rover may be recording in NAD83(2011). In CONUS, WGS84 and NAD83(2011) currently differ by roughly 1–2 metres horizontally and that gap grows ~2 cm/year as the North American plate moves. Treating both as identical introduces the full plate-motion offset into your processing.
Fix
Decide on one CRS for the entire job. If you have RTK GCPs, they are the truth — process the GCPs in NAD83(2011) State Plane, let ODM/Pix4D align the photos to those control points, and accept that the EXIF GPS drifts a metre. The GCPs override it.
#07High

Ellipsoidal vs orthometric height confusion

Symptom
Horizontal positions are perfect but elevations are off by 20–30 metres in a uniform direction across the entire site. Volumes calculated against the DEM are wildly wrong.
Root cause
There are two kinds of "height": ellipsoidal (height above the GRS80/WGS84 ellipsoid, what raw GPS gives you) and orthometric (height above mean sea level / a geoid model like NAVD88 with GEOID18). They differ by the geoid undulation — about -22 m in northern New Mexico. Mixing them on the same job stacks that geoid offset on every elevation.
Fix
Pick one and label it. Most US survey deliverables expect orthometric (NAVD88, geoid model GEOID18). The rover usually applies the geoid model automatically if configured; the drone's EXIF altitude is ellipsoidal. If you are processing only photos with no GCPs, your DEM elevations will be ellipsoidal and need a geoid correction before anyone uses them for volumes or contours.
#08Medium

GCP CSV with no EPSG header

Symptom
You import a GCP file from a surveyor and the import auto-detects an EPSG, but you cannot tell from the file itself whether the auto-detect is right.
Root cause
Most rover CSV exports include only Northing/Easting/Elevation and Lat/Lon, with no metadata declaring the CRS. Software has to guess from coordinate magnitudes — which works for picking the right zone family but cannot distinguish realizations (NAD83 vs HARN vs 2011) at all.
Fix
Always add an EPSG header to GCP files before processing — ODM's gcp_list.txt format puts EPSG:<code> on the first line. If you cannot get that from the surveyor, demand a job sheet that names the rover CRS. Auto-detection is a starting hint, not a final answer.
#09Medium

Trusting raw coordinates without sanity-checking the false easting

Symptom
The CRS picker offers many similar EPSG codes and you cannot tell which is right.
Root cause
Every state plane zone has a fingerprint built into its false easting and northing. NM Central ftUS = false easting 500,000 ftUS at lon -106.25°. AZ Central ftUS = false easting 700,000 ftUS at lon -111.92°. CO Central ftUS = false easting 3,000,000 ftUS. If you know the rough easting of your job and the longitude, you can read the zone off the numbers.
Fix
Cross-check three things: (1) the magnitude of easting/northing matches the false-easting/northing pattern of the zone; (2) the latitude/longitude in the file falls inside the zone's county footprint; (3) the elevation magnitude (feet vs metres) matches the units of the projected coords. All three must agree before you commit to an EPSG.
In mapplot

How the GCP importer auto-detects (and where it cannot)

mapplot reads coordinate magnitudes and lat/lon and offers a best-guess EPSG. Useful as a starting hint — never as a final answer.

What auto-detect catches

  • The right zone family from coordinate magnitudes (NM Central vs East vs West, AZ Central, TX zones, CO zones)
  • Feet vs metres from the order of magnitude
  • Geographic (lat/lon) vs projected coordinates
  • UTM zone from rough longitude

What auto-detect cannot catch

  • Datum realization — NAD83 vs NAD83(HARN) vs NAD83(2011) all look identical numerically
  • US survey feet vs international feet — the 2 ppm difference is below detection
  • Project-local grids that look like state plane but are tied to a custom base
  • Whether the rover applied a geoid model to elevation

Always confirm with the rover job sheet. A two-minute conversation with the surveyor about "what CRS is the rover set to and is the elevation orthometric" prevents every error in the section above.

Glossary

Quick reference

EPSG code
A numeric ID (like 2258) in the global registry that uniquely names a CRS — projection + datum + realization + units bundled together.
CRS
Coordinate Reference System. The full package needed to put a coordinate on the actual Earth.
Projection
The mathematical transform from latitude/longitude on a curved Earth to a flat grid (eastings/northings).
Datum
A model of the Earth's shape and how it is anchored to physical reality. NAD83 is anchored to the North American plate; WGS84 is anchored to Earth's centre of mass.
Realization
A specific snapshot of a datum, computed from real measurements at real stations. NAD83(2011) is the current US realization; HARN was a 1990s update.
Ellipsoidal height
Height above the mathematical ellipsoid. What raw GPS gives you. Differs from "height above sea level" by the geoid undulation (~22 m in NM).
Orthometric height
Height above a geoid model (like NAVD88 + GEOID18). What surveyors usually mean by "elevation". This is what civil engineering wants.
False easting / northing
A constant added to projected coordinates so they stay positive within the zone. Reading the false easting tells you which zone you are in.
ftUS
US survey foot, defined as 1200/3937 m exactly. Differs from the international foot (0.3048 m) by 2 ppm.
.prj sidecar
The text file beside a shapefile that declares its CRS. Missing or wrong .prj is the most common GIS handoff failure.

Process with the right CRS from the start

mapplot's GCP importer auto-detects state plane and UTM zones, surfaces unit warnings, and registers proj4 definitions for every EPSG it offers — so the code you pick is the projection that runs.

Start Free