24 agosto, 2016 | di in » Strumenti

Introduzione

Il GTFS è un formato nato per definire orari e informazioni geografiche legate a reti pubbliche e private di trasporto. E’ nato in sintesi estrema (qui più dettagli) come side project di un dipendente di Google che nel 2005 stava cercando un modo per standardizzare l’importazione di dati di questo tipo in Google Maps. Non c’era ancora uno standard in questo settore, e nel tempo il GTFS è diventato il formato di riferimento, grazie anche all’uso diffuso e alla sua documentazione.

Si tratta di una collezione di file CSV (con estensione .txt) – da un minimo di 6 a un massimo di 13 – archiviati all’interno di un file zip, le cui specifiche sono documentate qui: https://developers.google.com/transit/gtfs/reference/

Per varie ragioni è un formato con cui ho spesso a che fare, ed è stato di ispirazione per creare uno script che ho scritto durante le bellissime olimpiadi di Rio e che ho chiamato GTFS, ready, set, go.

Cosa è GTFS, ready, set, go

È uno script bash che fa essenzialmente una cosa: trasforma i file txt del GTFS in formati pronti per essere usati meglio e subito, sopratutto in applicazioni spaziali. Nel dettaglio:

  • scarica una sorgente dati GTFS e ne converte i file txt in tabelle di un DBMS con estensione spaziale e in particolare in formato spatialite (evviva Alessandro Furieri e tutti quelli che si prendono cura di spatialite);
    • trasforma in layer cartografici le tabelle delle fermate e delle rotte (stops e routes);
    • genera alcuna tabelle utili a creare un report sul file della reti di trasporti preso in esame;
  • esporta in formato GeoJSON e KML la tabella delle rotte e quella delle fermate;
  • genera un report in formato HTML e Markdown utili a dare una visione d’insieme dei dati in esame (al momento è ancora minimale e in bozza) .

Nulla di complesso e nulla di nuovo. Ci sono già altre modalità e prodotti per fare cose simili, ma sono scritti in linguaggi che non conosco (ad esempio in Go), richiedono l’installazione di un database server o non spazializzano database sqlite (come il mio amato GTFSDB) o sono procedure (semplici) da svolgere “a mano” e quindi a rischio sempre di qualche errore e con perdite di tempo (come ad esempio questa).

Qui il repository su GitHubhttps://github.com/ondata/gtfsreadysetgo

Come funziona

Si tratta di uno script in cui ho messo in fila i comandi utili al mio obiettivo finale, costruendo una (sorta di) macro in cui sfrutto le caratteristiche del bash e alcune utility/applicazioni utili per arrivare al risultato atteso. Queste ultime sono al momento un requisito per lo script, e quindi una piccola barriera ad un utilizzo immediato: le ho utilizzate perché mi hanno consentito di non scrivere “vero” codice, perché “fanno” nella sostanza tutto loro.

Requisiti

Avere un sistema operativo in cui è possibile lanciare uno script bash, quindi ovviamente i sistemi Linux, quelli Mac e anche quelli Windows. Su quest’ultimo apro una piccola parentesi.

Per lanciare uno script bash su Windows – sino a poco tempo fa – era necessario installare “cose” come Cygwin.

Cygwin è una distribuzione di software libero, sviluppata originariamente da Cygnus Solutions, che consente a diverse versioni di Microsoft Windows di svolgere alcuni compiti in maniera esteticamente e funzionalmente simile ad un sistema Unix (da Wikipedia).

Dall’ultimo aggiornamento di release di Windows 10 (l’anniversary update di agosto 2016) è possibile utilizzare nativamente bash anche in Windows, tramite l’applicazione denominata “Bash in Ubuntu on Windows”; “GTFS ready set go” l’ho scritto e testato per intero in ambiente Windows 10, anche per provare questa novità introdotta in questo recente aggiornamento, che rende la comodità e la potenza di fuoco di bash sempre più trasversali.

bash

Lo script sfrutta queste applicazioni:

  • GDAL – Geospatial Data Abstraction Library >= 2.1, che viene usato essenzialmente per le operazioni di creazione, importazione e esportazione delle risorse;
  • spatialite, che viene sfruttato per fare query spaziali e come uno dei formati di archiviazione e output;
  • unzip, per decomprimere il GTFS sorgente;
  • curl, per il download del file GTFS;
  • csvtk, per convertire in formato Markdown alcune delle tabelle create;
  • pandoc, per convertire il report Markdown anche in formato HTML.

E infine vengono utilizzate gli straordinari grep e sed, che sono sempre presenti in ambienti in cui è possibile lanciare uno script bash.

Usare lo script

Questa la modalità attuale di utilizzo:

  • scaricare (o clonare) il repository e decomprimere in una cartella il file zip scaricato;
  • dare allo script .sh i permessi di esecuzione;
  • aprirlo con un editor di testo e cercare la variabile URLGTFS;
  • sostituire l’URL presente con l’URL di un feed GTFS di proprio interesse (un comodo archivio di GTFS è TransitFeeds) come ad esempio quello di Madrid https://servicios.emtmadrid.es:8443/gtfs/transitemt.zip;
  • salvare e lanciare lo script via shell.

Qui sotto la replica di quanto descritto nei punti di sopra.

2016-08-23_10h31_39

Alcune note

Lo script può essere migliorato e di molto. Per questa ragione inserisco alcune importanti note:

  • lo script non fa la verifica dei requisiti software (vedi sopra), quindi se non soddisfatti andrà in errore;
  • lo script è utilizzabile al momento soltanto con i GTFS che contengono anche la tabella shapes, che è opzionale per il formato GTFS, quindi non sempre presente;
  • lo script non fa alcuna verifica di consistenza dei dati (per la quale è possibile utilizzare FeedValidator;
  • lo script crea e cancella file e cartelle nella cartella in cui viene eseguito.

Gli output

Sopra ho già fatto riferimento agli output. Nel repository oltre allo script è stata creata la cartella output_example_folder per mostrare nel concreto quali siano gli output prodotti. A seguire l’elenco dei vari output con i relativi URL, in modo da potersi fare un’idea più concreta:

  • feed_gtfs.sqlite download, ovvero il file GTFS trasformato in formato SpatiaLite, in cui le tabelle stops e routes sono state trasformate in layer spaziali;
  • routes.geojson (visualizzazione e download), il file in formato GeoJSON per le rotte;
  • routes.kml (download), file in formato KML per le rotte, visualizzabile in Google Earth (ed in altri client);
  • stops.geojson (visualizzazione e download), il file in formato GeoJSON per le fermate;
  • stops.kml (download), file in formato KML per le fermate, visualizzabile in Google Earth (ed in altri client);
  • la cartella report(visualizza), che a sua volta contiene:
    • report.md, il file con il report in formato Markdown (visualizza)
    • report.html, il file con il report in formato HTML (vista codice e rendering HTML);
    • tutte le tabelle usate per costruire i report, in formato CSV e Markdown.

Perché

GTFS, ready, set, go nasce come conseguenza di #openamat, un’iniziativa civica (ancora in corso) per chiedere a AMAT (la municipalizzata comunale di Palermo che gestisce il trasporto pubblico) di pubblicare i dati relativi ai trasporti pubblici in formato aperto ed in tempo reale.

Dopo 6 mesi senza aggiornare i dati, AMAT ha pubblicato a luglio del 2016 tre aggiornamenti di GTFS in 15 giorni e avevo bisogno di uno script per poter usare e visualizzare subito questi dati.

Lo rendo pubblico perché penso possa essere utile anche ad altri.

URL (che mi sono stati) utili

8 Responses to “GTFS, pronti, partenza, via …”

  1. By Emanuele on ago 24, 2016

    Queste sono cose che mi piacciono Tanto.

  2. By Andrea Borruso on ago 24, 2016

    Grazie caro bit!!

  3. By Ciro Spataro on ago 24, 2016

    studio quello che scrivi.
    Fruisco gli output di questo tuo lavoro (che non è poca cosa per me) per vari riusi.
    Grazie per rendere la vita facile a chi (come me) in questo campo non ha vastissime competenze :-)

  4. By Andrea Borruso on ago 24, 2016

    Grazie ciro!

  5. By pigreco on ago 24, 2016

    grazie Andrea per la condivisione.
    un tuo fan!!!

  6. By Andrea Borruso on ago 24, 2016

    Grazie a te pigreco: specchio!

  7. By Gianluca on ago 26, 2016

    Caro Andrea, l’articolo già di suo meritava. La ‘chicca’ della bash ha inserito il nitroplutonio al tutto.

  8. By Andrea Borruso on ago 26, 2016

    Grazie Gianluca :)

Sorry, comments for this entry are closed at this time.


TANTO non rappresenta una testata giornalistica ai sensi della legge n. 62 del 7.03.2001, in quanto non viene aggiornato con una precisa e determinata periodicita'. Pertanto, in alcun modo puo' considerarsi un prodotto editoriale.