{
  "markdown": "# World Train Map Atlas — the world's legendary train routes, as open data\n\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21322030.svg)](https://doi.org/10.5281/zenodo.21322030)\n\n**961 train routes · 118 countries · ≈ 432,800 km of route**, every route with its key facts and its geometry, from [worldtrainmap.com](https://worldtrainmap.com), the interactive world railway map.\n\nHigh-speed spines (Eurostar, TGV, Shinkansen, AVE), classic long-distance runs (Trans-Siberian, California Zephyr), night trains (Nightjet, the Ghan) and the scenic lines people fly in just to ride (Glacier Express, Bernina Express, the Jacobite).\n\n🗺️ **Explore it interactively:** [worldtrainmap.com](https://worldtrainmap.com)\n🤖 **Use it from an AI assistant:** free MCP server at `https://worldtrainmap.com/mcp` ([how to connect](https://worldtrainmap.com/mcp-server/)), or run it from this repo: `npm install && npm start` ([`mcp/`](mcp/))\n\n> **The site was renamed.** It was TrainRouter at `trainrouter.com` until 11 August 2026 and is now World Train Map at `worldtrainmap.com`. The old domain redirects path for path, so old links still work, and `https://trainrouter.com/mcp` still answers directly rather than redirecting, because JSON-RPC clients do not follow redirects. Nothing you already had configured has broken. The repository, the Zenodo DOI and the MCP registry name (`com.trainrouter/atlas`) keep their old identifiers on purpose: renaming them would break more than it would tidy.\n\n## Which version holds what\n\nSeveral different route counts are in circulation for this atlas, so here is the honest map of them.\n\n| Where | Routes | Cut | Note |\n|---|---|---|---|\n| The live site | 1,338 | today | [worldtrainmap.com](https://worldtrainmap.com), always the newest |\n| The MCP server | 1,247 | 11 August 2026 | deployed separately from the site, so it lags it a little |\n| `data/` in this repo, and Hugging Face | 961 | 23 July 2026 | what you get by cloning or downloading here |\n| Zenodo (the citable DOI) | 744 | 12 July 2026 | release v1.1.0, the last tagged one |\n\n**Why the download is behind the site, and it is deliberate.** Since late July the route geometry has been progressively re-traced from OpenStreetMap railway relations, which makes it a derivative of OSM data under ODbL, while this package is licensed CC BY 4.0 throughout. Publishing a refresh before the licence is split per route would ship a licence violation with our name on it, so the exporter is blocked until that work lands. See *Sources, accuracy & provenance* below. If you want something fresher than the July cut without waiting, the MCP server is the closest available.\n\n## Files\n\n| File | Contents |\n|---|---|\n| `data/routes.csv` | One row per route, all facts, no geometry |\n| `data/routes.json` | Same records with structured country objects |\n| `data/routes.geojson` | `LineString` per route (lon/lat waypoints) plus all facts as properties |\n\n## Schema\n\n| Field | Type | Notes |\n|---|---|---|\n| `id` | string | Stable slug, e.g. `glacier-express` |\n| `name` | string | Route/service name |\n| `from`, `to` | string | Terminus cities |\n| `category` | enum | In this cut: `high-speed` · `classic` · `night` · `scenic` · `luxury`. The live atlas adds `mountain` and `heritage` |\n| `train` | string | Rolling stock, e.g. `e320 · Class 374` |\n| `operator` | string | Operating company |\n| `distance_km` | number | Route length |\n| `top_speed_kmh` | number | Service top speed |\n| `duration` | string | Published journey time, e.g. `2 h 16 min` |\n| `opened` | number | Year the line/service entered service |\n| `pax_per_year` | number\\|null | Approx. annual ridership where published, which is rare: 80 of the 961 rows carry one |\n| `countries_iso` / `countries` | string | `\\|`-separated, in travel order (CSV); structured objects in JSON |\n| `highlight` | string | One-line description of what makes the route legendary |\n| `fame_rank` | number | 1 = most famous (the atlas's own renown ranking) |\n| `url` | string | The route's page. These were written before the rename and still read `trainrouter.com`, which redirects to the same path on `worldtrainmap.com`; they will be rewritten in the next release |\n\n## Quick start\n\n```python\nimport pandas as pd\nroutes = pd.read_csv(\"data/routes.csv\")\nroutes.nsmallest(10, \"fame_rank\")[[\"name\", \"from\", \"to\", \"distance_km\"]]\n\nimport geopandas as gpd\ngdf = gpd.read_file(\"data/routes.geojson\")\ngdf.plot(column=\"category\", figsize=(16, 8))\n```\n\n## Sources, accuracy & provenance\n\n- **Provenance changed in late July 2026 — this section was updated 2026-07-31 to say so.** The atlas started fully hand-built, and the **facts** still are: compiled from public references, not from any licensed dataset, so the CC BY 4.0 licence on the facts is the author's to grant.\n- **Geometry: hand-traced originally, OSM-traced increasingly.** Each route's `LineString` began as hand-placed `[lon, lat]` waypoints following the corridor at map scale. From 23 July 2026 onward, alignments have progressively been re-traced from **OpenStreetMap railway ways via Overpass** so the lines sit on real track. The files currently in `data/` are the 23 July refresh: nearly all of their geometry is still the hand-traced kind, but a handful of corridors (Brenner, Oslo–Göteborg, Oslo–Stockholm, Pustertalbahn) are already OSM-traced, and those lines are **© OpenStreetMap contributors, ODbL** — as any OSM-derived geometry must be. An earlier version of this README said the geometry was \"not extracted from OSM or any geodata source\"; that was true when written (v1.0, 12 July) and is no longer true, which is why this notice exists. The next release will mark the split per route: facts CC BY 4.0, geometry ODbL. On the live site that re-tracing has since gone much further, which is why the site's routes and this package's routes are no longer the same lines.\n- **Facts are approximate published values:** distance, top speed, journey time, operator, opening year and approximate ridership are compiled from public references (operators' own figures, timetables, press material, encyclopaedic articles). Individual facts like these aren't copyrightable; the licence covers the curated compilation. Good for exploration and visualization, not operations.\n- **Curated, not exhaustive:** the world's *notable* routes, not every line on earth. Route names and the one-line `highlight`s are the author's own wording.\n- **Deliberately excluded** (they live only on the site, to keep provenance clean): per-route stories and sights, photos (Wikimedia Commons, separately licensed), and the city-to-city journey guides (derived from public schedule feeds).\n- **Basemap ≠ data:** the interactive site renders these routes over OpenFreeMap (OpenStreetMap) tiles; those tiles are **not** part of this dataset. OSM © OpenStreetMap contributors — which, per the provenance note above, now also covers the OSM-traced route lines themselves.\n\n## License & attribution\n\n- **Facts** (every non-geometry field in `data/`): [**CC BY 4.0**](https://creativecommons.org/licenses/by/4.0/), free to use, share and adapt, **with attribution to [World Train Map](https://worldtrainmap.com)**. A link to `https://worldtrainmap.com` (or the specific route page in `url`) satisfies attribution. ([full notice](data/LICENSE))\n- **Geometry** (`LineString` coordinates): hand-traced lines as above (CC BY 4.0); **OSM-traced lines © [OpenStreetMap contributors](https://www.openstreetmap.org/copyright), [ODbL 1.0](https://opendatacommons.org/licenses/odbl/1-0/)**. If you reuse the geometry wholesale, treat it as ODbL and credit OpenStreetMap, which is the safe default, and will be made explicit per route in the next release.\n- **Code** (the MCP server in `mcp/`): [MIT](LICENSE).\n\n## Also available on\n\n- **Hugging Face:** [huggingface.co/datasets/Flightmussy/trainrouter-atlas](https://huggingface.co/datasets/Flightmussy/trainrouter-atlas), kept byte for byte in step with `data/` here\n- **Kaggle:** [kaggle.com/datasets/flightmussy/world-train-routes](https://www.kaggle.com/datasets/flightmussy/world-train-routes), the two fact files only, because Kaggle allows a dataset one licence label and the geometry is part ODbL\n- **Zenodo (archived, DOI):** [doi.org/10.5281/zenodo.21322030](https://doi.org/10.5281/zenodo.21322030), the concept DOI, which always resolves to the latest published release (today, v1.1.0)\n\nThe Kaggle mirror is new, and it is worth saying why it did not exist before: every earlier version of this README, and the site's own dataset page, linked one at `kaggle.com/datasets/albanius/...`. That account name has never been ours, and the same wrong id was hard-coded into the mirror-sync workflow, so the link was dead from the day it was written and the automation could not have fixed it. Both are corrected.\n\n## Citing\n\n> World Train Map Atlas: the world's legendary train routes (2026). worldtrainmap.com. DOI: 10.5281/zenodo.21322030. https://github.com/Flightmussy/trainrouter-atlas\n\n## Updating\n\nThe data is generated from the atlas source by an exporter that is **currently blocked on purpose**, pending the split-licence work described above. That block is why `data/` has not moved since 23 July and why the last release is still v1.1.0. Once it is unblocked, new versions land here first, and publishing a GitHub release mints a fresh Zenodo DOI and pushes the mirrors via [`sync-mirrors.yml`](.github/workflows/sync-mirrors.yml), whose jobs each skip themselves when their API token is not configured.\n\n## Also in this repo\n\n- [`mcp/`](mcp/) — source of the World Train Map MCP server (live at `https://worldtrainmap.com/mcp`, listed in the [Official MCP Registry](https://registry.modelcontextprotocol.io) as `com.trainrouter/atlas`), which serves the atlas as tools for Claude and other MCP clients. It is deployed from the site's own atlas rather than from `data/`, so it is well ahead of the files here, though it is redeployed on its own schedule and can sit a little behind the site itself. Its `atlas_stats` tool reports exactly what it is serving.\n",
  "bytes": 10082,
  "sha": "65d010d4e10fcd6340352b1003f2851ca261ce4ad695e6578290d8b32a6f3d9f",
  "repo_slug": "flightmussy/trainrouter-atlas",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_trainrouter_atlas_bbfae155/readme"
}