Are you the author? Sign in to claim
744 of the world's legendary train routes — open dataset (CSV/JSON/GeoJSON) + MCP server, from trainrouter.com
961 train routes · 118 countries · ≈ 432,800 km of route — every route with its key facts and hand-traced geometry, from trainrouter.com, the interactive world railway map.
High-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).
🗺️ Explore it interactively: trainrouter.com
🤖 Use it from an AI assistant: free MCP server at https://trainrouter.com/mcp (how to connect) — or run it from this repo: npm install && npm start (mcp/)
| File | Contents |
|---|---|
data/routes.csv | One row per route — all facts, no geometry |
data/routes.json | Same records with structured country objects |
data/routes.geojson | LineString per route (lon/lat waypoints) + all facts as properties |
| Field | Type | Notes |
|---|---|---|
id | string | Stable slug, e.g. glacier-express |
name | string | Route/service name |
from, to | string | Terminus cities |
category | enum | high-speed · classic · night · scenic |
train | string | Rolling stock, e.g. e320 · Class 374 |
operator | string | Operating company |
distance_km | number | Route length |
top_speed_kmh | number | Service top speed |
duration | string | Published journey time, e.g. 2 h 16 min |
opened | number | Year the line/service entered service |
pax_per_year | number|null | Approx. annual ridership where published |
countries_iso / countries | string | |-separated, in travel order (CSV); structured objects in JSON |
highlight | string | One-line description of what makes the route legendary |
fame_rank | number | 1 = most famous (TrainRouter renown ranking) |
url | string | The route's page on trainrouter.com |
import pandas as pd
routes = pd.read_csv("data/routes.csv")
routes.nsmallest(10, "fame_rank")[["name", "from", "to", "distance_km"]]
import geopandas as gpd
gdf = gpd.read_file("data/routes.geojson")
gdf.plot(column="category", figsize=(16, 8))
LineString is a set of hand-placed [lon, lat] waypoints following the line's real corridor through its stops — deliberately schematic (smoothed for display), not survey-grade alignment, and not extracted from OSM or any geodata source.highlights are the author's own wording.data/): CC BY 4.0 — free to use, share and adapt, with attribution to TrainRouter. A link to https://trainrouter.com (or the specific route page in url) satisfies attribution. (full notice)mcp/): MIT.TrainRouter Atlas: the world's legendary train routes (2026). trainrouter.com. DOI: 10.5281/zenodo.21322030. https://github.com/Flightmussy/trainrouter-atlas
The data is generated from the TrainRouter atlas source. New versions land here first; publishing a GitHub release mints a fresh Zenodo DOI and (once the repo's KAGGLE_API_TOKEN/HF_TOKEN secrets are configured) syncs the Kaggle and Hugging Face mirrors automatically via sync-mirrors.yml.
mcp/ — source of the TrainRouter MCP server (live at https://trainrouter.com/mcp, listed in the Official MCP Registry as com.trainrouter/atlas), which serves this atlas as tools for Claude and other MCP clients.Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows