← Metodología / 4. Estándar GTFS / 4.3 Creación de un feed GTFS / 4.3.1 Método "artesanal"

4.3.1 Método "artesanal"

Esta página describe una forma artesanal de crear un feed GTFS: el trabajo se arma paso a paso, con exportaciones, hojas de cálculo y validaciones manuales, en lugar de un flujo completamente automático. Es necesario aclarar que sí existen herramientas específicas para asistir en la creación de GTFS, tanto libres como de pago, que son de mucha utilidad para acelerar el proceso de creación, validación y revisión del resultado.

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
Latitud
Longitud
Ejemplo de tabla de atributos
  1. 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.

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.

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
agency_idagency_nameagency_urlagency_timezone
MOVILIDAD_ZMRDirección de Movilidad de Zamorahttps://zamora.gob.mxAmerica/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
route_idroute_short_nameroute_long_nameroute_typeroute_color
RUTA-011Centro - Hospital General3E63F2A
RUTA-022Central Camionera - Tecnológico33A7DE6

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
service_idmondaytuesdaywednesdaythursdayfridaysaturdaysundaystart_dateend_date
LUN-VIE11111002024010120241231
SABADO00000102024010120241231
DOMINGO00000012024010120241231

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
trip_idroute_idservice_idtrip_headsignshape_id
R1-IDA-LVRUTA-01LUN-VIEHospital GeneralSHAPE-R1-IDA
R1-VTA-LVRUTA-01LUN-VIECentroSHAPE-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
trip_idarrival_timedeparture_timestop_idstop_sequence
R1-IDA-LV07:00:0007:00:30PAR-0011
R1-IDA-LV07:04:0007:04:30PAR-0022
R1-IDA-LV07:09:0007:09:30PAR-0033

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
trip_idstart_timeend_timeheadway_secs
R1-IDA-LV06:00:0022:00:00600

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

feed_info.txt

Archivo opcional que describe el propio feed — quién lo publicó, en qué idioma y cuándo fue creado. No es obligatorio, pero muchas plataformas lo usan para mostrar información de la fuente y para detectar actualizaciones.

feed_publisher_name,feed_publisher_url,feed_lang,feed_start_date,feed_end_date
Dirección de Movilidad de Zamora,https://zamora.gob.mx,es,20240101,20241231
feed_publisher_namefeed_publisher_urlfeed_langfeed_start_datefeed_end_date
Dirección de Movilidad de Zamorahttps://zamora.gob.mxes2024010120241231

El campo feed_lang es el idioma del contenido textual del feed (código ISO 639-1). Para datos en español: es.

fare_attributes.txt y fare_rules.txt

← Metodología / 4. Estándar GTFS / 4.3 Creación de un feed GTFS / 4.3.1 Método "artesanal"