Tutorial: GTFS in una mappa con pochi click

Sui GTFS, files in formato aperto usati per i Trasporti (pubblici o privati) si è parlato parecchio. Vi consiglio questo bel post ormai di 5 anni fa di Maurizio Napolitano , piuttosto che un mio piccolo contributo su ForumPA.

Spesso i GTFS vengono forniti a Google Transit da parte delle Aziende di Trasporto. Altre volte sono ben chiusi dentro i “cassetti elettronici” delle aziende. Ora la musica sta cambiando; come indicato nell’Action Plan del Governo, all’interno dell’Open Government Partnership, si vuole costruire una piattaforma nazionale denominata OpenTrasporti dove far confluire tutti i dati aperti dei trasporti italiani.

Ma come si opera con i dati GTFS?. Ci sono alcune piattaforme ormai bel collaudate come OpenTripPlanner che permette di pianificare percorsi, anche in forma intermodale tra più gestori, oltre a visualizzare fermate e orari. Ultimamente c’è Transit.Land che ha avuto la brillante idea di incorporare in un webservice tutti i GTFS segnalati dalla comunità mondiale. Questo mega database viene reso interoperabile per mezzo di API codificate valide universalmente. Ne ha parlato Andrea Borruso in questo post . Ne ho realizzato una mappa universale e un Bot Telegram. Transit.Land ha apprezzato dedicandoci un articolo .

Ma se si volesse usare uno strumento fatto in casa, senza tante pretese, per vedere i gtfs della propria città senza dove ricorrere a piattaforme esterne, a complicati aggiornamenti in database mysql in cui importare tali files, dipendere da API esterne, come si fa?

Dopo alcuni mesi finalmente ci sono riuscito. Ho creato un processo di importazione dei files GTFS con relativa visualizzazione su una Mappa e autolocalizzazione GPS della propria posizione. Cliccando sulle fermate si hanno le linee che vi transiteranno nella prossima ora:

Schermata 2016-09-04 alle 15.26.15

Ultimamente su OpenData Sicilia ci si è molto concentrati sui dati dei traporti dell’AMAT di Palermo e Giuseppe Gambino ha fatto anche delle API mentre Giovanni Pirrotta un BotTelegram e un post esplicativo. Insomma non sono il solo 🙂

Leggendo le varie discussioni, ho trovato questa bella immagine che il “solito” Borruso ha condiviso e che rende bene l’idea di come si collegano tra loro i files di testo che formano il bouquet GTFS:

image30471small

Quindi l’idea di fondo è permettere pochi passaggi per avere i GTFS desiderati su una mappa, con le fermate cliccabili che forniscono gli orari, come detto.  Per fare questo:

  1. scaricare il codice sorgente dalla mia repo su github
  2. salvare i files GTFS nella cartella omonima
  3. mettere in scrittura la cartella json con il file in essa contenuto.
  4. lanciare update.php. verrà aggiornato il file (geo)json nella cartella json trasformando il file stops.txt in un file geografico
  5. andando su https://www.nomedominio.it/gtfs/ cioè sulla root che avete creato MA avendo cura che sia attivo il protocollo https, un geolocalizzatore vi indicherà la vostra posizione sulla mappa con attorno le eventuali fermate del vostro gestore di trasporti. Se non avete il protocollo https, allora non potete fare altro che “simulare” la vostra posizione passando manualmente le coordinate lat e lon. Eccovi un esempio: http://www.piersoft.it/gtfstutorial/locator.php?lat=40.34546476126231&lon=18.16688060760498 e da qui potete poi spostare il pin dove volete. al termine dello spostamento viene ricaricata la mappa.
  6. se cliccate su una fermata si apre un side-panel con gli orari.

ATTENZIONE!! se volete che il punto 1) funzioni , la struttura del file stops.txt deve essere quella standard e cioè avere questo ordine per le prime colonne:

Schermata 2016-09-05 alle 11.53.44

Addendum: su github avete la versione aggiornata dei files, dove non c’è bisogno che la struttura dei files sia ordinata. il sistema li ordina automaticamente. quindi basta salvare i gtfs e lanciare update.php..stop.

Eccovi alcuni GTFS che non danno warnings ai compilatori Google e che potete usare come struttura.

[Per capirci ho usato i dati di Trenord, SGM, ATM, ect e vanno tutti mentre AMAT Palermo vanno rimesse in ordine le colonne nei files.  Se poi usate GTFS molto grandi (vedi Palermo) vi consiglio di inserire nel file orari.php un aumento di memoria e timeout per il php: 

ini_set(‘memory_limit’, ‘20480M’);
ini_set(‘max_execution_time’, ‘180’); ]

La logica è : il geojson creato dall’update.php è permanente ed è la base che visualizza le fermate sulla mappa. quando si clicca una fermata, il file locator.php apre orari.php prendendo lo stop_id e lo stop_name. Con lo stop_id posso leggere nel file stop_times.txt gli orari per quella determinata fermata. ho messo quindi un filtro tra il momento della richiesta e +60 minuti. questo per restringere tutti gli orari in 1 ora. controllo nel file gli stop_id e da lì ricavo il trip_id da cercare nel file trips.txt. in questo file trovo quindi il route_id ( il numero della linea) e infine cerco questo route_id nel file routes.txt da cui derivo anche il nome descrittivo della linea che è il route_shortname. Infine controllo se quella linea, nel giorno in corso, è attiva rispetto al calendar.txt altrimenti non la faccio visualizzare.

In pratica route si mangia il trip che si mangia lo stop_times che mio padre nella mappa con gli stops comprò 🙂

Ovviamente non è tutto cosi semplice. Se aprite il file index.php (che viene letto in https) viene attivata una geolocalizzazione che per regole di sicurezza se non è in https, non funziona. Tale file, ricava la vostra posizione e apre il file locator.php (trovate nell’url le coordinate ricavate). il file locator carica mappaf.json che è il file che viene creato una tantum quando lanciate update.php ad ogni nuova importazione di files gtfs (magari quando l’azienda manda gli aggiornamenti..basta un upload dei files ed un click su update.php). Il file locator.php, quando cliccate una fermata, non apre direttamente orari.php ma tmp.php. Questo è servito per avere il “loading”. E’ infatti il file tmp.php che lancia la gif animata e nel frattempo carica orari.php passando lo stop_id e lo stop_name.

Eccovi la mappa in esercizio per Lecce, che per fortuna fornisce in opendata sul portale del Comune i files GTFS. (in verità fornisce anche l’accesso realtime ma questa Estate il server è in manutenzione).

Spero vi sia stato utile

Piersoft

Lic. CC_BY_SA per questo articolo

Visualizza schermo intero

 

Aggiornamento del 22 Settembre 2016:

L’amico Gian Battista Vitrano ha fatto un TUTORIAL per creare anche il file dei percorsi. Se il gestore dei GTFS vi fornisce anche il file shapes.txt allora vi consiglio questo approfondimento. il codice sorgente che scaricate su GitHub già prevede di caricare le linee, se presenti. Vedi ad esempio la mappa di Palermo.

 

Potrebbero interessarti anche...

2 Risposte

  1. matricola12 ha detto:

    Buongiorno,
    mi complimento per questo utilissimo e ottimo “oggetto”.
    Ho solamente una segnalazione per un possibile miglioramento:
    mi sembra che non gestisca il file “calendar_dates.txt” che invece alcune aziende utilizzano il alternativa al file “calendar.txt” come anche possibile secondo il formato GTFS.
    Crede che sia possibile implementare questa opportunità.

    • piersoft ha detto:

      hai ragione. devo mettermi ad integrare il codice il cal_dates non è obbligatorio. dovrebbe essere usato per le date in “eccezione” cioè ad esempio a Natale la linea XX non passa etc invece alcune aziende TPL lo usano al posto di calendar inserendo tutti i giorni in cui non deve passare la linea (un complemento a 100 insomma). prima o poi mi ci metto. Ma considera però che secondo lo standard GTFS il calendar.txt dovrebbe essere obbligatorio come file https://developers.google.com/transit/gtfs/reference/

Rispondi