{
  "profile": "tabular-data-package",
  "name": "travel-times",
  "title": "Modelled travel times from Luxembourg and cross-border communes to six Luxembourg job hubs",
  "description": "Modelled door-to-door travel times from every Luxembourg commune and from the French and German communes where at least 100 residents work in Luxembourg (IGSS counts, at most 400 communes) to six Luxembourg destinations: Luxembourg station, Kirchberg, Cloche d'Or, the city centre, Belval and Findel airport. Each row gives one origin, destination and weekday scenario: driving off-peak and at the morning and evening peaks, public transport in the morning and evening peaks, walking and cycling. Road, walking and cycling times come from the open-source Valhalla router on OpenStreetMap; public-transport times come from the R5 router on official GTFS timetables, with the 80th percentile published next to the median. Peak driving times are modelled with a national congestion ratio, not measured traffic. A median over 120 minutes is reported as no journey found, never as zero.Every row states when its timetable or road graph stops being valid. Belgian communes are not included while the licence of their centroid source is unresolved. Because the times are derived from OpenStreetMap, the dataset is published under the ODbL.",
  "version": "2026.10",
  "created": "2026-10-18T22:40:40.398Z",
  "homepage": "https://chathome.lu/en/data/travel-times",
  "licenses": [
    {
      "name": "ODbL-1.0",
      "path": "https://opendatacommons.org/licenses/odbl/1-0/",
      "title": "Open Data Commons Open Database License 1.0"
    }
  ],
  "contributors": [
    {
      "title": "ChatHome",
      "role": "publisher",
      "path": "https://chathome.lu",
      "email": "hello@chathome.lu"
    }
  ],
  "sources": [
    {
      "title": "OpenStreetMap contributors, via Geofabrik extracts: road, path and stop network (ODbL 1.0)",
      "path": "https://www.openstreetmap.org/copyright"
    },
    {
      "title": "Administration des transports publics (Luxembourg): national public-transport timetables (GTFS), data.public.lu (CC BY 4.0)",
      "path": "https://data.public.lu/en/datasets/horaires-et-arrets-des-transport-publics-gtfs/"
    },
    {
      "title": "Région Grand Est: Fluo 57 interurban timetables (GTFS), transport.data.gouv.fr (Licence Ouverte 2.0)",
      "path": "https://transport.data.gouv.fr/datasets/offre-du-reseau-de-transport-interurbain-fluo-grand-est"
    },
    {
      "title": "Région Grand Est: aggregate regional timetables (GTFS), transport.data.gouv.fr (Licence Ouverte 2.0)",
      "path": "https://transport.data.gouv.fr/datasets/horaires-des-lignes-regulieres-et-scolaires-du-reseau-fluo-grand-est"
    },
    {
      "title": "NVBW GmbH: Baden-Württemberg, Rheinland-Pfalz and Saarland timetables (GTFS) (dl-de/by-2-0 (https://www.govdata.de/dl-de/by-2-0))",
      "path": "https://www.nvbw.de/open-data/fahrplandaten"
    },
    {
      "title": "OTW (TEC): Walloon bus timetables (GTFS) (CC0 1.0)",
      "path": "https://transportdata.be/dataset/tec-gtfs"
    },
    {
      "title": "mobiliteit.lu HAFAS API (Administration des transports publics): public-transport reliability calibration only (CC BY 4.0)",
      "path": "https://data.public.lu/en/datasets/api-mobiliteit-lu/"
    },
    {
      "title": "TomTom Traffic Index city figures: calibration of one national peak congestion ratio; no TomTom data is redistributed",
      "path": "https://www.tomtom.com/traffic-index/"
    },
    {
      "title": "Administration du cadastre et de la topographie / Geoportail Luxembourg: administrative limits (Luxembourg codes, names, centroids) (CC0 1.0)",
      "path": "https://data.public.lu/fr/datasets/limites-administratives-du-grand-duche-de-luxembourg/"
    },
    {
      "title": "INSEE: Code officiel géographique 2026 (French codes, names), with commune centres from API Géo (Licence Ouverte 2.0)",
      "path": "https://www.insee.fr/fr/information/8740222"
    },
    {
      "title": "Statistisches Bundesamt (Destatis): Gemeindeverzeichnis GV-ISys (German codes, names, centroids) (dl-de/by-2-0 (https://www.govdata.de/dl-de/by-2-0))",
      "path": "https://www.destatis.de/DE/Themen/Laender-Regionen/Regionales/Gemeindeverzeichnis/_inhalt.html"
    },
    {
      "title": "IGSS: employment by commune of residence in Luxembourg and the neighbouring countries (CC0 1.0)",
      "path": "https://data.public.lu/en/datasets/emploi-total-par-commune-de-residence-au-luxembourg-et-dans-les-pays-frontaliers/"
    }
  ],
  "keywords": [
    "Luxembourg",
    "Greater Region",
    "travel time",
    "commuting",
    "cross-border workers",
    "frontaliers",
    "public transport",
    "GTFS",
    "OpenStreetMap",
    "accessibility",
    "open data"
  ],
  "resources": [
    {
      "name": "commune_hub_travel_times",
      "path": "commune_hub_travel_times.csv",
      "title": "Commune-to-hub travel times",
      "description": "Routed weekday travel times between each reference commune (every Luxembourg commune, and the French and German communes with at least 100 residents working in Luxembourg) and six Luxembourg employment hubs, in eight scenarios: driving off-peak and at peak in both directions, public transport in the morning and evening peaks, walking and cycling. Road, walking and cycling times come from a self-hosted Valhalla router on OpenStreetMap; public-transport times from a self-hosted R5 router on official GTFS timetables. Where no journey within the cutoff was found the status says so and the minutes are empty, never zero. Grain: one row per reference commune × hub × scenario.",
      "profile": "tabular-data-resource",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 5527583,
      "hash": "sha256:efe497772df68f291ba6586a28ca896128194509b0544ef62afe874aeefc3395",
      "schema": {
        "fields": [
          {
            "name": "locality_id",
            "type": "string",
            "description": "Grande Région locality id: lu:lau:<code>, fr:insee:<code> or de:ags:<code>."
          },
          {
            "name": "country",
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country of the commune: LU, FR or DE."
          },
          {
            "name": "national_code",
            "type": "string",
            "description": "Official municipality code: STATEC 4-digit, INSEE 5-digit or Destatis 8-digit AGS."
          },
          {
            "name": "hub_id",
            "type": "string",
            "description": "Hub identifier, e.g. lux-gare or kirchberg."
          },
          {
            "name": "hub_name",
            "type": "string",
            "description": "Hub name in English."
          },
          {
            "name": "scenario_id",
            "type": "string",
            "description": "Scenario identifier, e.g. transit-weekday-am-to-target."
          },
          {
            "name": "mode",
            "type": "string",
            "description": "driving, transit, walking or cycling."
          },
          {
            "name": "direction",
            "type": "string",
            "description": "to_target (commune to hub) or from_target (hub to commune)."
          },
          {
            "name": "time_basis",
            "type": "string",
            "description": "depart_at, arrive_by, or static for time-invariant walking and cycling."
          },
          {
            "name": "window_from",
            "type": "string",
            "description": "Start of the weekday local-time window (Europe/Luxembourg, HH:MM); empty for static modes."
          },
          {
            "name": "window_to",
            "type": "string",
            "description": "End of the weekday local-time window (Europe/Luxembourg, HH:MM); empty for static modes."
          },
          {
            "name": "status",
            "type": "string",
            "description": "ok; no_journey_within_cutoff: no journey within cutoff_minutes was found (a longer journey, a point the network does not reach, or for public transport too few departures in the window; the surface does not tell these apart); not_routed: the commune's centroid cell is not in the routing surface."
          },
          {
            "name": "minutes_p50",
            "type": "number",
            "description": "Median journey time in minutes, 1 decimal; status ok only, so never above cutoff_minutes. Public transport: over the window minutes that have a journey within cutoff_minutes (at least 70% of them), including a per-ride reliability allowance calibrated on mobiliteit.lu observations."
          },
          {
            "name": "minutes_p80",
            "type": "number",
            "description": "80th-percentile journey time in minutes over the same window minutes as minutes_p50, with the per-ride allowance, 1 decimal; it can exceed cutoff_minutes. Public transport with status ok only, empty for driving, walking and cycling."
          },
          {
            "name": "distance_km",
            "type": "number",
            "description": "Median routed distance in kilometres, 1 decimal; status ok only, empty for public transport."
          },
          {
            "name": "cutoff_minutes",
            "type": "integer",
            "description": "Longest journey the surface searched for."
          },
          {
            "name": "centroid_check",
            "type": "string",
            "description": "consistent or differs_over_10_min: minutes_p50 at the commune centroid compared with the median over at least five other routed cells of the same commune in the same scenario; not_checked when fewer exist or the centroid has no journey. A representativeness flag only."
          },
          {
            "name": "peak_traffic_model",
            "type": "string",
            "description": "Peak driving only: 'modelled national congestion ratio (<version>)'. Peak minutes are free-flow road time scaled by one national ratio calibrated on TomTom Traffic Index city figures, not measured traffic. Empty otherwise."
          },
          {
            "name": "provider",
            "type": "string",
            "description": "Routing engine: valhalla (road, walking, cycling) or r5 (public transport)."
          },
          {
            "name": "graph_version",
            "type": "string",
            "description": "OpenStreetMap network version the router used."
          },
          {
            "name": "timetable_version",
            "type": "string",
            "description": "GTFS timetable bundle version; public transport only."
          },
          {
            "name": "reliability_version",
            "type": "string",
            "description": "Version of the public-transport reliability calibration; public transport only."
          },
          {
            "name": "computed_at",
            "type": "string",
            "description": "When this hub and scenario were routed (ISO 8601, UTC)."
          },
          {
            "name": "valid_until",
            "type": "string",
            "description": "End of validity of the routing data behind this row (ISO 8601, UTC); for public transport, the end of the timetable."
          },
          {
            "name": "surface_version",
            "type": "string",
            "description": "Version of the routing surface the row was read from."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "commune_hub_travel_times_parquet",
      "path": "commune_hub_travel_times.parquet",
      "title": "Commune-to-hub travel times (Parquet)",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 88534,
      "hash": "sha256:3f9babf0b66f4622f8284daa54d8576ae3974b70bbf383535c8d05097010c7d3"
    },
    {
      "name": "travel_time_localities",
      "path": "travel_time_localities.csv",
      "title": "Travel-time reference communes",
      "description": "The communes travel times are published for: official code, name and administrative area, the official centroid the routing starts from, and for French and German communes the number of residents working in Luxembourg (IGSS) and their straight-line distance to Luxembourg. Belgian communes are not included. Grain: one row per reference commune.",
      "profile": "tabular-data-resource",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 34319,
      "hash": "sha256:d587019fe3d94762b0f78da3ef66dec67cbf6a7ef073d69895e33cd014cfbffd",
      "schema": {
        "fields": [
          {
            "name": "locality_id",
            "type": "string",
            "description": "Grande Région locality id: lu:lau:<code>, fr:insee:<code> or de:ags:<code>."
          },
          {
            "name": "country",
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country: LU, FR or DE."
          },
          {
            "name": "national_code",
            "type": "string",
            "description": "Official municipality code: STATEC 4-digit, INSEE 5-digit or Destatis 8-digit AGS."
          },
          {
            "name": "national_authority",
            "type": "string",
            "description": "Code authority: STATEC_LAU, INSEE_COG or DESTATIS_AGS."
          },
          {
            "name": "name",
            "type": "string",
            "description": "Official commune name (French for Luxembourg and France); for Germany the plain register name without its administrative suffix such as ', Stadt' where the register gives one."
          },
          {
            "name": "admin_area",
            "type": "string",
            "description": "Luxembourg canton, French department or German Kreis name; empty where the source gives only a code instead of a name."
          },
          {
            "name": "centroid_lat",
            "type": "number",
            "description": "Official commune centroid latitude, WGS84, 5 decimals. Routing starts at the centre of the H3 resolution-10 cell that contains it."
          },
          {
            "name": "centroid_lng",
            "type": "number",
            "description": "Official commune centroid longitude, WGS84, 5 decimals."
          },
          {
            "name": "lu_resident_workers",
            "type": "integer",
            "description": "Residents of this commune employed under Luxembourg social security (IGSS, rounded by IGSS to the nearest 10); empty for Luxembourg communes."
          },
          {
            "name": "igss_reference_date",
            "type": "string",
            "description": "Reference date of lu_resident_workers (YYYY-MM-DD); empty for Luxembourg communes."
          },
          {
            "name": "distance_to_luxembourg_km",
            "type": "number",
            "description": "Straight-line kilometres from the centroid to the nearest of five Luxembourg employment centres, as used to define the cross-border belt; empty for Luxembourg communes."
          },
          {
            "name": "routed",
            "type": "boolean",
            "description": "True when the commune's centroid cell is in the routing surface; false rows have status not_routed in commune_hub_travel_times."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "travel_time_localities_parquet",
      "path": "travel_time_localities.parquet",
      "title": "Travel-time reference communes (Parquet)",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 16785,
      "hash": "sha256:effc2d36abc652b2e0d1cbbb5ebe869a324dd1127793f83f2bacf93d702afabf"
    }
  ]
}
