Skip to content
gtfs.media

Código abierto en el núcleo. Todo.

La plataforma gtfs.media es una suite de módulos GPL‑2.0+ para Drupal 10 y 11. El código que ejecuta nuestros despliegues gestionados es el código que puedes instalar tú mismo; no hay edición enterprise. Los ocho están publicados en drupal.org, cada uno con su propia documentación.

En lenguaje sencillo

Hay ocho módulos. Cada uno hace un trabajo diferente.

Uno lee el archivo de horarios. Uno lee los feeds en vivo. Uno dibuja pantallas para paradas. Uno dibuja mapas. Uno hace horarios. Uno añade los archivos extra usados en el Área de la Bahía.

Instalas solo los que necesitas.

Todos son de uso y modificación gratuitos.

Ocho módulos Drupal, cinco capas

Cada capa depende solo de las que están debajo. Usa solo el núcleo de datos, añade tiempo real o ejecuta la pila completa de pantallas.

Diagrama de pila de módulos: gtfs en la base; gtfs_rt encima; gtfs_display encima de ese; luego gtfs_display_map y gtfs_display_map_rt; aprovisionamiento y complementos al lado.

La suite

drupal/gtfs

Importa el feed GTFS publicado de una agencia y obtiene sus rutas, paradas, viajes y calendarios como contenido real — la base de la que lee cada otro módulo de la suite.

Cada archivo de la especificación se convierte en su propia entidad de contenido. El importador lee un zip remoto y actualiza filas en su lugar, así que un cambio de servicio es una reimportación en lugar de un borrado y recarga, y cualquier cosa que un equipo añadió manualmente sobrevive.

El almacenamiento es una entidad de contenido gtfs_row agrupada por gtfs_filename, con un plugin GTFSFile por archivo que mapea columnas a campos y resuelve referencias a través de un tipo de campo gtfs_row_reference. Como los bundles son plugins, un feed que contiene archivos fuera de la especificación es un nuevo plugin, no un módulo parcheado.

Se comporta como contenido, así que el resto de Drupal funciona con él: datos de Views para listados, tokens para valores de feed, Pathauto para alias, y los alias de Pathauto sobreviven, con traducción para cadenas orientadas al pasajero. Los feeds son entidades gtfs_feed direccionadas por un alias seguro para URLs, así que una instalación puede servir varias agencias o varias versiones del mismo feed en paralelo.

Drush cubre las rutas automatizadas — gtfs:feed:import, gtfs:feed:refresh, gtfs:feed:audit para un diff entre versiones, más gtfs:feed:delete y gtfs:cleanup:orphans. Un submódulo opcional gtfs_fares cubre atributos de tarifas, reglas, productos, medios, categorías de pasajeros y las reglas de tramos y transferencias.

Proporciona 29 de los 33 endpoints documentados — todo bajo /feeds/, más la raíz de descubrimiento en la referencia de la API.

drupal.org/project/gtfs

drupal/gtfs_rt

Convierte tus feeds GTFS-Realtime Protobuf en JSON que tu propio frontend, aplicaciones y pantallas pueden leer, sin que ninguno de ellos enlace una biblioteca Protobuf.

Las actualizaciones de viajes, posiciones de vehículos y alertas de servicio se obtienen, decodifican y cachean del lado del servidor, luego se sirven a través de recursos REST: llegadas predichas en una parada, vehículos en una ruta y alertas que afectan a una entidad. La decodificación se ejecuta en gtfs-realtime-php, la biblioteca de enlace PHP que mantenemos para el protocolo GTFS-Realtime — gtfs-media/gtfs-realtime-php en Packagist, y útil por sí sola si quieres la decodificación sin el resto de la suite.

Cada feed es una entidad de configuración gtfs_rt_feed con su propio refresh_interval — 60 segundos por defecto — así que los feeds se despliegan con tu configuración y se mueven entre entornos como todo lo demás, en lugar de configurarse manualmente por entorno. Cron impulsa la actualización; el estado de la última obtención vive en la State API y aparece como meta.last_fetched en cada respuesta.

Dos detalles importan en producción. Las respuestas establecen un max-age de cero, para que un CDN delante del sitio no pueda servir las predicciones de ayer. Y un endpoint de actualización fuera de banda permite que una pantalla que solicita datos obsoletos active su propia actualización en lugar de esperar la siguiente ejecución de cron, que es lo que mantiene las pantallas activas calientes.

Donde un feed en tiempo real identifica paradas de manera diferente al horario — común, ya que muchas agencias publican stop_code en tiempo real y stop_id en el feed estático — un hook reconcilia los dos de forma centralizada en lugar de en cada consumidor.

Proporciona los tres endpoints /rt/ en la referencia de la API.

drupal.org/project/gtfs_rt

drupal/gtfs_display

Alimenta pantallas de información pública — una marquesina, una plataforma, un centro de tránsito, una pared de operaciones — desde los feeds que ya importas, en hardware viejo, desatendido y en una red que va y viene.

Una pantalla es una entidad de configuración display_context: qué entidad muestra, qué variante, con qué frecuencia se actualiza. Los contextos se despliegan a través de la sincronización de configuración, y un derivador de permisos genera un permiso por contexto para que un kiosco obtenga acceso anónimo exactamente a la pantalla que renderiza y nada más.

Las variantes son diseños en lugar de temas — lcd, eink, mobile — registradas a través de hook_gtfs_display_variants_alter(), con el shell adjuntando la biblioteca correspondiente automáticamente. Ocho hooks en total cubren resolución de variantes, bibliotecas y adjuntos del shell, mapeo de IDs en tiempo real, filtrado de anotaciones y eventos de dispositivo, que es cómo un módulo de agencia añade su propio diseño de hardware sin bifurcar nada.

Las notas del personal son entidades de contenido display_annotation: adjunta un mensaje a una parada o sustituye una entidad por otra, limitado a pantallas particulares y a horas particulares a través de office_hours.

El frontend es JavaScript vanilla sin dependencias — un almacén pub-sub, una capa de consultas con retroceso y corrección de desviación de reloj para paginación sincronizada multipantalla, una capa de renderizado declarativo y un service worker que mantiene los últimos datos buenos en pantalla cuando la red cae. Las pantallas se renderizan anónimamente y omiten el theming del sitio, así que un kiosco no lleva sesión ni ninguna de tu carga de frontend.

Proporciona el endpoint de anotaciones en la referencia de la API.

drupal.org/project/gtfs_display

drupal/gtfs_display_map

Dibuja trazados de rutas y geometría de paradas de tu feed importado, en cualquier lugar donde Drupal renderice un campo.

Un campo calculado Geodata en las filas GTFS lleva la geometría, y un formateador de campo lo renderiza con MapLibre GL. Como es un formateador de campo, una ruta o parada puede mostrar su propio mapa a través de los ajustes de visualización normales — sin override de plantilla, y funciona en cualquier view mode que ya tengas.

Lo que aparece cuando alguien toca una parada es un view mode de tooltip de mapa que configuras por bundle, así que el popup es configuración en lugar de markup. Una URL de estilo de mapa base global del sitio significa que cambiar la cartografía es un cambio de configuración, y cada mapa lo sigue.

drupal.org/project/gtfs_display_map

drupal/gtfs_display_map_rt

Pon vehículos en vivo en esos mapas, y dale a tu sitio web principal uno integrable — sin importar con qué esté construido ese sitio.

Los marcadores de vehículos llevan flechas de dirección y etiquetas de ruta y se actualizan en cada ciclo de consulta, leyendo de tu propia ingesta en tiempo real en lugar de un servicio de predicción de terceros. Los puntos de parada abren predicciones de llegada al hacer clic, y el trazado de la ruta se dibuja en el color propio de la ruta. Los iconos por defecto son glifos Maki seleccionados por route_type de GTFS; un módulo de agencia proporciona libreas por vehículo a través de un hook, lo que mantiene el arte de flota fuera del módulo compartido.

La integración es la razón por la que este módulo es separado. Añade una variante de pantalla map en una URL predecible, establece CSP frame-ancestors desde configuración en lugar de dejar el enmarcado abierto, y envía un handshake postMessage para que la página anfitriona pueda revelar la integración o colapsarla cuando no hay nada que mostrar. Los parámetros de URL cubren la integración con la página anfitriona — abrir el popup de una parada al cargar, ocultar etiquetas o enlazar nombres de paradas de vuelta a páginas en el sitio que integra.

drupal.org/project/gtfs_display_map_rt

drupal/gtfs_schedule

Publica horarios legibles — paradas en el lado, viajes a lo ancho, horas en las celdas — del mismo feed, en el mismo sitio o en uno diferente.

Una página de horario por ruta en un patrón de URL que tú controlas, ensamblada del lado del servidor para que la cuadrícula llegue lista para renderizar en lugar de como stop times sin procesar que pivotar en el navegador.

Se ejecuta contra una instalación de GTFS Utilities en el mismo sitio, o contra una remota a través de su API REST mediante un pequeño cliente de API. Ese segundo modo importa cuando el sitio web público y el importador de datos son construcciones separadas en ciclos de lanzamiento separados — el sitio de marketing puede renderizar horarios sin alojar el importador.

Solo puntos horarios por defecto, con la lista completa de paradas disponible, para que una ruta larga no produzca un muro ilegible de números. Una entidad de configuración route_stop_order maneja rutas donde la secuencia propia del feed no coincide con cómo los pasajeros leen la línea. Los encabezados de parada enlazan a las páginas de parada, así que un horario es una entrada al resto del sitio en lugar de un callejón sin salida.

drupal.org/project/gtfs_schedule

drupal/gtfs_plus

Evita que tu importador omita los archivos de extensión que tu región realmente publica.

GTFS+ es el conjunto de extensiones usado por la Metropolitan Transportation Commission y las agencias del Área de la Bahía que reportan a ella. Añade archivos que la especificación base no define, y este módulo le da a cada uno un tipo de entidad junto a los estándar — el mismo almacenamiento, los mismos datos de Views, el mismo tratamiento de API.

Cubiertos: directions para nombres de dirección legibles por ruta, timepoints para puntos horarios publicados, stop_attributes, farezone_attributes, calendar_attributes para descripciones de servicio, y rider_categories con fare_rider_categories vinculados a atributos de tarifas.

Los tres que se amortizan más rápido son realtime_routes, realtime_stops y realtime_trips — las tablas de mapeo que alinean un feed en tiempo real con el horario estático cuando los dos usan identificadores diferentes.

drupal.org/project/gtfs_plus

drupal/gtfs_511

Si eres un operador del Área de la Bahía, omite la contabilidad de feeds por completo: marca tu agencia en una lista y los feeds se configuran solos.

Una capa delgada de aprovisionamiento sobre la 511 SF Bay Open Data API. El almacenamiento y la importación siguen siendo GTFS Utilities y GTFS Realtime; lo que esto elimina son las URLs, los códigos de operador y las tres entidades de feed separadas que cada agencia necesita.

El formulario de configuración lee la lista de operadores en vivo desde 511 y la muestra como checkboxes, así que eliges de lo que la API realmente ofrece en lugar de transcribir códigos de un PDF. Seleccionar un operador crea su feed GTFS estático más los feeds en tiempo real de actualizaciones de viajes y posiciones de vehículos. La sincronización es idempotente — ejecútala de nuevo para capturar operadores añadidos o renombrados upstream.

El token de la API vive en una entidad Key en lugar de en configuración exportada, y los ajustes pueden guardarse sin sincronizar, para alinear operadores antes de importarlos.

drupal.org/project/gtfs_511 · Más para agencias del Área de la Bahía →

Por qué Drupal

Los datos de tránsito son contenido, y las agencias tienen equipos de contenido.

Compatible con

Las especificaciones que implementa la suite, las fuentes de feeds con las que ya ha funcionado y el software subyacente.

Cualquier publicador de GTFS y GTFS‑Realtime funciona; estos son con los que hemos trabajado.

Pon tu feed a trabajar.

Empieza con los módulos en tu propio sitio Drupal — y cuando prefieras entregar en lugar de alojar, estamos a un email de distancia.

hello@gtfs.media gtfs en drupal.org →