Drop a coordinate file, or click to browse
CSV/TXT (name,y,x,z — z optional), Excel, KML, or GPX
Name
Y
X
Z
Geoid N
Source
02 — Coordinate systems
→
Local or national grids: paste a Proj4 string under "Custom" — find one for any EPSG code at epsg.io. Column convention is Y, X, Z in that order — for UTM/most grids that's Northing, Easting; for the Hartebeesthoek94 / Cape Datum SA Survey Grids it's Westing, Southing, which is the native order surveyors already work in. Check this matches your file before converting.
Cape Datum accuracy note
The shift from Cape Datum to Hartebeesthoek94/WGS84 isn't uniform across South Africa — the historical network has real regional distortion. This app applies the single published 3-parameter shift (accurate to roughly 15m at best per the EPSG documentation), which is fine for general mapping but not for cadastral or precision engineering work. For that, NGI recommends dedicated point-based transformation rather than a blanket datum shift.
Converting updates your working data in place — From switches to match To automatically, so the next conversion builds on this result rather than the original file. To start over from scratch, re-upload.
2A — Cape ⇄ Hartebeesthoek94 (local fit)
A better alternative to the blanket 3-parameter shift under Cape Datum: finds nearby trig beacons with known coordinates in both datums, fits a local Helmert transform from them, and applies that instead. Shows up when From is Cape Datum / SA Survey Grid (Cape → Hart94), or when From is Hartebeesthoek94 and To is Cape Datum (Hart94 → Cape).
Shown on the map below: ● red = used in the current fit, ● dim = ticked off / excluded.
Name
dY (m)
dX (m)
From Y
From X
To Y
To X
Drop a saved parameters .txt file, or click to browse
Same format as this app's own "Save parameters" output
Current fit parameters
03 — Map & Export
04 — Nearest control points
Searches the SA trig/town survey beacon list for the beacons closest to your uploaded points. The search itself runs in Lat/Long, then the results are converted into whatever "To" system is set above and added to the results.
"Nearest to each point" runs a separate search per uploaded point — the same beacon can show up more than once if it's close to several of your points. For a lot of points × a high count this can take a few seconds.
05 — Elevations (Google)
Fetches ground elevation for every current point from Google's Elevation API, via your own Cloudflare Worker (so the API key stays server-side, never in this page). Overwrites Z for every point in the table — there's no per-point protection yet, so make sure that's what you want before running it on a table with manually-entered heights you care about.
06 — Geoid separation (SA2010)
Calculates the SA2010 geoid separation (N) for every point against the national geoid grid, using the same 3-nearest-neighbour plane-fit method as before. Shows N per point in the table above — apply it to Z once you're happy with it. Only works on your uploaded/manually-added points, not control points from the beacon search.
07 — COGO / Traverse
Bearing is a standard compass bearing (0° = North, 90° = East, clockwise), entered as DDD.MMSS — e.g. 45.3015 means 45° 30' 15". Only works on projected/grid systems (UTM, Web Mercator, RSA Lo-grids) — not Lat/Long, since plane trig doesn't apply directly to a geographic coordinate. RSA's south-oriented grids (Westing/Southing) are handled automatically, same as the rest of the app.
Chain legs forward from a known Start point using bearing/distance, same as Forward (Polar), until you're back near the known End point. Then calculate misclosure and apply a Bowditch (compass rule) adjustment, distributing the error proportionally along the traverse before saving the corrected intermediate points to the table.
Leg
Distance
Bearing
Y
X
Cum. dist
Point
Raw Y
Raw X
Adjusted Y
Adjusted X
08 — Area & Perimeter
Build a boundary by adding points in order (walking the boundary, in either direction) — same restriction as COGO: projected/grid systems only, not Lat/Long. Area uses the Shoelace formula; the closing segment (last point back to the first) is added automatically.
#
Name
Y
X
09 — Units
If your points were captured off an old survey diagram in something other than metres — Cape feet, English feet, chains, etc. — convert the whole table here first. This must be run before Convert (step 02), on the raw upload — if you've already converted, clear the table and start over with the right units applied first.