WPT waypoint files
3 dialects, 1 extension We-Fly

Interactive specification

One extension, three different files.

.wpt is not a format — it is three unrelated plain-text formats that happen to share a file extension. OziExplorer writes CSV, CompeGPS writes space-separated records with a degree sign, FS and GpsDump write fixed-column DMS. You cannot tell which you have from the name, so this page shows you how to tell from the bytes.

Plain text Sniffed, not declared WGS84 Elevation in feet or metres
01 Overview

Three formats, one extension

A waypoint file is the simplest thing in free flight: a list of named places with coordinates and an elevation. It is also the least standardised. Three lineages produce files called .wpt, and none of them declares which it is in a way you can rely on:

DialectWritten byShapeCoordinates
OziExplorerOziExplorer, many older GPS toolsComma-separated, 18 columnsSigned decimal degrees
CompeGPS geographicCompeGPS, TwonavSpace-separated, one record per lineDecimal degrees + hemisphere letter
FS $FormatGEOFS, GpsDump, comp organisersFixed-ish columnsDegrees / minutes / seconds

A fourth thing you will meet is $FormatUTM — the same FS file with UTM grid coordinates instead of latitude and longitude. It cannot be read without knowing the grid zone, and it is not worth guessing: reject it and ask for a GEO export.

Also called .utm. The CompeGPS dialect is sometimes saved with a .utm extension even when its coordinates are geographic — an old naming habit, not a statement about the projection. Sniff the content; never trust either extension.
02 Telling them apart

How to identify a .wpt

The check that works, in order — first match wins:

  • Starts with $FormatGEOFS / GpsDump.
  • Starts with $Format anything else (i.e. $FormatUTM) → reject, ask for a GEO export.
  • Starts with OziExplorerOziExplorer.
  • Has a G  WGS 84 datum line, or any W <code> A <lat> <lon> record → CompeGPS.
  • Otherwise: contains a comma → OziExplorer, else CompeGPS. Headerless Ozi exports are common; commas are the tell.
Try it · paste any waypoint line or file
Sniff before you split. Running an Ozi CSV split over a CompeGPS file does not fail — it produces one field, silently yields no waypoints, and looks like an empty file. Every dialect degrades quietly into "no waypoints found" when parsed as the wrong one.
03 OziExplorer

The comma-separated dialect

waypoints.wpt — OziExplorer
OziExplorer Waypoint File Version 1.1
WGS 84
Reserved 2
Reserved 3
1,B02 Aujour,44.285000,5.740000,,0,1,3,0,65535,Aujour ridge,0,0,0,6017,6,0,17
2,B15 Hongrie,44.362000,5.715000,,0,1,3,0,65535,,0,0,0,-777,6,0,17

Four header lines, then one row per waypoint with 18 comma-separated columns. Most of them are display settings for OziExplorer's own map view and carry nothing you want.

ColumnFieldNotes
1Index1-based row number.
2NameCommas are impossible here — the format has no quoting. Writers replace them with spaces.
3LatitudeSigned decimal degrees, WGS84.
4LongitudeSigned decimal degrees, WGS84.
5DateOzi serial date. Usually empty.
6–10Symbol, status, display format, coloursPresentation only.
11DescriptionFree text. This is the second of the two text slots — see §06.
12–14Pointer direction, Garmin format, proximityPresentation only.
15Altitude, FEET-777 means unknown. Feet, not metres — the only dialect here that is not metric.
16–18Font size, font style, symbol sizePresentation only.
Two traps in one column. Column 15 is in feet, and -777 is a sentinel, not an altitude. Read it as metres and every waypoint gains 3.28×; take -777 literally and you get waypoints 237 m below sea level.

Rows are CRLF-terminated in files written by Ozi itself. Be tolerant on input, and emit CRLF on output for the benefit of the older tools that still read these.

04 CompeGPS

The G/U/W dialect

waypoints.wpt — CompeGPS geographic
G  WGS 84
U  1
W  Z20133 A 44.4102700000ºN 6.3516500000ºE 27-MAR-62 00:00:00 1329.000000 Chairlift
W  B02 A 44.2850000000ºN 5.7400000000ºE 01-JAN-70 00:00:00 1834.000000 Aujour ridge
LineMeaning
GDatum. WGS 84 in anything modern.
UUnits / coordinate mode. 1 = geographic degrees.
WOne waypoint.
*, #Comment lines.

Inside a W record

TokenIsNotes
1CodeShort identifier. No spaces — writers substitute underscores.
2ADatum marker. Skip it.
3Latitude44.4102700000ºN — magnitude then hemisphere letter.
4Longitude6.3516500000ºE.
5, 6Date, timeFile-transfer artefacts. Ignore them.
7ElevationMetres. -777 and -9999 are unknown-altitude sentinels.
8+Full nameEverything remaining, spaces included.
The degree sign will be mangled. º is U+00BA, written by tools that assume Windows-1252. After a bad charset round trip it arrives as º, ?, or a replacement character. Match the coordinate as "digits, then up to two characters of junk, then [NSEW]" rather than requiring the symbol — files that are otherwise perfectly readable arrive this way constantly.

Latitude can also appear as colon-separated DMS (44:24:36.97N). Accept both: split on :, and treat a single component as plain degrees.

05 $FormatGEO

The FS / GpsDump dialect

waypoints.wpt — $FormatGEO
$FormatGEO
Z20133    N 44 24 36.97    E 06 21 05.94    1329  Chairlift
B02       N 44 17 06.00    E 05 44 24.00    1834  Aujour ridge

This is the format competition organisers hand out, because it is what GpsDump writes and what every comp instrument eats. One header line, then one record per waypoint:

FieldFormatNotes
CodetokenPadded to 10 characters by convention. No spaces.
LatitudeN|S DD MM SS.ssHemisphere first, then three space-separated components.
LongitudeE|W DDD MM SS.ssSame shape.
ElevationintegerMetres.
Namefree textEverything after the elevation, spaces included. Optional.
The columns are a convention, not a contract. Files look fixed-width because writers pad them, but the padding varies. Parse on whitespace runs with an anchored pattern; slicing by character offset breaks the first time a code runs to ten characters or an elevation reaches five digits.
Try it · DMS ↔ decimal
06 Codes & names

Two slots, three meanings

Competition waypoints carry a short code (B61130, D01188, A03091) next to a human-readable name. Instruments and task boards key on the code; pilots read the name. Both must survive a round trip.

CompeGPS and $FormatGEO have a natural home for each: the identifier column takes the code, the trailing free text takes the name. OziExplorer does not — like GPX and KML, it has only two text slots, name and description. The convention comp tools settled on:

SlotCarries
Name / identifierThe code
Description / commentThe full name

Recovering the split on import

Promote the primary slot to a code when it looks like one — and the test has to be tight enough not to eat ordinary short names. A competition code is 2–8 alphanumeric characters containing at least one digit:

the code test
/^(?=[A-Za-z0-9]*\d)[A-Za-z0-9]{2,8}$/

The digit requirement is what makes it safe. Without it, Goal, Home and Top all become codes and their real names vanish into a field nothing displays.

Try it · does this look like a code?

The promotion applies only when the secondary slot is non-empty and different from the primary. A waypoint with a code-looking name and no description is just a waypoint with a terse name — leave it alone.

07 Field explorer

Every field, all three dialects

Search by field or meaning, or narrow to one dialect. Fields marked shared behave the same way everywhere.

08 File inspector

Paste a file, read the waypoints

The dialect is sniffed from the content, then every line is decoded. Coordinates are converted to signed decimal degrees and elevations to metres. Nothing is uploaded.

Waypoint file · editable
Parsed live
09 Parsing gotchas

Where waypoint files go wrong

  • Ozi altitudes are feet. The other two dialects are metres. Convert, and honour -777 / -9999 as "unknown" rather than as a depth.
  • The degree sign is unreliable. Match around it, not on it.
  • Encoding is Windows-1252 as often as UTF-8. Accented place names are single high bytes; strict UTF-8 decoding turns them into replacement characters. Try UTF-8 first, fall back to Windows-1252.
  • Ozi has no quoting. A comma in a name is unrepresentable. Replace it on export; do not emit a quoted field that no Ozi reader understands.
  • $FormatUTM is a different coordinate system, not a variation. Refuse it with a message that says so.
  • Line endings are CRLF in files from the original tools. Split on /\r?\n/, write CRLF back.
  • Skip unparseable lines, don't fail the file. Headers, comments, blank lines and the occasional truncated row are all normal. Only an empty result is an error.
  • Validate coordinates. A mis-sniffed dialect happily produces latitude 4400 or longitude 574. Bound-check every point before you keep it.
10 In We-Fly

What We-Fly reads and writes

The XC planner's waypoint collections import and export all three dialects. Everything is parsed in the browser — an imported collection is only stored when you explicitly save it.

DialectImportExportWritten as
OziExplorer.wpt
CompeGPS geographic✓ (.wpt or .utm).wpt
FS $FormatGEO.wpt
$FormatUTMrefused

All three export back to .wpt — the extension carries no information, so the dialect is the pilot's choice at download time. Competition codes survive a full import → save → export round trip in every dialect, including through the two-slot Ozi form.

The same collections also round-trip through GPX, KML and SeeYou .cup.

11 Sources

What this reconciles