Reference

Record schema

Each trail has one record: <id>/trail.toml. The file is TOML. Field names are stable: tools read them, so fields are added, not renamed. Optional fields are marked "where present".

Example (shortened):

id = "long-trail"
name = "Long Trail (Vermont)"
short_name = "LT"
country = "US"
regions = ["VT"]
length_km = 438
length_note = "272 mi published"
tier = "regional"
designation = "Green Mountain Club; oldest long-distance trail in the US"
wave = 1

[source]
status = "osm-only"
publisher = "Green Mountain Club (publishes the trail)"
url = "https://www.openstreetmap.org/relation/391736"
licence = "ODbL-1.0"
attribution = "OpenStreetMap contributors (ODbL)"
osm_only = true
line_file = "line.geojson"

Top level

FieldTypeMeaningExample
idstringStable identifier. Equals the directory name. Never changes."long-trail"
namestringThe trail's own name."Long Trail (Vermont)"
short_namestringAbbreviation, as carried on the trail's shield, or the short form of a route's name where it has no shield."LT"
countrystringUS or CA."US"
regionsarray of stringsState, province or territory codes crossed.["VT"]
length_kmintegerPublished length in kilometres. A check value, not measured from the track.438
length_notestringWhere the published length comes from."272 mi published"
kindstring, where present"route" for a route: one that a hiker or a small group worked out and published. Absent means a designated trail: one that a land agency or a trail association designates."route"
tierstringnational (US National Scenic Trail), regional (80 km or more), short (well-known, 60-80 km), deferred, or candidate. The tiers apply to routes as well."regional"
designationstringWhat makes it a long trail: statute, agency or association, or for a route the person and year it was published."National Scenic Trail (1968)"
waveinteger or string1 for trails in the first set; "held" where listing is undecided.1
wave_notestring, where presentWhy a held trail is held."Held: no usable whole track exists."
inclusionstring, where presentnst-unconditional for every National Scenic Trail; candidate-decision-pending for a candidate. Absent otherwise."nst-unconditional"

[source]: where the track comes from

The field and file names keep the word "line" (line.geojson, line_file, line_policy, line_source); they refer to the trail's track.

FieldTypeMeaningExample
statusstringverified (downloaded and measured), found (source located, not downloaded), osm-only (only an OpenStreetMap relation), or none."osm-only"
publisherstringWho publishes the track."Green Mountain Club"
publisher_urlstring, where presentThe publisher's own page for the trail, kept when the included track comes from another source."https://www.greenmountainclub.org/"
urlstringWhere to ask for the track: a layer or relation page, never a dated file name."https://www.openstreetmap.org/relation/391736"
discoverystringHow to tell whether the source has a newer release."osm-relation-version: ..."
formatstringWhat the source serves and how it is paged."OpenStreetMap route relation"
crsstringCoordinate system the source stores. Published files are longitude/latitude (EPSG:4326)."EPSG:4326"
licencestringLicence id, from: us-gov-public-domain, CC-BY-4.0, CC-BY, ODbL-1.0, CC-BY-NC-ND-4.0, none-stated, restricted, unknown."ODbL-1.0"
licence_textstringWhat the source actually says, with the page it was read on. Not legal advice."OpenStreetMap contributors, ODbL 1.0 ..."
attributionstringThe credit line to show, as the source asks."OpenStreetMap contributors (ODbL)"
osm_onlybooleantrue when OpenStreetMap is the only source of the included track.true
mainlinestringHow the main track is told apart from alternates, connectors and side trails in this source."One relation tagged complete."
decisionstring, where presentA settled inclusion question, stated neutrally."included-named"
decision_textstring, where presentWhat the decision settles, in one sentence."Included with its name and logo."
source_checkedstring (date)Date the source was last read, YYYY-MM-DD."2026-11-08"
redistributablebooleantrue when the source's terms allow its track to be passed on. Must be true for every included data file.true
line_sourcestringShort name of the included track's source, or none (no line included)."OpenStreetMap"
line_filestringIncluded main track file, usually "line.geojson", or "" when no track is included."line.geojson"
line_absent_reasonstring, where no lineWhy no track is included."Publisher's GIS data is not licensed for redistribution ..."
length_gap_notestring, where presentWhy the measured track differs from length_km by more than 15% (partly unbuilt, planned length, side trails counted, and so on). Required in that case."The trail is not finished: built passages are what is mapped."

[osm]: the OpenStreetMap relation

FieldTypeMeaningExample
relationintegerBest OpenStreetMap relation id, or 0 for none found or not searched.391736
notestringWhat is in OpenStreetMap for this trail."OSM 391736 has a 437.7 km distance tag."
FieldTypeMeaningExample
statusstringuse-real-logo, no-logo-exists, or logo-not-found."use-real-logo"
logo_sourcestringWhere the logo art was taken from, when known."https://www.greenmountainclub.org/"
contactstringWho holds the emblem or mark."Green Mountain Club"
notestringWhat is known about the logo and its terms."No logo or shield policy found."
logo_filestringIncluded logo file ("shield.svg" or "shield.png"), or "" when none is included."shield.svg"
logo_ownerstringThe logo's holder, named whenever a logo file is included."Green Mountain Club"

[verification]: what was checked

FieldTypeMeaningExample
verifiedbooleantrue when geometry was downloaded and measured.true
datestring (date), where verifiedDate of the check."2026-11-08"
measured_kmnumber, where verifiedMeasured (geodesic) length in kilometres.400.9
difference_percentnumber, where verifiedMeasured length minus published length, as a percent of published length.-8.5
partsinteger, where verifiedPieces left after joining track ends within 100 m.1
notestringWhat was found, including failures and gaps."389.5 km in 12 parts against 480 km planned."

[hike]: what a hiker asks first

Optional: a record without [hike] is valid. The table holds the facts a hiker wants before anything else: where the trail goes, what the country is like, how long it takes, when to go, where its own site is. Every fact is read on a page of the trail's holder (the agency, the association, or for a route its author) or on a government page, and named in [[hike.source]]. A fact that was not found on such a page is left out, never guessed. Where sources disagree, the managing body's figure is used. Wording is ours: nothing is copied from a source.

FieldTypeMeaningExample
summarystringTwo or three plain sentences: where the trail goes, what the country is like, what sets it apart. No sales language and no superlative that a source does not support. The first sentence stands alone, because the site uses it as a one-line description."The Long Trail runs the length of Vermont along the Green Mountains, from the Massachusetts border to the Canadian border."
official_urlstringThe trail's own page from whoever manages or publishes it (agency, association, or the route's author)."https://www.greenmountainclub.org/the-long-trail/"
start, endstringThe two ends as place names a hiker would recognise, in the usual direction of travel where there is one. For a loop, start is the usual trailhead and end is left out."Springer Mountain, Georgia"
shapestring"point-to-point", "loop" or "network"."point-to-point"
daysarray of two integersThe usual time to walk the whole trail in one go, [fewest, most], in days, as a source states it. Weeks count 7 days, months 30.[150, 210]
seasonstringThe months in which the whole trail is usually walked, as a short phrase. Not the dates a park or hut is open, unless those set the walking season."July to September"
monthsarray of integersThe same season as month numbers, 1 to 12, for filtering: every month in which the whole trail, or a usual start, is normally walked. A month counts when about half of it or more is in season. Given whenever season is.[7, 8, 9]
high_pointstringName of the highest point on the trail."Mount Mansfield"
high_point_mintegerThe elevation of the highest point in metres, rounded to the nearest metre (converted from feet where the source gives feet). May be given without high_point where a source states the elevation but not a name.1340
terrainarray of stringsOne to three of alpine, forest, desert, coast, prairie, canyon, tundra, lakes, farmland: the main kinds of country only.["forest"]
travelstringWhat the walking is, as the sources describe it. "trail": on built or maintained trail for all or nearly all of the way. "trail-and-road": trail with long stretches on roads. "some-cross-country": mostly trail or road, with stretches that have no trail. "mostly-cross-country": no trail for most of the way."trail"
permitstringOne plain sentence on whether a permit or reservation is needed to walk the whole trail, and from whom. Left out when no source says."Individual hikers need no permit."
unfinishedstringOnly where the trail is not complete on the ground: one sentence saying how much exists, as a source states it."About 400 of the planned 700 miles are built."
cautionstringOnly where a source says so: one sentence a hiker should know before choosing the trail that no other field holds, such as long sections that are unofficial, unmaintained or on roads. Not current conditions or closures, which change."About a third of the route is unofficial and not maintained."
checkedstring (date)Required when [hike] is present. The date the facts were read, YYYY-MM-DD."2026-11-13"

[[hike.source]]: where the [hike] facts were read

An array of tables, and at least one when [hike] is present. Every fact field in [hike] (every field except checked) must be named in the facts of at least one source. summary and terrain are our own wording and judgement, but each still names the page or pages it was drawn from.

FieldTypeMeaningExample
urlstringThe page a fact was read on."https://www.greenmountainclub.org/the-long-trail/"
publisherstringWho publishes that page."Green Mountain Club"
factsarray of stringsThe [hike] field names this page supports. "high_point" covers both high_point and high_point_m.["start", "end", "high_point"]

[route]: the author and the track policy

Present only when kind = "route". A route is a high route, a traverse or a loop of linked trails that a hiker or a small group worked out and published.

FieldTypeMeaningExample
creatorstringThe route's author: the person, people or group who worked the route out."Steve Roper"
yearinteger, where knownThe year the route was first published or first walked, as the source states it. Absent when no page read states one.1970
line_policystringopen (the author publishes the track freely), sold (the route is got by buying a guide or map set), withheld (the author chooses not to publish a track), or unclear (not settled)."sold"
creator_wordsstring, where foundThe author's own words on sharing the track, quoted exactly."There is no route, so you must create one on your own."
creator_words_urlstring, where creator_words is presentThe page the words were read on."https://andrewskurka.com/adventures/great-western-loop/route-description/"
creator_words_bystring, where the words are another person'sWhose words creator_words quotes, when they are not the author's."Andrew Skurka"
notestring, where presentAnything else about the route's tracks: when it was first walked, what it links, what is still missing."The guidebook's maps are the track."

[[guide]]: where the route is got from

An array of tables, one per guide, and at least one for every route. A guide is the book, map set or page that gives the route.

FieldTypeMeaningExample
titlestringThe guide's title or the page's name."Sierra High Route, 2nd Edition"
authorstringWho wrote or published it."Steve Roper"
accessstring"free" or "purchase"."purchase"
urlstringThe author's or publisher's own page for the guide."https://www.mountaineers.org/books/books/sierra-high-route-2nd-edition-traversing-timberline-country"
formatstringWhat the guide is: book, map set, web page, GPX file, and so on."book"
pricestring, where knownThe price exactly as the page states it, with the date read in price_checked."$24.95"
price_checkedstring (date), where price is presentDate the price was read, YYYY-MM-DD."2026-11-10"
publisherstring, where knownThe publisher, where it is not the author."Mountaineers Books"
isbnstring, where knownThe book's ISBN."978-0-89886-506-6"

Files beside the record

FileMeaning
line.geojsonThe main track (FeatureCollection, longitude/latitude). Present only when source.line_file names it.
alternates.geojsonAlternate or connector tracks the source serves separately, where present.
line-<source>.geojsonOne source's own extract, where the main track combines sources (for example line-usfs.geojson).
release.txtSource, licence and date the track files came from. Present when a track is included.
shield.svg, shield.pngThe trail's logo. Present only when shield.logo_file names it. See NOTICE.md.
elevation.jsonThe trail's elevation facts and profile, computed from line.geojson and a public elevation model. Present for every trail with a track. See below.

elevation.json: elevation facts and profile

Computed by python3 tools/elevation.py from the trail's track (line.geojson) and the Terrain Tiles open elevation data. It is not read from any trail page. The file is one line of compact JSON. The same track gives the same file.

FieldTypeMeaningExample
highest, lowestobjectm (whole metres), lon and lat (5 decimals) of the highest and the lowest sample on the track.{"lat":36.57843,"lon":-118.29247,"m":4009}
ascent_m, descent_mintegerTotal climbing and total descending along the track, in metres, by the method below. For a trail that is not a loop, they are for the direction in orientation. Walking the other way swaps them.124343
track_kmnumberLength sampled, in kilometres. It is the length of the track, not the published length.4269.9
published_kmintegerThe record's length_km.4265
coveragenumbertrack_km divided by published_km. Below about 0.85 the track is partial, and every figure here describes the track, not the whole trail. Above 1 the track is longer than the published length.1.001
partsintegerNumber of separate parts the track falls into once pieces whose ends are within 100 m are joined. It is the number the site's own joining gives, and can be larger than verification.parts, which was counted with another joining rule.1
part_starts_kmarray of numbers, where parts is more than 1The profile distance at which each part after the first begins.[102.4, 250.1]
orientationstring"south-to-north" or "west-to-east": the direction the track is walked for ascent_m, descent_m and the profile. A part that is a loop keeps the direction it has."south-to-north"
profilearrayPairs [distance_km, elevation_m], at most 700, thinned so that a drawn line follows the full profile. The distance is along the sampled track. The first point of a part repeats the distance of the last point of the part before it, so a chart must not draw a line between them (use part_starts_km). The highest and lowest points are always in the profile.[[0,1222],[0.03,1225]]
sourceobjectWhat the numbers come from and how: model, url, attribution (the credit to show), zoom, ground_m_per_pixel_at_40n, sample_spacing_m, smoothing, limits, method_version, computed (the date).{"zoom":12,...}

Method

  1. Pieces of the track whose ends are within 100 m are joined into parts. Parts are never joined to each other. No climb is counted across a gap.
  2. Each part is walked from its start and a point is taken every 30 m along it, and at its end.
  3. The elevation at each point is read from the elevation tiles by interpolating between the four nearest grid cells. The tiles used are Terrain Tiles "terrarium" tiles at zoom 12, about 29 m per cell at 40 degrees north. Cells that are far out of line with their neighbours are tile-making errors and are replaced, and values below sea level are set to 0.
  4. highest and lowest are the largest and smallest of these values.
  5. For ascent_m and descent_m the profile is first smoothed with a moving average over 90 m (three points). Then a climb or a descent counts only after the profile has moved more than 5 m against the last high or low point. Without that, noise in the model adds a great deal of climbing that is not there.
  6. The smoothing and the 5 m threshold were chosen once, to match published figures for ten well-known trails, and then left fixed for every trail. They are in tools/elevation.py.

Limits

  • These are computed values, not measurements. Where a published figure exists, it may differ. For ten well-known trails the computed climbing is within about 15% of the published figure, and the published figures themselves differ by about as much from one source to another.
  • The elevation model is a grid. A narrow summit can be missed by up to 15 m of position and so read a little low. Highest and lowest are the model's values at the samples, not surveyed benchmarks. Values below sea level are set to 0, because beside a coast the model carries the depth of the sea and none of these trails goes below sea level.
  • The model's own accuracy varies. In the United States it is built from 10 m surveys; in Canada it is coarser (20 m to 400 m, depending on the place), so a Canadian trail's ascent is likely to be low.
  • Ascent and descent depend on the method's settings. They are comparable between trails in this dataset, which all use the same settings. They are not the figure a GPS watch or another site would show.
  • The profile follows the track as it is stored. Where the track is partial, joined in the wrong order, or includes side trails or alternates, the facts follow it. Check coverage and parts first.
  • The direction is a convention, chosen to make the output repeatable. It is not the trail's usual direction.