Vai al contenuto
Muovi Lazio
Tecnologia

Come l'AI ha trasformato i PDF degli orari bus del Lazio in un sito web

La storia di come un progetto nato dalla frustrazione di un pendolare ha usato l'intelligenza artificiale per estrarre orari bus da PDF illeggibili e crearci un sito consultabile.

·6 min di lettura

Un post su Facebook che ha cambiato tutto

Tutto è iniziato con un post su Facebook. Valerio Zappone, presidente del Comitato di Prato Rinaldo, aveva condiviso un aggiornamento sulle linee bus della zona. La risposta è stata immediata e inaspettata: decine di commenti di persone che non riuscivano a trovare gli orari delle loro linee, che si lamentavano di PDF enormi, che chiedevano aiuto per capire se il bus passava alle 7:15 o alle 7:45.

Il problema era evidente. Astral S.p.A., l'ente che coordina le Unità di Rete del trasporto pubblico del Lazio, pubblica gli orari in formato PDF. Non PDF moderni e navigabili, ma documenti da 150 e più pagine, pesanti circa 20 megabyte. Nel 2026, con tutta la tecnologia che si ha a disposizione, un pendolare deve scaricare un file enorme sul telefono, scorrere pagine e pagine di tabelle minuscole, e sperare di trovare la sua fermata.

Valerio ha deciso che si poteva fare di meglio. Da lì è nato Muovi Lazio: un sito web che prende quei PDF e li trasforma in qualcosa che chiunque può consultare in pochi secondi, anche alla fermata del bus con la connessione che va e viene.

Il problema tecnico: non è "solo un PDF"

Chi non ha mai provato a estrarre dati da un PDF potrebbe pensare: "Ma basta copiare e incollare una tabella". Magari fosse così semplice.

I PDF degli orari di Astral hanno diverse caratteristiche che li rendono particolarmente ostici:

Tabelle non strutturate. Le tabelle degli orari non sono vere tabelle digitali. Sono layout grafici: colonne di testo posizionate visivamente, senza una struttura dati sottostante. Copiare il contenuto produce un mix caotico di numeri e nomi.

Formati diversi tra zone. L'UDR3 (Valle del Sacco) ha orari con orario di partenza e di arrivo per ogni corsa, più le fermate intermedie. L'UDR5 (Valle dell'Aniene) ha solo l'orario di partenza e fermate diverse a seconda della direzione. Due formati completamente diversi per dati che dovrebbero essere omogenei.

Nomi delle fermate inconsistenti. La stessa stazione ferroviaria può apparire come "Stazione FS Zagarolo", "Staz.ne FS Zagarolo", "STZ FS Zagarolo" in pagine diverse dello stesso PDF. Per un essere umano è ovvio che si tratta dello stesso posto. Per un database, sono tre fermate diverse.

Footnote e asterischi. Alcune corse hanno note a piè di pagina con asterischi singoli o doppi che indicano varianti, limitazioni o servizi scolastici. Informazioni importanti, nascoste in fondo alla pagina.

I numeri del problema danno un'idea della scala: il progetto ha dovuto estrarre i dati di 95 linee bus, con 123 percorsi diversi (tra andate, ritorni e circolari), che toccano 796 fermate distribuite in 30 comuni, con 1.407 orari di partenza divisi per giorni feriali, prefestivi, festivi e scolastici.

Come l'intelligenza artificiale ha fatto la differenza

Qui entra in gioco l'AI. Il progetto ha usato Claude di Anthropic per il lavoro più pesante: leggere i PDF, comprendere la struttura delle tabelle, e produrre dati strutturati in formato CSV.

Il processo non è stato "dai il PDF all'AI e aspetta il risultato". È stato iterativo, controllato, e molto più sfumato di così.

Il flusso di lavoro, passo per passo

1. Lettura e comprensione. L'AI legge le pagine del PDF e identifica le tabelle degli orari. Non si limita a riconoscere i caratteri (quello lo fa qualsiasi OCR): capisce che una colonna di numeri sotto la scritta "Feriale" sono gli orari del lunedì-venerdì, che la riga in grassetto è il nome della linea, che l'asterisco rimanda a una nota in fondo.

2. Estrazione in CSV. I dati vengono convertiti in cinque file CSV strutturati: anagrafica linee, percorsi, fermate, sequenza fermate per percorso, e orari di partenza. Ogni file ha campi precisi e standardizzati.

3. Normalizzazione. I nomi delle fermate vengono uniformati. I codici operatore (come F16000 per COTRAL o GM001 per Guidonia) diventano la chiave per identificare univocamente ogni fermata fisica.

4. Deduplicazione. Qui succede la magia più importante. Lo stesso autobus che parte da Zagarolo e arriva a Pantano passa per fermate che appaiono anche in altre linee. Se due fermate hanno lo stesso codice operatore, sono la stessa fermata fisica. Il sistema le unisce automaticamente, conservando tutti i nomi con cui appaiono nei vari PDF (utile per le ricerche).

5. Generazione del database. Uno script TypeScript (generate-seed.ts) prende i CSV e genera automaticamente le istruzioni SQL per popolare il database. Usa un sistema di UUID deterministici: ogni fermata, linea e percorso riceve un identificatore unico calcolato a partire dai suoi dati. Stesso CSV in input = stesso database in output, sempre. Questo significa che i link, i preferiti salvati dagli utenti e le statistiche di utilizzo restano stabili anche quando i dati vengono aggiornati.

Perché non basta premere un bottone

Ogni volta che Astral pubblica nuovi PDF con orari aggiornati, il ciclo ricomincia. L'AI rilegge, rielabora, e Valerio verifica. Non è un processo automatico al 100%: c'è sempre un controllo umano, perché i PDF cambiano formato, aggiungono linee, o modificano il layout delle tabelle.

Questo è un punto importante: l'AI è uno strumento potente, ma non sostituisce il giudizio umano. Accelera enormemente un lavoro che a mano richiederebbe settimane, ma il risultato finale passa sempre attraverso una verifica.

Lo stack tecnico (per i curiosi)

Per chi è interessato al "come è fatto sotto il cofano", ecco una panoramica rapida dello stack tecnologico:

  • Next.js e TypeScript per il sito web, ottimizzato per dispositivi mobili
  • Supabase (basato su PostgreSQL) per il database, con 12 tabelle organizzate in uno schema a stella
  • Script TypeScript che trasforma i CSV in migration SQL, con batch insert e UUID v5 deterministici
  • Vercel per l'hosting, con CDN globale, progettata per caricarsi rapidamente anche con connessione scarsa
  • Il tutto sviluppato da Webizio (webizio.it), lo studio di Valerio. Scopri di più sul progetto

La scelta di ogni tecnologia è stata guidata da un'unica priorità: la velocità per l'utente. Il sito è pensato per un uso prevalentemente da smartphone, dato che la maggior parte degli utenti consulta gli orari dalla fermata del bus, spesso da link condivisi su WhatsApp o Facebook. Chi consulta Muovi Lazio è quasi sempre in mobilità, con poca copertura di rete. Ogni millisecondo conta.

I limiti: cosa non funziona (ancora)

Sarebbe facile presentare Muovi Lazio come un progetto perfetto. Non lo è, ed è importante dirlo chiaramente.

L'estrazione non è perfetta al 100%. Alcune tabelle dei PDF sono ambigue anche per un essere umano. Quando due colonne di orari sono troppo vicine, o quando una nota a piè di pagina si riferisce a più corse, l'AI può interpretare i dati in modo sbagliato. Tutto viene verificato, ma qualche imprecisione può sfuggire.

Nomi di fermate troncati. Alcuni PDF tagliano i nomi delle fermate per farli stare nella colonna. "Bivio Colle Tronto / Via della Stazione" diventa "Biv. C. Tronto / V. Staz." e non sempre si riesce a ricostruire il nome completo.

Dati parziali per alcune corse. Le corse scolastiche e alcune varianti hanno dati incompleti nei PDF originali. Vengono inclusi comunque, ma con un badge "Dati parziali" che avvisa l'utente.

Nessun aggiornamento in tempo reale. Muovi Lazio non sa se il bus è in ritardo o se una corsa è stata soppressa. Il sito mostra gli orari programmati, non quelli effettivi. L'aggiornamento avviene manualmente quando Astral pubblica nuovi PDF.

Nessuna coordinata GPS delle fermate. I PDF non contengono informazioni geografiche. Non è possibile mostrare le fermate su una mappa, almeno per ora.

Copertura parziale delle UDR. Attualmente Muovi Lazio copre la UDR3 Valle del Sacco e la UDR5 Valle dell'Aniene. Le altre 9 UDR verranno aggiunte quando saranno attivate.

La filosofia del progetto è chiara: meglio essere onesti e accurati al 95% che fingere di essere perfetti. Se un dato è incerto, viene segnalato. Se manca qualcosa, viene detto.

Il sogno: open data per il trasporto pubblico

C'è un'ironia di fondo in tutto questo lavoro. Muovi Lazio usa l'intelligenza artificiale per estrarre dati da PDF perché quei dati non sono disponibili in formato aperto.

COTRAL, l'operatore regionale, pubblica i suoi orari in formato GTFS (General Transit Feed Specification), lo standard internazionale per i dati del trasporto pubblico. Google Maps, Moovit, Citymapper: tutti usano il GTFS. Ma le linee delle UDR, coordinate da operatori locali sotto la supervisione di Astral, non hanno un feed GTFS.

Se Astral pubblicasse i dati delle UDR in formato GTFS, tutto il lavoro fatto con l'AI non sarebbe necessario. I dati sarebbero già strutturati, aggiornati, e accessibili a qualsiasi sviluppatore o app di trasporto.

Questo è l'appello di Muovi Lazio: dati aperti per il trasporto pubblico del Lazio. Non per il progetto in sé, ma per i pendolari. Per la signora che aspetta il bus a Colleferro e non sa se passerà tra 5 minuti o tra un'ora. Per lo studente di Zagarolo che deve pianificare come arrivare all'università. Per chiunque si muova fuori Roma e meriti lo stesso livello di informazione che ha chi prende la metro.

Nel frattempo, il lavoro continua, e ogni nuovo PDF di Astral diventa una nuova sfida da trasformare in dati accessibili. Se vuoi approfondire le alternative ai PDF per consultare gli orari, leggi il confronto tra tutti gli strumenti disponibili.

Domande frequenti

Muovi Lazio è fatto con l'intelligenza artificiale?

In parte. L'AI viene usata per estrarre i dati dai PDF degli orari, cioè per trasformare tabelle grafiche in dati strutturati. Il sito web, il database e l'interfaccia sono stati sviluppati con tecnologie tradizionali (Next.js, TypeScript, PostgreSQL). L'AI è uno strumento nel processo, non il prodotto finale.

I dati estratti dall'AI sono affidabili?

Sono accurati nella grande maggioranza dei casi, ma non perfetti. Ogni estrazione viene verificata manualmente e confrontata con il PDF originale. Quando un dato è incerto o parziale, viene segnalato con un badge visibile. Si consiglia di controllare sempre il PDF ufficiale di Astral per conferma in caso di dubbi su una corsa specifica.

Perché non vengono usati direttamente i dati ufficiali di Astral?

Perché non esistono in formato digitale strutturato. Astral pubblica solo PDF. Se fossero disponibili dati in formato GTFS o tramite API, verrebbero usati immediatamente. Muovi Lazio esiste proprio perché questa alternativa non c'è.

Posso contribuire segnalando un errore negli orari?

Assolutamente sì. Se noti un orario sbagliato, una fermata con il nome errato, o qualsiasi imprecisione, scrivici. Ogni segnalazione aiuta a migliorare la qualità dei dati per tutti.

Chi ha sviluppato Muovi Lazio?

Muovi Lazio è un progetto personale di Valerio Zappone, sviluppato attraverso Webizio (webizio.it). Non è un sito istituzionale e non ha legami con Astral S.p.A. o con la Regione Lazio. È nato dalla frustrazione reale di un utente del trasporto pubblico che ha deciso di fare qualcosa di concreto.

Valerio Zappone

Fondatore Muovi Lazio

webizio.it

Leggi anche