De dónde salen los datos
Tres fuentes, y cada una sabe una cosa distinta.
Los autobuses que ves llegar
Avanza Zaragoza · gps.avanzabus.com
Se piden en directo, uno por parada, y se guardan 15 segundos para no molestar. La pantalla escribe siempre la edad del dato: no decimos «se actualiza cada 20 s», decimos cuándo se miró de verdad.
⚠️ Son los autobuses DETECTADOS, no todos: Avanza anuncia como mucho los dos siguientes de cada línea y sentido. Un tercero muy pegado a otros dos existe, circula lleno de gente, y no lo publica nadie.
Las paradas, las líneas y los recorridos
GTFS oficial · Punto de Acceso Nacional (NAP) del Ministerio de Transportes
Se descarga y se hornea en el build. Nada se pide en caliente. Publica Avanza Zaragoza S.A.U. Vigencia: hasta el 2026-10-05. Generado el 24/7/2026. Cuando caduque, la aplicación lo dice arriba, en rojo, sin que nadie tenga que acordarse.
⚠️ Pero su calendario no es de fiar, y los horarios ya no salen de aquí. A veces dice que una línea no circula hoy y la línea circula: lo vimos en la 44, con cero viajes en el feed mientras sus autobuses salían en el tiempo real. Del GTFS usamos la topología; la hora se la preguntamos al operador.
Los horarios de hoy y los avisos de cada línea
Avanza Zaragoza · página de línea (zaragoza.avanzagrupo.com)
De aquí salen las primeras y últimas salidas de hoy —hora, desde y hasta— y la frecuencia media, tal y como las publica el operador. Son del día: si hoy una línea acorta su terminal, la tabla lo dice. Se rasca una vez al día. Son horas de salida (de cabecera), no la hora a la que el bus pasa por tu parada.
⚠️ El texto de «Información adicional» lo mantienen ellos a mano, y lo enseñamos tal cual: es una cita según Avanza, no una afirmación nuestra. Si lo dejan viejo, no lo podemos saber.
Los nombres de las paradas
GTFS + Avanza. Y el GTFS los trae rotos.
El GTFS pasa los nombres por un ucwords() y los destroza: «Pedro III» sale «Pedro Iii»; «Alhama de Aragón», «Alhama De Aragón». Medido: el operador escribe distinto el 0 % de los que podemos comparar (0 de 0). Por eso el nombre bueno se le pide a Avanza.
⚠️ Las 934 paradas que Avanza no da hoy se quedan con el del GTFS y van marcadas como «nombre sin confirmar». No se corrige a mano ni uno: de «Pedro Iii» no se recupera «Pedro III» sin adivinar.
Los destinos de las líneas
GTFS (trip_headsign). Con el mismo ucwords roto.
El destino que ves arriba de una línea («Hacia Siglo XXI») y en la home sale del mismo GTFS, con el mismo ucwords(): «Siglo XXI» llegaba como «Siglo Xxi», «Aljafería» como «Aljaferia», «San José» como «San Jose», y hasta un numeral deletreado —«Plaza Emperador Carlos V» venía como «Carlos Quinto»—. Aquí sí se corrigen a mano, y es la diferencia con las paradas: son un puñado de topónimos conocidos de Zaragoza —no cientos— y no hay una fuente limpia que pedir. La forma correcta es un hecho del callejero, no una adivinanza.
⚠️ Por eso el destino corregido ya no es una cita literal —lo hemos reescrito—: se protege de la traducción automática del navegador, pero no se marca como verbatim. Y la línea 60 es el cabo suelto: su GTFS dice «Actur-Rey Fernando» y la web de Avanza «Valle de Broto». Son dos fuentes que no coinciden y no sabemos cuál es la de hoy: se muestra la del GTFS, sin inventar.
Y hay un paso más, que ya no es ortografía: a veces el GTFS dice algo distinto de lo que la línea es, y manda el conocimiento de campo. La barra no separa dos destinos: nombra una zona. La cabecera de la 21 es «Oliver / Miralbueno» (el GTFS solo pone «Miralbueno») y la de la 28 es «Montañana / Peñaflor». No se parte por la barra. Y las lanzaderas C1 y C4 vienen con los sentidos mal emparejados: su par de destinos se pone a mano. Son decisiones apuntadas como tales, no limpiezas.
La ficha de cada autobús — 403 vehículos
Cuatro niveles de procedencia. La ficha de la parada los pinta todos IGUAL; aquí es donde se cuentan y se explican.
| Marca | Veh. | Fuente |
|---|---|---|
| — | 350 | Anexo 5 del pliego municipalDocumento público. Es la norma: no se marca. |
| * | 14 | busesmadrid.esEspecializada y citable, pero NO oficial. |
| † | 36 | Visto en servicio, con fechaLo afirmamos nosotros. La más débil. |
| ? | 3 | Fichero heredadoSin fuente. Puede ser correcto; no se demuestra. |
— 350 oficiales · Modelo, longitud, clase y combustible salen del registro de flota adscrita al contrato (expediente 0034140-25), aprobado por el Gobierno de Zaragoza el 24/10/2025 — ficha del expediente. ⚠️ Ese pliego está pendiente de adjudicar: describe la flota a octubre de 2025, y no es un censo de lo que circula hoy.
* 14 de busesmadrid · Circulan y no están en el pliego: eléctricos entregados después de octubre de 2025. Su ficha sale de busesmadrid.es. Es muy buena, pero no es oficial: donde es la única fuente, un error suyo no lo podemos detectar — y por eso llevan asterisco. De ahí sacamos matrícula, modelo y propulsión; la longitud no la publica, así que no la decimos (un articulado sale como «Articulado», sin metros: deducirla del modelo sería inventar).
† 36 vistos en servicio · No aparecen en ninguna fuente publicada. Lo afirmamos nosotros, con nombre y fecha, y queda en el historial del proyecto. No es un apaño: la flota real va siempre por delante de sus fuentes —el pliego es de octubre de 2025 y ni siquiera está adjudicado—, y un autobús llega a la calle mucho antes que a un documento. ⚠️ Es la fuente más débil: si mañana el registro oficial dice otra cosa, manda el registro, pero la contradicción se anota, no se borra.
? 3 sin procedencia · No constan en ninguna parte: ni en el pliego, ni en busesmadrid. Vienen de un fichero heredado del proyecto anterior, sin matrícula y sin procedencia documentada. No se disfrazan de oficiales —su procedencia se cuenta aquí—, pero tampoco se les grita encima: es probable que el dato sea correcto, simplemente no lo podemos demostrar.
Los límites, dichos en voz alta
Lo que sabemos ver, lo que no, y lo que pasa cuando no sabemos.
Los desvíos que SÍ detectamos
Cruce: recorrido oficial (GTFS) × ruta real de hoy (Avanza)
El recorrido que ves es el de hoy —la ruta que Avanza publica para esta jornada—, no el plano oficial, haya desvío o no. Lo comparamos con el recorrido oficial del GTFS: lo que está en el GTFS y no en la ruta de hoy, el autobús ya no pasa, y se tacha; lo que está en la ruta y no en el GTFS: parada provisional, y se pinta como tal. (Si esa ruta de hoy no se puede leer, se pinta el oficial y se avisa.)
Se auto-apaga: el día que restauren la calle las dos listas vuelven a coincidir y el aviso desaparece solo. No hay ninguna lista de desvíos que mantener — y un aviso que hay que acordarse de apagar acaba mintiendo. Si el cruce sale absurdo, decimos «no lo sabemos» en vez de tachar media línea.
Eso es la vista de línea, que se comprueba al abrirla. Pero en una parada, la lista de «líneas que pasan por aquí» —y las que hoy pasan por un desvío— sale de un índice que se rehace cada noche, no en caliente. Así que puede ir hasta un día por detrás, y en las dos direcciones: un desvío que empieza hoy puede no aparecer hasta esta noche, y uno que terminó de madrugada puede seguir listado hasta la siguiente reconstrucción. La edad exacta de ese índice no la ponemos en la pantalla de la parada —sería ruido para quien espera el autobús—; vive en /api/diag y en el panel, con los postes provisionales que aún no tienen coordenada.
Lo que NO detectamos
La asimetría, dicha en voz alta.
Detectamos desvíos de ruta (el autobús no pasa por la calle): la ruta operativa cambia y la fuente lo refleja.
NO detectamos supresiones de parada (el autobús pasa pero no para). La ruta no cambia, así que ninguna fuente lo dice. Está comprobado: con el comunicado de Avanza diciendo por escrito que una parada estaba suprimida, su propia API seguía anunciando autobuses en ella. Ponen el cartel en la marquesina y no desconectan el poste.
Un autobús que no conocemos
Se dice. No se rellena.
Si Avanza anuncia un coche que no está en ninguna de las dos listas, la pantalla pone «Sin datos de este autobús». Nunca un valor por defecto: un valor por defecto miente, y encima con toda la confianza del mundo.