← Metodología / 4. Estándar GTFS / 4.2 Crear un feed GTFS

4.2 Crear un feed GTFS

Crear un feed GTFS desde los datos producidos en el mapeo no requiere software especializado. El proceso tiene dos partes: extraer las coordenadas de paradas y recorridos desde QGIS, y construir las tablas del estándar en una hoja de cálculo. Al final se empaqueta todo en un archivo ZIP.

Esta guía asume que ya tienes las trazas GPS de los recorridos procesadas y verificadas y un listado de paradas con sus coordenadas. Si aún no llegaste a esa etapa, el módulo de mapeo de escritorio cubre ese proceso.

Herramientas necesarias

  • QGIS — para exportar coordenadas de paradas y generar el archivo de shapes. qgis.org
  • Hoja de cálculo — LibreOffice Calc o Google Sheets. Microsoft Excel también funciona, con una precaución que se menciona más adelante.
  • Editor de texto simple — para verificar los archivos si es necesario.

No se requiere experiencia en programación.

Paso 1 — Exportar las paradas desde QGIS

Las paradas del sistema de transporte deben estar en QGIS como una capa de puntos, con al menos un identificador y un nombre por parada.

  1. Abre la tabla de atributos de la capa de paradas (clic derecho → Abrir tabla de atributos).
  2. Verifica que existan columnas para stop_id (un código único) y stop_name (nombre de la parada). Si no existen, créalas con la calculadora de campos.
  3. Para obtener las coordenadas, usa la Calculadora de campos para añadir dos columnas numéricas:
    • stop_lat — con la expresión $y
    • stop_lon — con la expresión $x
  4. Exporta la capa como CSV (clic derecho → Exportar → Guardar objetos como → CSV). Asegúrate de que el sistema de referencia de coordenadas sea WGS 84 (EPSG:4326) antes de exportar.
Exportar la capa de paradas como CSV desde QGIS. El sistema de coordenadas debe ser WGS 84.
Exportar la capa de paradas como CSV desde QGIS. El sistema de coordenadas debe ser WGS 84.

El archivo CSV resultante tiene las columnas necesarias para stops.txt. Solo hay que renombrarlo.

Paso 2 — Exportar los recorridos (shapes) desde QGIS

Las trazas GPS procesadas deben estar en QGIS como una capa de líneas — una línea por cada recorrido (ida y vuelta de cada ruta como líneas separadas).

La forma más directa de generar shapes.txt desde QGIS es extraer los vértices de esas líneas:

  1. En el menú Vectorial → Herramientas de geometría → Extraer vértices.
  2. Selecciona la capa de recorridos como entrada.
  3. El resultado es una capa de puntos donde cada punto es un vértice de la línea original, con su orden guardado en el campo vertex_index.
  4. Añade el identificador del shape (ej. SHAPE-R1-IDA) como columna, ya sea editando la capa o con la calculadora de campos.
  5. Exporta como CSV con coordenadas WGS 84.

El CSV resultante tiene la estructura de shapes.txt — solo hay que renombrar las columnas (vertex_indexshape_pt_sequence, $yshape_pt_lat, $xshape_pt_lon).

Extraer vértices de las líneas de recorrido en QGIS. Cada vértice se convierte en una fila del archivo shapes.txt.
Extraer vértices de las líneas de recorrido en QGIS. Cada vértice se convierte en una fila del archivo shapes.txt.

Paso 3 — Construir las tablas en hoja de cálculo

Con las coordenadas ya exportadas, el resto del trabajo es estructurar las relaciones del sistema en una hoja de cálculo. Crea un libro con una pestaña para cada archivo GTFS.

agency.txt

Una sola fila con los datos de la organización responsable:

agency_id,agency_name,agency_url,agency_timezone
MOVILIDAD_ZMR,Dirección de Movilidad de Zamora,https://zamora.gob.mx,America/Mexico_City

routes.txt

Una fila por cada ruta del sistema:

route_id,route_short_name,route_long_name,route_type,route_color
RUTA-01,1,Centro - Hospital General,3,E63F2A
RUTA-02,2,Central Camionera - Tecnológico,3,3A7DE6

El route_type 3 corresponde a autobús. El color es opcional pero recomendable si las rutas tienen colores identificables — se expresa en hexadecimal sin el símbolo #.

calendar.txt

Define los patrones de días de operación. La mayoría de los sistemas municipales necesitan dos o tres entradas:

service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date
LUN-VIE,1,1,1,1,1,0,0,20240101,20241231
SABADO,0,0,0,0,0,1,0,20240101,20241231
DOMINGO,0,0,0,0,0,0,1,20240101,20241231

Las fechas de inicio y fin se escriben en formato YYYYMMDD. Hay que actualizar estas fechas periódicamente para que el feed no quede como “vencido” en las aplicaciones.

trips.txt

Una fila por cada viaje — cada salida programada de cada ruta. Si la Ruta 1 tiene 20 salidas diarias en días de semana, más la vuelta, hay 40 viajes solo para días de semana laborables.

Para sistemas con horarios aproximados, puede simplificarse a una sola salida representativa por dirección y usar después frequencies.txt para indicar la frecuencia del servicio. Esto se explica más abajo.

trip_id,route_id,service_id,trip_headsign,shape_id
R1-IDA-LV,RUTA-01,LUN-VIE,Hospital General,SHAPE-R1-IDA
R1-VTA-LV,RUTA-01,LUN-VIE,Centro,SHAPE-R1-VTA

stop_times.txt

El archivo más laborioso. Cada viaje necesita una fila por parada, con su hora de llegada.

Si tienes horarios reales — horarios proporcionados por los operadores o medidos en campo — úsalos directamente.

Si no tienes horarios exactos — que es lo más común en sistemas concesionados informales — usa tiempos interpolados:

  1. Registra la hora de salida desde el origen y la hora de llegada al destino final (medibles fácilmente con cualquier cronómetro durante un viaje de campo).

  2. Calcula la distancia acumulada hasta cada parada desde el origen (QGIS puede hacer esto con la herramienta de medición sobre la capa de shapes).

  3. Distribuye el tiempo total proporcionalmente a la distancia:

    tiempo_parada = hora_salida + (distancia_acumulada / distancia_total) × tiempo_total

Esto no es perfecto, pero refleja la realidad mejor que inventar números. Las aplicaciones de planificación lo aceptan y pueden calcular tiempos de viaje razonables.

trip_id,arrival_time,departure_time,stop_id,stop_sequence
R1-IDA-LV,07:00:00,07:00:30,PAR-001,1
R1-IDA-LV,07:04:00,07:04:30,PAR-002,2
R1-IDA-LV,07:09:00,07:09:30,PAR-003,3

frequencies.txt (alternativa para sistemas sin horarios fijos)

Si el sistema opera bajo frecuencia — “pasa cada 10 minutos” — en lugar de horarios fijos, se puede usar frequencies.txt en lugar de definir un viaje por cada salida. Esto simplifica enormemente la construcción del feed.

Con este enfoque, se define un solo viaje plantilla por dirección en trips.txt y stop_times.txt (con los tiempos relativos desde 00:00:00), y en frequencies.txt se especifica durante qué horas opera ese viaje y con qué intervalo:

trip_id,start_time,end_time,headway_secs
R1-IDA-LV,06:00:00,22:00:00,600

El campo headway_secs es el intervalo entre vehículos en segundos — 600 segundos equivale a un camión cada 10 minutos.

Comparación entre modelado por horarios (izquierda) y por frecuencias (derecha). Para sistemas con intervalos regulares, frequencies.txt simplifica significativamente el feed.
Comparación entre modelado por horarios (izquierda) y por frecuencias (derecha). Para sistemas con intervalos regulares, frequencies.txt simplifica significativamente el feed.

Paso 4 — Exportar y empaquetar

Cuando todas las tablas estén completas:

  1. Exporta cada pestaña de la hoja de cálculo como CSV (delimitado por comas). En LibreOffice: Archivo → Guardar como → Texto CSV. En Google Sheets: Archivo → Descargar → CSV.

  2. Renombra cada archivo para que tenga extensión .txtagency.txt, stops.txt, etc. El contenido es el mismo que un CSV; solo cambia la extensión.

  3. Verifica la codificación de caracteres. Los archivos deben estar en UTF-8 para que los acentos y la ñ se muestren correctamente. LibreOffice y Google Sheets exportan en UTF-8 por defecto. Excel en Windows puede usar otras codificaciones — si el validador reporta problemas con caracteres especiales, es probable que sea por esto.

  4. Selecciona todos los archivos .txt y comprímelos en un ZIP. Importante: comprime los archivos directamente, no la carpeta que los contiene. Al abrir el ZIP deben aparecer directamente los .txt, no una carpeta.

Estructura correcta del archivo ZIP. Los archivos .txt deben estar en la raíz del ZIP, no dentro de una carpeta.
Estructura correcta del archivo ZIP. Los archivos .txt deben estar en la raíz del ZIP, no dentro de una carpeta.

El archivo resultante — gtfs.zip — está listo para validar.

Recomendaciones prácticas

Usa identificadores estables. Los stop_id, route_id y trip_id no deberían cambiar entre versiones del feed a menos que la entidad real cambie. Si una parada siempre tiene el mismo ID, las aplicaciones pueden guardar favoritos y referencias sin que se rompan con cada actualización.

Nombres útiles para los usuarios. Los stop_name y route_long_name son lo que los usuarios leen en la aplicación. Evita abreviaturas que solo tienen sentido internamente. “Av. Insurgentes esq. Morelos” es más útil que “INS-MOR-N”.

Mantén un registro de los IDs usados. Una hoja separada con todos los identificadores del sistema — paradas, rutas, viajes — evita duplicados y facilita las actualizaciones futuras.

Empieza simple. Un feed con pocos archivos y datos aproximados es mejor que ningún feed. La calidad se puede mejorar en versiones posteriores. Lo importante es publicar y mantener el ciclo de actualización.

← Metodología / 4. Estándar GTFS / 4.2 Crear un feed GTFS