Skip to content
This repository has been archived by the owner on Dec 8, 2022. It is now read-only.

* Exemple d'utilisation (en français)

Patrick GENDRE edited this page Apr 1, 2016 · 16 revisions

L'exemple de l'open data de Grenoble

Pour illustrer le fonctionnement de gtfslib, nous prendrons à titre d'exemple le jeu de données du réseau transport collectif de Grenoble, publié par la Métropole. Les exemples sont faits avec des données téléchargées le 22/01/16.

On importe les données dans une base de données tag.sqlite que l'on crée pour l'occasion:

$gtfsdbloader tag.sqlite --load=data/tag.zip --id='tag'
Importing feed ID 'tag'
Imported 0 feedinfo
Importing agencies...
Imported 1 agencies
Importing zones, stations and stops...
Imported 0 zones, 2222 stations and 2222 stops
...
Importing trips...
Imported 23215 trips
...
Normalizing trips...
...
Expanding frequencies...
Expanded 0 frequencies to 0 trips.
Feed 'tag': import done.

Pour visualiser les données en base, vous pouvez utiliser la ligne de commande sqlite ou un logiciel comme SqLite DataBase Browser, qui fonctionne sur tous les systèmes.

Les fonctions d'accès aux données permettent de manipuler les données "métier" du TC : itinéraires (routes), courses (trips), arrêts (stops), calendriers, etc. Pour reprendre les exemples du tutoriel wiki - à noter qu'on n'utiliser pas ici virtualenv mais cela peut êtr nécessaire selon l'installation effectuée - :

$python
>>>from gtfslib.dao import Dao
>>>dao = Dao("tag.sqlite")
>>>route = dao.route('A',feed_id="tag")
>>>print(route)
<Route(id=tag/A, {u'route_type': 0, u'route_long_name': u'Fontaine La Poya / Echirolles Denis Papin', u'route_color': u'0076BE', u'route_text_color': u'FFFFFF', u'agency_id': u'SEM', u'route_id': u'A', u'feed_id': u'tag', u'route_short_name': u'A'})>
>>>from gtfslib.model import Stop,StopTime,CalendarDate,Route,Trip,Calendar
>>>gares = dao.stops(fltr=Stop.stop_name.ilike("%gare%") & Stop.stop_name.ilike("%uriage%"))
>>>for g in gares:
    print(g)
<Stop(id=tag/GENURIAGE, {u'stop_lat': 45.14395, u'wheelchair_boarding': 0, u'stop_lon': 5.82915, u'feed_id': u'tag', u'stop_id': u'GENURIAGE', u'stop_name': u"SAINT-MARTIN-D'URIAGE, URIAGE GARE", u'location_type': 1})>
<Stop(id=tag/4211, {u'stop_lat': 45.14399, u'wheelchair_boarding': 0, u'parent_station_id': u'GENURIAGE', u'location_type': 0, u'feed_id': u'tag', u'stop_id': u'4211', u'stop_name': u"SAINT-MARTIN-D'URIAGE, URIAGE GARE", u'stop_lon': 5.82949})>
<Stop(id=tag/4212, {u'stop_lat': 45.14395, u'wheelchair_boarding': 0, u'parent_station_id': u'GENURIAGE', u'location_type': 0, u'feed_id': u'tag', u'stop_id': u'4212', u'stop_name': u"SAINT-MARTIN-D'URIAGE, URIAGE GARE", u'stop_lon': 5.82915})>
>>>LA=dao.routes(fltr=Route.route_id == "11")[0]
>>>t=LA.trips
# sélection de la ligne 11 et des courses de cette ligne
>>>from gtfsplugins import decret_2015_1610
# vérification que la ligne A est bien du transport urbain au sens du décret de décembre 2015
>>>decret_2015_1610.decret_2015_1610(t)
Calcul decret 2015 1610 sur 663 voyages.
Calcul de l'espacement moyen des arrêts...
L'espacement moyen entre arrêt du réseau est de 379.44 mètres (max 500m).
Calcul du jour ayant la fréquence en voyage la plus élevée...
Le jour ayant le nombre de voyage le plus élevé est le 2016-01-04, avec 176 voyages.
Calcul des fréquences sur la plage horaire 8h - 19h...
La fréquence minimale est de 6.50 voyages/heure, entre 18:59:00 et 19:59:00.
La fréquence maximale est de 12.32 voyages/heure, entre 16:52:00 et 17:52:00.
Le ratio entre fréquence max et min est de 1.895 (max 2.5).
Ce service est URBAIN au sens du décret n° 2015-1610.
Out: True

On peut bien sûr, au-delà de ces quelques lignes, utiliser la librairie pour développer tout ce qu'on veut en Python...

C'est ce qui a été fait d'ailleurs pour les "plug-ins" qui sont proposés avec la librairie:

$ gtfsrun -l
List of all available plugins:
DemoPlugin:
...  
Decret_2015_1610:
...  
Frequencies:
... 
TripsPerDay:
...
ShapefileExport:
...

$ gtfsrun tag.sqlite Decret_2015_1610 --filter="Route.route_id=='A'"
Chargement des données...
Calcul decret 2015 1610 sur 1968 voyages.
Calcul de l'espacement moyen des arrêts...
L'espacement moyen entre arrêt du réseau est de 455.38 mètres (max 500m).
Calcul du jour ayant la fréquence en voyage la plus élevée...
Le jour ayant le nombre de voyage le plus élevé est le 2016-01-04, avec 499 voyages.
Calcul des fréquences sur la plage horaire 8h - 19h...
La fréquence minimale est de 22.03 voyages/heure, entre 18:59:00 et 19:59:00.
La fréquence maximale est de 24.87 voyages/heure, entre 15:20:00 et 16:20:00.
Le ratio entre fréquence max et min est de 1.129 (max 2.5).
Ce service est URBAIN au sens du décret n° 2015-1610.
# la ligne A de Grenoble est bien du transport urbain!
$ gtfsrun tag.sqlite ShapefileExport \
 --filter="CalendarDate.date=='2016-02-22'" --cluster=200 \
 --stopshp="stops.shp" --hopshp="hops.shp"
Loading stops...
Loaded 1456 stops. Clusterize...
Aggregated in 597 clusters
Loading calendar dates
Loaded 1 dates
Computing stop and hop trip count...
1000 trips...
2000 trips...
3000 trips...
4000 trips...
Generating stops cluster shapefile...
Generating hop shapefile...

La dernière commande regroupe les arrêts à moins de 200 mètres et produit un fichier Shapefile des arrêts, et un fichier ShapeFile des tronçons de ligne, avec comme attribut le nombre de passages pour la journée du 22 février. Ce qui permet de produire ce genre de cartes (et des plus belles!). Fréquences de passage du réseau TC de Grenoble le 22/2/16

$ gtfsrun tag.sqlite TripsPerDay \
 --csv='freqjour.csv' --byroute \
 --filter="(CalendarDate.date >= '2016-02-22')&(CalendarDate.date <= '2016-02-28')"
Loading calendar dates...
Loaded 7 dates
Processing trips...
0 trips...
1000 trips...
2000 trips...
3000 trips...
4000 trips...
5000 trips...
6000 trips...
7000 trips...
8000 trips...
9000 trips...
Processed 9881 trips

L'export du nombre de courses par jour et par lignes (sens A et R confondus) permet de produire ce genre de graphiques, comparant la fréquence selon le jour de la semaine (le 22 est un lundi) et la ligne: Nombre de passages TAG par ligne et par jour de semaine

On peut également calculer d'autres indicateurs assez facilement. Par exemple si on veut le nombre de lignes passant par chaque arrêt, voici une manière (simpliste) de procéder.

>>> from gtfslib.dao import Dao
>>> dao = Dao("tag.sqlite")
>>> linesbystop={}
>>> for trip in dao.trips():
...   r=trip.route_id
...   for stop_time in trip.stop_times:
...     s=stop_time.stop_id
...     if s not in linesbystop:
...       linesbystop[s]=[r]
...       continue
...     if r not in linesbystop[s]:
...       linesbystop[s].append(r)

>>> f=open('sl.csv','w')
>>> f.write('stopid,nblignes\n')
>>> for s in linesbystop.keys():
...   f.write(s+','+ str(len(linesbystop[s]))+ '\n')
>>> f.close()

Il suffit ensuite de fusionner le fichier CSV obtenu avec le fichier stops.txt pour créer une couche affichable des arrêts indiquant le nombre de lignes passant par chaque arrêt. Pour être plus pertinent, il faudrait sans doute regrouper les arrêts (la carte actuelle ne fait apparaitre la gare ni l'hyper centre, ce qui n'est pas normal).

Nombre de lignes TAG passant par un arrêt