Browse Source

Add new IT post about GTFS in OSM (to review)

pull/8/head
Francesco Vezzoli 7 months ago
parent
commit
630ab46808
  1. 201
      content/post/gtfs-to-osm/index.it.md
  2. BIN
      content/post/gtfs-to-osm/media/GTFS_wtf.png
  3. BIN
      content/post/gtfs-to-osm/media/add_stop_in_josm.gif
  4. BIN
      content/post/gtfs-to-osm/media/apercu_stops.png
  5. BIN
      content/post/gtfs-to-osm/media/apercu_trips.png
  6. BIN
      content/post/gtfs-to-osm/media/apercu_wiki.png
  7. BIN
      content/post/gtfs-to-osm/media/bifidus_beta.png
  8. BIN
      content/post/gtfs-to-osm/media/exemple_grille_horaire.png
  9. BIN
      content/post/gtfs-to-osm/media/gtfs_geo.png
  10. BIN
      content/post/gtfs-to-osm/media/josm_conflation_plugin.png
  11. BIN
      content/post/gtfs-to-osm/media/josm_junglebus_rules.png
  12. BIN
      content/post/gtfs-to-osm/media/josm_ptassistant_plugin.png
  13. BIN
      content/post/gtfs-to-osm/media/josm_todo_plugin.png
  14. BIN
      content/post/gtfs-to-osm/media/josm_trip_1.png
  15. BIN
      content/post/gtfs-to-osm/media/josm_trip_2.png
  16. BIN
      content/post/gtfs-to-osm/media/model_arret.png
  17. BIN
      content/post/gtfs-to-osm/media/seine_et_marne_bus.gif
  18. BIN
      content/post/gtfs-to-osm/media/stops_josm_1.png
  19. BIN
      content/post/gtfs-to-osm/media/stops_josm_2.png
  20. BIN
      content/post/gtfs-to-osm/media/stops_josm_3.png
  21. BIN
      content/post/gtfs-to-osm/media/stops_mapcontrib_1.png
  22. BIN
      content/post/gtfs-to-osm/media/stops_mapcontrib_2.png
  23. BIN
      content/post/gtfs-to-osm/media/stops_osmose.png
  24. BIN
      content/post/gtfs-to-osm/media/unroll.png
  25. BIN
      content/post/gtfs-to-osm/media/wiki_shape_progress.gif
  26. BIN
      content/post/gtfs-to-osm/media/wiki_stop_progress.gif

201
content/post/gtfs-to-osm/index.it.md

@ -0,0 +1,201 @@
---
title: "[WIP] Da GTFS a OpenStreetMap"
slug: da-gtfs-a-openstreetmap
date: 2020-09-20T14:42:15+02:00
tags: [ geo, osm, openstreetmap ]
draft: false
---
{{< notice info >}}
Traduzione del post [*Du GTFS à OpenStreetMap*](https://nlehuby.5apps.com/de-gtfs-a-osm.html) del **Le blog de nlehuby**
{{< /notice >}}
Se la tua rete di trasporto pubblico preferita ha pubblicato i suoi dati come dati aperti in GTFS e vuoi usarli per verificare la completezza di OpenStreetMap e vedere cosa può essere migliorato? Ecco alcuni suggerimenti per iniziare!
<!-- markdownlint-disable MD026 -->
## GTFS WTF?
<!-- markdownlint-enable MD026 -->
GTFS (*General Transit Feed Specification*) è un formato utilizzato di frequente per descrivere i dati di trasporto. Permette di definire le caratteristiche e la geografia della rete, nonché i suoi orari. Questo formato è ampiamente utilizzato per alimentare software e servizi di pianificazione e informazione dei viaggi, nonché strumenti di pianificazione e miglioramento della rete. È quindi del tutto naturale in questa forma che potrai trovare i dati delle linee e delle fermate degli autobus pubblicati dal tuo operatore o dalla tua comunità.
{{< figure src="media/GTFS_wtf.png" alt="Cos'è il GTFS?" title="Titolo" caption="antani" attr="CC-BY-SA Jungle Bus" attrlink="https://junglebus.io/en/osm-then-gtfs-or-gtfs-then-osm/" >}}
Un file GTFS si presenta sotto forma di un file *.zip* contenente un insieme di file di testo. Nonostante la loro estensione, in realtà sono file CSV che possono essere aperti nel tuo software di foglio di calcolo preferito (LibreOffice Calc, Excel, ecc.).
[La documentazione][gtfs_docs] che descrive il contenuto dei file, i dettagli delle colonne e il modo in cui il collegamento tra di loro è disponibile online.
Per rendere le cose più facili, non verrà usato direttamente il file GTFS, ma un'esportazione fatta con lo [strumento geografico GTFS][gtfs-geo]. Ti permette di trasformare un file GTFS in un insieme di file geografici, più adatti alla nostra missione e che possono essere facilmente importati nella maggior parte degli strumenti di editing di OpenStreetMap (JOSM, iD editor, etc.).
{{< figure src="media/gtfs_geo.png" alt="Schermata dell'interfaccia geografica GTFS" >}}
{{< notice warning >}}
Come dico spesso, open data non significa open bar, quindi prima di iniziare a modificare qualsiasi cosa, controlla di poter utilizzare questi dati per arricchire OpenStreetMap.
{{< /notice >}}
## Fase 1: le fermate
Il passaggio più semplice da eseguire è un confronto con le fermate già presenti.
Le fermate sono nel file stops.csv. *Per ottenere un risultato simile da GTFS, modificare l'estensione del file in csv, rinominare le colonne `stop_lat` e `stop_lon` in `latitude` e `longitude` e quindi filtrare il contenuto per mantenere solo quelle che ne hanno una `location_type = 0`.*
Ti consiglio di aprirlo prima in un foglio di calcolo per stimare la qualità della denominazione delle fermate (TUTTO MAIUSCOLO? Con abbreviazioni? Ecc). Controlla anche se il `stop_code` o `stop_id` corrisponde a un numero visibile sulle paline delle fermate (ad esempio un codice per ottenere i prossimi passaggi in tempo reale a questa fermata?): Se sì, questo corrisponde a dati utili da aggiungere a OpenStreetMap.
{{< figure src="media/apercu_stops.png" alt="Panoramica delle fermate di un GTFS esportato con GTFS-geo" >}}
Quindi, potrebbe essere interessante visualizzarli su una mappa per un primo inventario (umap, QGIS o semplicemente JOSM con uno sfondo OSM o immagini aeree di qualità). Già questo dà una prima occhiata e può consentire di rilevare errori grossolani (fermate situate al di fuori della zona coperta dalla rete, o addirittura in mezzo al mare).
{{< figure src="media/stops_josm_1.png,media/stops_josm_2.png,media/stops_josm_3.png" alt="Panoramica delle fermate in JOSM" >}}
Ciò che veramente ci interessa in questa fase è la precisione del posizionamento delle fermate sulla mappa: le fermate sono posizionate sulla strada, a lato della strada o all'interno di edifici?
È inoltre necessario verificare il modo in cui vengono catalogate le fermate: infatti le fermate GTFS non corrispondono necessariamente alle fermate come le possiamo osservare sul campo. È possibile che un'unica fermata GTFS sia valida per entrambi i sensi di circolazione su una linea, anche se corrisponde a due pensiline a terra, o viceversa più fermate (una per ogni linea) per rappresentare una fermata di autobus servita da più linee.
{{< figure src="media/stops_mapcontrib_1.png" alt="panoramica delle fermate in JOSM" >}}
In breve, dobbiamo dedicare un po' di tempo ad esplorare i dati per identificare piccole sorprese che potrebbero rendere più complesso il nostro compito.
Una volta acquisita familiarità con le fermate GTFS, possiamo affrontare il confronto con OpenStreetMap. Per questo, possiamo ad esempio caricare il file di stop sopra [questo tema MapContrib][MapContrib]. JOSM è anche un'ottima scelta per questo compito.
{{< figure src="media/stops_mapcontrib_2.png" alt="panoramica delle fermate in JOSM" >}}
Se non l'hai già fatto, ti consiglio di dedicare prima un po' di tempo alla standardizzazione delle fermate già presenti in OpenStreetMap per la zona. Senza di essa, potrebbe essere difficile per te [rispondere a domande molto semplici][map_question] come "Quante fermate ci sono in questa città?" utilizzando OpenStreetMap.
Infatti, come per il GTFS, diverse catallogazioni sono possibili, tanto sul posizionamento della fermata (su strada, o accanto ad essa) quanto sui *tag*: vanno quindi rispettate le pratiche locali quando esistono. Altrimenti, consiglio la seguente catalogazione, che è compatibile con la maggior parte dei rendering e degli strumenti che sfruttano i dati di trasporto OpenStreetMap: una fermata è rappresentata da un singolo oggetto, posto accanto alla strada, con i tag `highway = bus_stope` e `public_transport = platform`.
{{< figure src="media/model_arret.png" alt="panoramica delle fermate in JOSM" >}}
Dopo questo piccolo intervallo di giardinaggio dei dati esistenti, possiamo affrontare l'arricchimento e il miglioramento delle fermate OpenStreetMap dal GTFS.
Ricorda di incrociare le fonti e di fare affidamento su immagini aeree o foto di strada con licenza compatibile :wink:.
Individua anche se ci sono fermate esistenti in OpenStreetMap che non sono rappresentate nei dati aperti utilizzati (ad esempio la navetta gratuita predisposta dal comune o da altra rete di trasporto diversa da quella su cui stai lavorando).
In JOSM, puoi utilizzare il [plugin todo][josm_todo] per creare un elenco di fermate e controllarle molto rapidamente in ordine.
{{< figure src="media/josm_todo_plugin.png" alt="Il plugin TODO di JOSM" >}}
Se i risultati dei passaggi precedenti sono piuttosto buoni (i dati GTFS sono di buona qualità, con nomi validi e posizioni precise e vicini alla modellazione adottata da OpenStreetMap), puoi ad esempio utilizzare il [plugin JOSM Conflation][josm_conflation] per passare rapidamente a rivedere le differenze.
{{< figure src="media/josm_conflation_plugin.png" alt="Il plugin Conflation di JOSM" >}}
Puoi anche creare un'analisi [Osmose][osmose]: è un ottimo strumento per realizzare integrazioni di dati in OpenStreetMap da una sorgente di dati aperti. Inoltre, Osmose rende più facile lavorare con più persone e in seguito seguire le modifiche apportate ai dati (sia GTFS che OpenStreetMap).
{{< figure src="media/stops_osmose.png" alt="Un analisi di Osmose" >}}
Insomma, alla fine di questo passaggio, hai posizionato le fermate della rete in qualità: è già un grande risultato, complimenti! Quindi possiamo passare alle linee!
## Fase 2: inventario di linee e percorsi
Modificare le linee di trasporto in OpenStreetMap è noto sia una cosa difficile, ma niente panico: con un po' di pratica e metodo non è così difficile!
Ogni linea è composta da uno o più tracciati, i quali rappresentano i percorsi effettivamente seguiti dai mezzi con le relative fermate servite in ordine. Nel caso generale, ci saranno due tracciati per ogni linea (uno per l'andata e uno per il ritorno), ma esistono molte eccezioni: la linea circolare con un unico percorso, la linea biforcuta con 3 o 4 percorsi diversi e regolari, la deviazione del mercoledì mattina per evitare la piazza del mercato o la deviazione ogni mattina e ogni sera per passare davanti alla scuola, ecc.
In OpenStreetMap, ogni percorso sarà rappresentato una relazione di `type = route`. Questa relazione conterrà le fermate in ordine e le strade o gli itinerari per cui passa l'autobus. Quindi raggrupperemo tutti i percorsi della stessa linea in una relazione di `type = route_master`.
Prima di andare oltre e guardare i dati GTFS, ti consiglio, come per le fermate, di dedicare un po' di tempo alla qualità dei dati già presenti in OpenStreetMap. In particolare, se necessario, aggiungeremo tag sulle tratte e sulle linee per indicare il vettore (`operator`) e la rete (`network`) in modo da poter facilmente differenziare le linee della nostra rete e quelle della rete nazionale o delle navette comunali. Verificheremo anche che ogni percorso sia effettivamente collegato a una linea (le relazioni `route` sono membri di relazione `route_master`) altrimenti rispondere alla domanda sul numero di linee in città potrebbe essere un'operazione difficile.
Per questo passaggio, ricordati di attivare il validatore [Jungle Bus per JOSM][jungle_bus_josm], che ti dirà cosa correggere nei dati esistenti.
{{< figure src="media/josm_junglebus_rules.png" alt="Attiva il validatore JOSM Jungle Bus" >}}
Puoi anche trovare la maggior parte di questi controlli di qualità in Osmose. Dai un'occhiata anche alla versione beta di [Bifidus][bifidus], che ti permette di evidenziarli su una mappa per una determinata area.
{{< figure src="media/bifidus_beta.png" alt="Dai un'occhiata alla versione beta di Bifidus" >}}
Ora diamo un'occhiata alle linee e ai percorsi del GTFS.
GTFS-geo ti offre un file csv contenente le rotte. Una colonna indica la linea di appartenenza e il numero di fermate.
{{< figure src="media/apercu_trips.png" alt="Panoramica di linee e percorsi" >}}
In GTFS, otterrai l'elenco delle righe nel file `routes.txt`. Per trovare i percorsi di ogni riga, è necessario utilizzare il file `trips.txt`, filtrato `route_id` e mantenendo solo quelli che hanno la stessa sequenza di fermate (che trovate nel file `stop_times.txt`).
A seconda della complessità delle linee, potresti dover fare delle scelte in questi percorsi: puoi sempre concentrarti inizialmente sui percorsi più regolari (il percorso più frequente è più rilevante per la mappa rispetto alla variante che viene eseguito solo il mercoledì alle 10:30).
L'orario della linea, quando disponibile, offre una visualizzazione abbastanza efficiente dei diversi percorsi e può essere utile per identificare quelli che si desidera mappare e quelli che si salvano per dopo.
{{< figure src="media/exemple_grille_horaire.png" alt="Panoramica di linee e percorsi" >}}
Dopo tutto ciò, dovresti avere una prima visione del numero di rotte e linee già esistenti in OpenStreetMap e di quelle da completare, oltre a quelle da realizzare interamente.
Per seguire i tuoi progressi, ti consiglio di aprire una pagina wiki, dove avere un elenco di linee e percorsi target e quindi misurare qui i tuoi progressi. La pagina seguente può servire come modello se non hai familiarità con la sintassi wiki.
{{< figure src="media/apercu_wiki.png" alt="Una tabella di avanzamento nel wiki" >}}
Questa pagina wiki è anche un buon posto per ricordare i tag giusti da mettere sulle linee (per standardizzare i tag `operator` e `network` per esempio) e come mappare le fermate.
In breve, alla fine di questo passaggio, hai una panoramica della tua rete: le linee e i percorsi esistenti e quelli da creare. Daremo ora uno sguardo dettagliato ad ogni percorso uno per uno e lo completeremo.
## Fase 3: i percorsi e le loro soste
Quindi prendiamo un percorso: in GTFS Geo, ogni percorso è associato a un file geojson, che include metadati, fermate e tracciato del percorso.
In GTFS, otterrai i metadati del viaggio unendo le informazioni dai file `routes.txt` e `trips.txt` utilizzando la colonna `route_id` per bloccare ogni viaggio nella sua riga. I viaggi presenti in `trips.txt` hanno l'informazione di orario e calendario associati, quindi probabilmente dovrai prima scegliere un singolo viaggio rappresentativo. L'elenco delle fermate del viaggio è disponibile nel file `stop_times.txt` utilizzando come filtro `trip_id`. Infine, dovrai anche usare `stop_id` per trovare nel file `stops.txt` il nome e le coordinate di queste fermate.
È quindi possibile aprire il file geojson in JOSM per visualizzare un percorso.
{{< figure src="media/josm_trip_1.png" alt="Un viaggio in JOSM" >}}
È quindi necessario prendere la relazione del percorso associato o crearlo se necessario utilizzando le informazioni fornite dal GTFS. Non dimenticare di mettere la relazione del tragitto (`type = route`) nella relazione associata (`type = route_master`).
Quindi, seguendo il geojson, tutto quello che devi fare è trovare le fermate (già create in OpenStreetMap al passaggio 2) e aggiungerle, nell'ordine in cui sono presenti nella relazione.
{{< figure src="media/add_stop_in_josm.gif" alt="Aggiungi le fermate nella relazione con JOSM" >}}
Infine, prima di passare al percorso successivo o al passaggio successivo, non dimenticare di aggiornare il wiki man mano che procedi.
{{< figure src="media/wiki_stop_progress.gif" alt="Andamento dei giudizi sul wiki" >}}
## Fase 4: i percorsi
Oltre alle fermate per ogni percorso, vorremo aggiungere anche il percorso, che si materializza in OpenStreetMap dopo le strade utilizzate dal bus.
In GTFS Geo, questa rotta è presente nel file geojson di ogni rotta. Il layout è un'informazione facoltativa nel GTFS: quando non è fornito, il geojson conterrà solo linee rette che collegano le fermate in ordine.
{{< figure src="media/josm_trip_2.png" alt="Un viaggio in JOSM" >}}
In GTFS, otterrai i possibili grafici delle rotte dal file `shapes.txt`. Questa è una serie di punti che dovrai collegare. È possibile collegare il tragitto alla rotta GTFS utilizzando la colonna `shape_id` del file `shapes.txt` e `trips.txt`. Il file `shapes.txt`è facoltativo. Se non è previsto, sta a te trovare il percorso intrapreso dal mezzo tra le fermate! (*ndt Ricordati di verificare i percorsi sul posto* :wink:)
Per aggiungere questo percorso in OpenStreetMap, apri la relazione del percorso, quindi seleziona una per una le strade e aggiungile alla relazione.
Se hai molti percorsi o code particolarmente lunghe, ti invito a testare alcuni plugin JOSM:
* [PT Assistant][pt_assistant] e il suo assistente di routing. Questo plugin è essenziale anche per mappare le linee di trasporto in JOSM: aggiunge molti test di qualità e facilita la visualizzazione di oggetti importanti. Provarlo, lo adotterai!
* [Relation Toolbox][relation_toolbox] , che consente di velocizzare l'aggiunta di più oggetti a una relazione
{{< figure src="media/josm_ptassistant_plugin.png" alt="Il plug-in PT Assistant" >}}
Il plugin PT Assistant rende molto più facile (tra le altre cose) visualizzare il percorso dell'autobus selezionato, le sue fermate, il loro ordine e il percorso.
E infine, quando è finito, il wiki deve essere aggiornato di conseguenza come per le fermate.
{{< figure src="media/wiki_shape_progress.gif" alt="Avanzamento dei percorsi sul wiki" >}}
## Fase 5: divertiti!
Hai creato tutte le fermate, poi tutte le linee e tutti i percorsi e infine hai aggiunto le fermate e le strade a tutti questi percorsi? Congratulazioni!
Ora puoi trovare questi dati sui rendering di trasporto di openstreetmap.org (a volte ci sono diversi giorni di ritardo, sii paziente).
{{< figure src="media/seine_et_marne_bus.gif" alt="Progressi sullo sfondo dei trasporti" >}}
I dettagli delle informazioni di ogni riga possono essere esplorati anche da [Unroll][unroll]:
{{< figure src="media/unroll.png" alt="Unroll, per visualizzare i dettagli di una linea" >}}
Dai un'occhiata anche all'app mobile OSMAnd, che ti consente anche di [navigare tra questi dati di trasporto][osmand_public_transport] e persino di calcolare i percorsi degli autobus!
E non è tutto, ci sono sempre più siti o app che utilizzano i dati di trasporto OpenStreetMap: dai un'occhiata alla [pagina wiki di riferimento][wiki_transport] per cose ancora più interessanti da fare con questi nuovi dati!
[gtfs_docs]: https://github.com/google/transit
[gtfs-geo]: https://gtfs-geo.herokuapp.com/
[MapContrib]: https://www.cartes.xyz/t/e7200d-Arrets_de_bus
[map_question]: https://nlehuby.5apps.com/mais-je-veux-juste-la-liste-des-arrets-de-bus.html
[josm_todo]: https://wiki.openstreetmap.org/wiki/JOSM/Plugins/TODO_list
[josm_conflation]: https://wiki.openstreetmap.org/wiki/JOSM/Plugins/Conflation
[osmose]: http://osmose.openstreetmap.fr/it
[jungle_bus_josm]: https://github.com/Jungle-Bus/transport_mapcss
[bifidus]: https://jungle-bus.github.io/bifidus/index.html
[pt_assistant]: https://wiki.openstreetmap.org/wiki/FR:JOSM/Greffons/PT_Assistant
[relation_toolbox]: https://wiki.openstreetmap.org/wiki/JOSM/Plugins/Relation_Toolbox
[unroll]: https://jungle-bus.github.io/unroll/
[osmand_public_transport]: https://nlehuby.5apps.com/plus_de_bus_osmand.html
[wiki_transport]: https://wiki.openstreetmap.org/wiki/FR:Public_transport/Tools#Visualisation

BIN
content/post/gtfs-to-osm/media/GTFS_wtf.png

After

Width: 376  |  Height: 297  |  Size: 69 KiB

BIN
content/post/gtfs-to-osm/media/add_stop_in_josm.gif

After

Width: 683  |  Height: 384  |  Size: 160 KiB

BIN
content/post/gtfs-to-osm/media/apercu_stops.png

After

Width: 627  |  Height: 288  |  Size: 37 KiB

BIN
content/post/gtfs-to-osm/media/apercu_trips.png

After

Width: 1138  |  Height: 407  |  Size: 95 KiB

BIN
content/post/gtfs-to-osm/media/apercu_wiki.png

After

Width: 1099  |  Height: 405  |  Size: 39 KiB

BIN
content/post/gtfs-to-osm/media/bifidus_beta.png

After

Width: 1058  |  Height: 536  |  Size: 232 KiB

BIN
content/post/gtfs-to-osm/media/exemple_grille_horaire.png

After

Width: 579  |  Height: 428  |  Size: 56 KiB

BIN
content/post/gtfs-to-osm/media/gtfs_geo.png

After

Width: 1600  |  Height: 744  |  Size: 69 KiB

BIN
content/post/gtfs-to-osm/media/josm_conflation_plugin.png

After

Width: 1299  |  Height: 713  |  Size: 657 KiB

BIN
content/post/gtfs-to-osm/media/josm_junglebus_rules.png

After

Width: 1299  |  Height: 686  |  Size: 167 KiB

BIN
content/post/gtfs-to-osm/media/josm_ptassistant_plugin.png

After

Width: 617  |  Height: 407  |  Size: 178 KiB

BIN
content/post/gtfs-to-osm/media/josm_todo_plugin.png

After

Width: 1299  |  Height: 713  |  Size: 655 KiB

BIN
content/post/gtfs-to-osm/media/josm_trip_1.png

After

Width: 1299  |  Height: 713  |  Size: 268 KiB

BIN
content/post/gtfs-to-osm/media/josm_trip_2.png

After

Width: 520  |  Height: 552  |  Size: 95 KiB

BIN
content/post/gtfs-to-osm/media/model_arret.png

After

Width: 381  |  Height: 253  |  Size: 149 KiB

BIN
content/post/gtfs-to-osm/media/seine_et_marne_bus.gif

After

Width: 1299  |  Height: 591  |  Size: 347 KiB

BIN
content/post/gtfs-to-osm/media/stops_josm_1.png

After

Width: 231  |  Height: 195  |  Size: 56 KiB

BIN
content/post/gtfs-to-osm/media/stops_josm_2.png

After

Width: 221  |  Height: 207  |  Size: 64 KiB

BIN
content/post/gtfs-to-osm/media/stops_josm_3.png

After

Width: 396  |  Height: 292  |  Size: 152 KiB

BIN
content/post/gtfs-to-osm/media/stops_mapcontrib_1.png

After

Width: 381  |  Height: 313  |  Size: 36 KiB

BIN
content/post/gtfs-to-osm/media/stops_mapcontrib_2.png

After

Width: 727  |  Height: 453  |  Size: 135 KiB

BIN
content/post/gtfs-to-osm/media/stops_osmose.png

After

Width: 755  |  Height: 645  |  Size: 459 KiB

BIN
content/post/gtfs-to-osm/media/unroll.png

After

Width: 774  |  Height: 869  |  Size: 130 KiB

BIN
content/post/gtfs-to-osm/media/wiki_shape_progress.gif

After

Width: 538  |  Height: 96  |  Size: 28 KiB

BIN
content/post/gtfs-to-osm/media/wiki_stop_progress.gif

After

Width: 538  |  Height: 95  |  Size: 29 KiB

Loading…
Cancel
Save