GTFS Tidy — Limpieza y Validación de Feeds GTFS
Qué es
gtfstidy (github.com/patrickbr/gtfstidy, Go, GPL-2.0, 149⭐, push 2026-08) es el CLI de referencia para comprobar, sanear y minimizar feeds GTFS. Garantía central: la salida es semánticamente equivalente al input — mismos trips con mismos atributos desde la perspectiva del viajero. Del mismo autor que gtfs2shp (herramienta hermana), muy usado en pipelines de datos de transporte.
Dato de peso (medido en su README): feed Suiza → calendar_dates.txt de 4,38M líneas/113MB a 456K líneas/6.6MB, y zip total 80MB→63MB. Praga → 16MB→9.4MB.
Instalación
go install github.com/patrickbr/gtfstidy@latest # o binarios en Releases
gtfstidy --help
Uso
# Salida: -o <dir> suelta o -o archivo.zip (el .zip es OBLIGATORIO para zip)
gtfstidy -v feed.zip # solo validación (no processors)
gtfstidy -W feed.zip -o salida.zip # validar + mostrar avisos
gtfstidy -eDnz -p '-' feed.zip -o s.zip # --fix: sanear sin minimizar
gtfstidy --compress feed.zip -o s.zip # -OSRCcIAP: minimización segura
gtfstidy --Compress feed.zip -o s.zip # + -T y emparejamiento difuso: máxima compresión
gtfstidy -SCRmTcdsOeD feed.zip -o s.zip # proceso completo (flags sueltos, orden interno fijo)
gtfstidy feed.zip -o s.zip --bounding-box -4.0,39.9,-3.0,40.6 # recorte geográfico
gtfstidy feed.zip -o s.zip --polygon-file madrid.geojson # filtro por GeoJSON
gtfstidy feed.zip -o s.zip -M 2,3 -N 7 # filtrar por modo (metro+tren, sin ferri)
Flags de procesadores (verificados en gtfstidy.go)
| Flag |
Qué hace |
-e |
valores por defecto GTFS en lugar de errores (campos no requeridos) |
-z |
arregla jerarquía del ZIP |
-n |
detecta coordenadas (0,0) |
-p <str> |
rellena campos requeridos vacíos no críticos |
-D |
elimina entradas erróneas (cascada: borra trips/stops huérfanos) → subconjunto sin errores |
-O [lista] |
elimina entidades huérfanas (all,agency,routes,services,shapes,stops,transfers,trips) |
-m / -r |
remide shape_dist_traveled / stop_times (rellena huecos interpolando) |
-s |
minimiza geometrías (Douglas-Peucker, ε≈1m en EPSG:3857; implica -m) |
-S / -R / -C / -P / -I / -A |
eliminan duplicados: shapes, rutas, servicios, paradas/niveles, trips, agencias |
-c |
minimiza calendar.txt + calendar_dates.txt (cobertura óptima rango/excepción) |
-T |
comprime trips explícitos en frequencies.txt (algoritmo CAP de Bast & Storandt; -min-headway/-max-headway lo acotan) |
-i / -d |
IDs densos numéricos / base-36 |
-E |
reclusteriza paradas (-recluster-stops-dist 75m, -recluster-stops-simi 0.55) |
-M / -N |
mantener / descartar lista de MOTs (1 tranvía, 2 metro, 3 tren, 4 bus, 5 barco, 6 teleférico, 7 ferri) |
-F |
conserva columnas extra no-GTFS del input |
--keep-* |
preserva IDs externos: --keep-ids, --keep-trip-ids, --keep-route-ids, --keep-shape-ids, --keep-station-ids, --keep-service-ids, --keep-block-ids... |
Regla mnemotécnica: mayúsculas ELIMINAN o fusionan entidades; minúsculas modifican.
Orden de procesado (fijo, independiente del orden de flags)
-e defaults → 2. -D drop errores → 3. -O huérfanos → 4. -m remedir → 5. -s minimizar shapes → 6. -S → 7. -R → 8. -C → 9. -c → 10. -T → 11. -i/-d IDs.
Casos de uso para David
- Prefiltro en GBFSSpain / GTFS Spain: antes de cargar feeds oficiales (Cercanías, EMT, metro) en el visor o en SQLite (node-gtfs), pasar
--compress → menos MB, menos parsing, misma semántica. El recorte geográfico (--bounding-box) reduce feeds nacionales a Madrid/área de interés.
- Diagnóstico de feeds rotos:
gtfstidy -v feed.zip detecta referencias rotas, headways inválidos, coordenadas 0,0, códigos ISO de idioma… complemento ligero del MobilityData GTFS Validator.
- Planes de movilidad (plandemovilidad):
calendar_dates inflados por operadores españoles → -c los convierte en patrones de calendario legibles.
- Preparación para GIS: encadenar con
gtfs2shp (validar con -v, sanear -eDnz, exportar shapes/stations a QGIS).
Pitfalls
- Minimizar IDs (
-i/-d) ROMPE referencias externas (GTFS-RT, apps propias, dashboards que cacheen trip_ids). Si el feed se consume desde fuera: --keep-ids o no usar -i/-d. --Compress (mayúscula) incluye -d → destruye referencias externas por diseño.
--output sin .zip escribe un directorio; para zip pon -o salida.zip (error común: sin extensión → carpeta sorpresa).
-T reescribe la realidad: trips explícitos se funden en frecuencias. Semánticamente equivalente para el viajero, pero quien liste trips.txt verá muchos menos trips.
--bounding-box/--polygon cortan trips a mitad salvo --complete-filtered-trips.
-D silencia errores borrando datos: en feeds oficiales usa SIEMPRE primero --fix (-eDnz -p '-') y revisa el diff de recuentos antes de aceptar -D masivo.
- Filtro de fechas:
-date-start / -date-end como YYYYMMDD.
- El repo original estaba en
bfreuer/gtfstidy → ahora patrickbr/gtfstidy (fork mantenido, más activo).
Verificación
gtfstidy -v feed.zip sin errores (o lista clara de ellos) → base para decidir processors.
- Tras procesar: comparar recuentos de
trips.txt/stop_times.txt (antes vs. después) y abrir el zip de salida en el visor GTFS propio (gtfs-box / node-gtfs) — debe reproducir las mismas rutas y horarios.
- Si se usó
-T: comprobar en frequencies.txt que los headways generados son plausibles (min-headway/max-headway).
Comparativa de alternativas (consultado 2026-09-04)
- MobilityData/gtfs-validator (Java): validación oficial más exhaustiva, pero sin capacidad de sanear/minimizar. gtfstidy = saneador + validador ligero; gtfs-validator = auditor certificado.
- gtfs-kit (Python): para análisis en notebook, no para limpiar feeds.
- gtfs-manager (skill
mobility/gtfs-manager): gestión/edición interactiva de feeds locales.
Referencias
- Repo:
github.com/patrickbr/gtfstidy (148⭐)
Comparativa de alternativas
- patrickbr/gtfstidy — tidy GTFS en Go que minimiza tamaño y corrige inconsistencias con equivalencia semántica; una alternativa de validación/limpieza escrita en Go.
- Paper
-T: Bast & Storandt, SIGSPATIAL 2014 (frequency extraction, CAP).
- Registry:
patrickbr/gtfstidy — auditado v2.0.0 el 2026-09-04 contra README + gtfstidy.go (v1 tenía CLI inventado: --input/--output, --validate, --info).
1---2name: gtfs-tidy3description: GTFS Tidy — validación y minimización de feeds GTFS con CLI Go (semánticamente equivalente).4license: GPL-2.0 (herramienta CLI; sin impacto al invocarla desde pipelin5---67# GTFS Tidy — Limpieza y Validación de Feeds GTFS89## Qué es1011`gtfstidy` (github.com/patrickbr/gtfstidy, Go, GPL-2.0, 149⭐, push 2026-08) es el CLI de referencia para **comprobar, sanear y minimizar feeds GTFS**. Garantía central: la salida es **semánticamente equivalente** al input — mismos trips con mismos atributos desde la perspectiva del viajero. Del mismo autor que `gtfs2shp` (herramienta hermana), muy usado en pipelines de datos de transporte.1213Dato de peso (medido en su README): feed Suiza → `calendar_dates.txt` de 4,38M líneas/113MB a 456K líneas/6.6MB, y zip total 80MB→63MB. Praga → 16MB→9.4MB.1415## Instalación1617```bash18go install github.com/patrickbr/gtfstidy@latest # o binarios en Releases19gtfstidy --help20```2122## Uso2324```bash25# Salida: -o <dir> suelta o -o archivo.zip (el .zip es OBLIGATORIO para zip)26gtfstidy -v feed.zip # solo validación (no processors)27gtfstidy -W feed.zip -o salida.zip # validar + mostrar avisos28gtfstidy -eDnz -p '-' feed.zip -o s.zip # --fix: sanear sin minimizar29gtfstidy --compress feed.zip -o s.zip # -OSRCcIAP: minimización segura30gtfstidy --Compress feed.zip -o s.zip # + -T y emparejamiento difuso: máxima compresión31gtfstidy -SCRmTcdsOeD feed.zip -o s.zip # proceso completo (flags sueltos, orden interno fijo)32gtfstidy feed.zip -o s.zip --bounding-box -4.0,39.9,-3.0,40.6 # recorte geográfico33gtfstidy feed.zip -o s.zip --polygon-file madrid.geojson # filtro por GeoJSON34gtfstidy feed.zip -o s.zip -M 2,3 -N 7 # filtrar por modo (metro+tren, sin ferri)35```3637## Flags de procesadores (verificados en `gtfstidy.go`)3839| Flag | Qué hace |40|---|---|41| `-e` | valores por defecto GTFS en lugar de errores (campos no requeridos) |42| `-z` | arregla jerarquía del ZIP |43| `-n` | detecta coordenadas (0,0) |44| `-p <str>` | rellena campos requeridos vacíos no críticos |45| `-D` | **elimina** entradas erróneas (cascada: borra trips/stops huérfanos) → subconjunto sin errores |46| `-O [lista]` | elimina entidades huérfanas (all,agency,routes,services,shapes,stops,transfers,trips) |47| `-m` / `-r` | remide `shape_dist_traveled` / stop_times (rellena huecos interpolando) |48| `-s` | minimiza geometrías (Douglas-Peucker, ε≈1m en EPSG:3857; **implica -m**) |49| `-S` / `-R` / `-C` / `-P` / `-I` / `-A` | eliminan duplicados: shapes, rutas, servicios, paradas/niveles, trips, agencias |50| `-c` | minimiza `calendar.txt` + `calendar_dates.txt` (cobertura óptima rango/excepción) |51| `-T` | comprime trips explícitos en `frequencies.txt` (algoritmo CAP de Bast & Storandt; `-min-headway`/`-max-headway` lo acotan) |52| `-i` / `-d` | IDs densos numéricos / base-36 |53| `-E` | reclusteriza paradas (`-recluster-stops-dist` 75m, `-recluster-stops-simi` 0.55) |54| `-M` / `-N` | mantener / descartar lista de MOTs (1 tranvía, 2 metro, 3 tren, 4 bus, 5 barco, 6 teleférico, 7 ferri) |55| `-F` | conserva columnas extra no-GTFS del input |56| `--keep-*` | preserva IDs externos: `--keep-ids`, `--keep-trip-ids`, `--keep-route-ids`, `--keep-shape-ids`, `--keep-station-ids`, `--keep-service-ids`, `--keep-block-ids`... |5758Regla mnemotécnica: **mayúsculas ELIMINAN o fusionan** entidades; minúsculas modifican.5960## Orden de procesado (fijo, independiente del orden de flags)61621. `-e` defaults → 2. `-D` drop errores → 3. `-O` huérfanos → 4. `-m` remedir → 5. `-s` minimizar shapes → 6. `-S` → 7. `-R` → 8. `-C` → 9. `-c` → 10. `-T` → 11. `-i`/`-d` IDs.6364## Casos de uso para David6566- **Prefiltro en GBFSSpain / GTFS Spain**: antes de cargar feeds oficiales (Cercanías, EMT, metro) en el visor o en SQLite (node-gtfs), pasar `--compress` → menos MB, menos parsing, misma semántica. El recorte geográfico (`--bounding-box`) reduce feeds nacionales a Madrid/área de interés.67- **Diagnóstico de feeds rotos**: `gtfstidy -v feed.zip` detecta referencias rotas, headways inválidos, coordenadas 0,0, códigos ISO de idioma… complemento ligero del MobilityData GTFS Validator.68- **Planes de movilidad (plandemovilidad)**: `calendar_dates` inflados por operadores españoles → `-c` los convierte en patrones de calendario legibles.69- **Preparación para GIS**: encadenar con `gtfs2shp` (validar con `-v`, sanear `-eDnz`, exportar shapes/stations a QGIS).7071## Pitfalls7273- **Minimizar IDs (`-i`/`-d`) ROMPE referencias externas** (GTFS-RT, apps propias, dashboards que cacheen trip_ids). Si el feed se consume desde fuera: `--keep-ids` o no usar `-i`/`-d`. `--Compress` (mayúscula) incluye `-d` → **destruye referencias externas** por diseño.74- `--output` sin `.zip` escribe un **directorio**; para zip pon `-o salida.zip` (error común: sin extensión → carpeta sorpresa).75- `-T` reescribe la realidad: trips explícitos se funden en frecuencias. Semánticamente equivalente para el viajero, pero quien liste `trips.txt` verá muchos menos trips.76- `--bounding-box`/`--polygon` **cortan trips a mitad** salvo `--complete-filtered-trips`.77- `-D` silencia errores borrando datos: en feeds oficiales usa SIEMPRE primero `--fix` (`-eDnz -p '-'`) y revisa el diff de recuentos antes de aceptar `-D` masivo.78- Filtro de fechas: `-date-start` / `-date-end` como `YYYYMMDD`.79- El repo original estaba en `bfreuer/gtfstidy` → ahora `patrickbr/gtfstidy` (fork mantenido, más activo).8081## Verificación82831. `gtfstidy -v feed.zip` sin errores (o lista clara de ellos) → base para decidir processors.842. Tras procesar: comparar recuentos de `trips.txt`/`stop_times.txt` (antes vs. después) y abrir el zip de salida en el visor GTFS propio (gtfs-box / node-gtfs) — debe reproducir las mismas rutas y horarios.853. Si se usó `-T`: comprobar en `frequencies.txt` que los headways generados son plausibles (`min-headway`/`max-headway`).8687## Comparativa de alternativas (consultado 2026-09-04)8889- **MobilityData/gtfs-validator** (Java): validación oficial más exhaustiva, pero sin capacidad de *sanear/minimizar*. gtfstidy = saneador + validador ligero; gtfs-validator = auditor certificado.90- **gtfs-kit** (Python): para análisis en notebook, no para limpiar feeds.91- **gtfs-manager** (skill `mobility/gtfs-manager`): gestión/edición interactiva de feeds locales.9293## Referencias9495- Repo: `github.com/patrickbr/gtfstidy` (148⭐)9697## Comparativa de alternativas9899- **[patrickbr/gtfstidy](https://github.com/patrickbr/gtfstidy)** — tidy GTFS en Go que minimiza tamaño y corrige inconsistencias con equivalencia semántica; una alternativa de validación/limpieza escrita en Go.100- Paper `-T`: Bast & Storandt, SIGSPATIAL 2014 (frequency extraction, CAP).101- Registry: `patrickbr/gtfstidy` — auditado v2.0.0 el 2026-09-04 contra README + `gtfstidy.go` (v1 tenía CLI inventado: `--input/--output`, `--validate`, `--info`).