mai 01, 2018
Si vous êtes utilisateur de données OpenStreetMap, que ce soit pour faire des cartes, des applicatifs géographiques, ou juste des analyses, vous connaissez sûrement les outils en ligne de commande de la communauté : osmosis, osmium ou encore osmconvert.
J'ai moi-même déjà évoqué certains de ces outils dans un précédent article.
Mais lorsqu'on est intéressé(e) par les lignes de transports, ces outils ne sont pas des plus pratiques, car il est nécessaire de manipuler des relations OSM, c'est-à-dire des objets un brin complexes constitués eux-mêmes d'autres objets.
Bien sûr, la bonne vieille solution Overpass reste envisageable si la zone n'est pas trop grosse. Jetez un œil à cet autre article pour trouver la requête qu'il vous faut ;)
Mais dans tous les cas, il nous faudra jongler dans nos filtres pour récupérer les relations de type route ou route_master avec certains tags uniquement car les circuits de marche nordique ou encore les pipelines vraiment très longs sont cartographiés d'une manière très similaire...
C'est pourquoi je suis ravie de vous présenter osm-transit-extractor, une alternative qui apporte enfin aux transports en commun toute l'attention qu'ils méritent ;)
Pour un cas pratique, imaginons donc que vous voulez vous faire une idée des lignes de transports de Bretagne.
osm-transit-extractor se présente sous la forme d'un exécutable (Linux uniquement pour le moment) : il suffit donc de le télécharger depuis Github puis de le dézipper pour l'utiliser.
Ensuite, on récupère les données de la zone qui nous intéresse, ici la région Bretagne, au format PBF.
Et c'est parti :
./osm_transit_extractor -i bretagne-latest.osm.pbf
Oui, c'est tout !
On obtient alors un petit ensemble de fichiers csv avec les données qui nous intéressent.
Les 3 fichiers les plus intéressants sont
- les arrêts :
osm-transit-extractor_stop_points.csv
- les parcours :
osm-transit-extractor_routes.csv
- les lignes :
osm-transit-extractor_lines.csv
(relations route_master dans OSM)
Ces fichiers contiennent à la fois les informations utiles sur ces objets ainsi que tous les tags OSM, mais aussi les géométries de ces objets.
Ces fichiers csv peuvent donc s'utiliser aussi bien dans un tableur (ou autre) pour une analyse des métadonnées, ou dans QGIS (ou autre) pour une représentation cartographique.
Voici par exemple un extrait des infos de quelques lignes :

Et voici une petite représentation de ces lignes, réseau par réseau :

Notre extraction comprend également des fichiers pour faire le lien entre les différents objets, par exemple entre une ligne et ses différents parcours, ou entre un parcours et ses arrêts.
Voici par exemple la liste des parcours de la ligne de Ferry Brest Ouessant :

Voici encore un extrait des arrêts de la ligne 9 de Kicéo en direction de Meucon :

Et ce n'est qu'un aperçu : osm-transit-extractor est un vrai petit couteau suisse, rapide et efficace dès qu'on veut des infos sur les lignes de transports dans OSM.
Bien sûr, c'est opensource, donc n'hésitez pas à passer sur github si vous rencontrez des soucis ou avez des idées d'évolutions. Et si vous êtes un rustacéen, vos contributions sont les bienvenues ;)
déc. 29, 2017
L'année 2017 s'achève et c'est le traditionnel moment de faire le point sur ce qui a été accompli ! Pour moi, l'année fut monopolisée par le projet Jungle Bus, c'est donc tout naturellement que cet article parlera, encore et toujours, de bus dans OSM \o/
Mon occupation principale cette année fut l'amélioration de la qualité des données de transport dans OSM. Les résultats sont visibles dans deux outils : JOSM et Osmose.
Dans JOSM, il s'agit d'un validateur à activer (dans les Préférences > Validateur de données > Règles du vérificateur d'attribut. Puis sélectionner Jungle Bus).
Il propose actuellement 20 tests sur les transports en général (les bus mais pas que, aussi bien les arrêts que les lignes), et permet de repérer et de corriger les erreurs classiques au plus tôt, directement dans son outil de contribution habituel.

Et quelques uns de ces tests ont été également ajoutés dans Osmose, qui compte à présent 15 tests sur les transports en commun. Plus d'info sur la page dédiée dans le wiki.

J'ai également réalisé un thème pour OSMTracker afin d'avoir un outil simple et efficace possible pour enregistrer les tracés des bus à cartographier.
J'ai aussi testé, et testé encore, l'application Jungle Bus, qui grâce à nos généreux soutiens et sponsors, a reçu pas mal d'améliorations cette année pour faciliter la contribution !

Et enfin, j'ai fait de la vulgarisation, un peu de doc et d'accompagnement de contributeurs désireux d'améliorer la cartographie de leur réseau de transport.
En particulier, le fait marquant de l'été fut le projet de cartographie des réseaux de tro tro, les bus artisanaux d'Accra, la capitale du Ghana. Les 300 lignes ont ainsi été collectées et ajoutées à OSM !
Ce projet, qui est une collaboration entre l'AFD, Transitec, Jungle Bus et la communauté OpenStreetMap locale nous a permis de confronter nos outils et nos méthodes aux besoins réels.
Nous avons également transformé ces données OSM en données transport utilisables par navitia.io et les applications mobiles TransportR et Transit, afin d'offrir aux utilisateurs des informations utiles pour leurs trajets et au "Department of Transport" de la ville les données nécessaires pour gérer au mieux ce réseau et améliorer la qualité de vie de ses 2 millions d'habitants.

À cela s'ajoutent encore quelques projets, trop petits ou pas encore assez aboutis pour mériter d'être signalés ici ...
Focus Île-de-France
Fin 2016, j'avais lancé un outil de comparaison entre les données transport dans OSM et dans l'opendata du STIF.
Il a peu évolué en un an, mais heureusement, on ne peut pas en dire autant d'OSM, qui s'est considérablement améliorée : près de 400 lignes ont été ajoutées en un an !
J'ai également développé une analyse Osmose spécifique, pour améliorer les tags manquants dans OSM à partir des infos fournies dans l'opendata.
Je me suis aussi pas mal promenée, à la recherche de marqueurs Maps.me à traiter, et je n'ai visiblement pas été la seule :
- plus que 2211 arrêts sans nom
- plus que 9647 arrêts non desservis
Si vous voulez contribuer, je continue de générer et de mettre à jour régulièrement les marqueurs Maps.me qui vont bien :
Tous ces accomplissements sont collectifs avant tout, et je suis loin d'en être la seule responsable : un grand merci à tous ceux qui partagent mes aventures, sur OSM, sur github et IRL ;)
Allons encore plus loin ensemble en 2018 !

EDIT octobre 2018 : mise à jour de liens (les fichiers kml sont maintenant hébergés sur github).
août 10, 2017
Il y a quelques années, quand quelqu'un voulait réaliser une extraction OSM des arrêts de bus, il se retrouvait confronté à un problème :
- pour certains, un arrêt de bus est un lieu sur le bord de la route, où des voyageurs attendent leur bus
- pour d'autres, c'est un endroit sur la voirie, où un bus s'arrête
La nuance peut sembler légère, mais cela peut jouer sur la volumétrie : lorsqu'on a deux abribus en face, on peut se retrouver avec deux arrêts selon la première définition, mais un unique arrêt avec la seconde...
Pour résoudre ce souci, la communauté OSM a planché sur une nouvelle modélisation des arrêts (entre autres), qui a été adoptée par vote en 2011.
Deux nouveaux attributs viennent compléter le modèle : l'un désigne l'endroit sur la chaussée où le bus s'arrête (public_transport = stop_position), et l'autre désigne l'endroit où les voyageurs attendent (public_transport = platform).
Un problème, une solution, KISS !
Vraiment ?
Admettons, pour les besoins de l'exercice, que je sois intéressée par les arrêts de bus, au sens "les endroits où les voyageurs attendent leur bus".
Facile donc, si je veux extraire tous les arrêts de France, je n'ai qu'à filtrer mes données OSM sur le tag public_transport = platform.
Voici les résultats de mon extraction (sur des données du 4 aout 2017) : en France métropolitaine, on a d'après OSM, 45 408 arrêts où attendent des voyageurs.
Là, si le résultat ne vous choque pas, croyez-moi sur parole : ce n'est pas crédible.
Rien qu'en Île-de-France, on a déjà environ 40 000 arrêts de transport en commun, donc, même si la base OSM n'est pas exhaustive, ce n'est pas vraiment le bon ordre de grandeur.
Ok, par curiosité, si j'utilise le tag historique higwhay = bus_stop, qu'est-ce que ça donne ?
123 956 arrêts. Déjà plus crédible.
Mais souvenez-vous, pour certains, un arrêt de bus désigne un endroit sur la route, et moi je veux les abribus et les poteaux où les gens attendent. Essayons de combiner : si je prends les highway = bus_stop qui ne sont pas des public_transport = stop_position : 98 173 arrêts.
Bon, si je regarde dans le détail, je trouve que la plupart de ces arrêts n'ont pas le tag public_transport de renseigné du tout. Difficile de savoir quelle proportion de ceux là sont dont des stop_position qui ne m'intéressent pas.
Au final, combien ai-je d'arrêts ? 45 mille, 98 mille ou 124 mille ?
Bref, six ans après l'adoption du nouveau schéma, extraire les arrêts de bus est une opération qui reste hasardeuse...
Exigeons plus ! Et si, en tant que contributeur OSM, on appliquait le schéma et qu'on ajoutait scrupuleusement stop_position ou platform sur tous les higwhay=bus_stop ?
Une analyse Osmose est déjà disponible pour identifier les arrêts à compléter : c'est par ici que ça se passe, et c'est très facile à corriger !
Même si cela ne suffira pas, ce sera déjà la première marche vers plus de réutilisabilité des données OSM \o/
Et en cadeau, si vous être arrivés jusque là dans cet article passionnant, voici des représentations cartographiques de la répartition de ces différentes combinaisons d'attributs.

NB : Cet article comprend des approximations et simplifications pédagogiques.
D'ailleurs, si vous les avez remarquées, n'hésitez pas à venir prolonger la discussion sur la liste de diffusion transport de la communauté OSM France, par ici ;)
août 03, 2017
Le génial service Overpass-turbo permet depuis quelques temps de sauvegarder ses requêtes favorites via son compte OSM.
Voici la liste des requêtes que je me suis enregistrées, sur la thématique des bus :
Arrêts à proximité
Liste des arrêts à 500 mètres d'une position (ici 48.86343,2.40997) :
[out:csv(::"id", name, public_transport, "ref:FR:STIF", ::"user")];
//[out:json];
node
(around:500,48.86343,2.40997)
["highway"="bus_stop"];
out;
Arrêts à proximité, avec les parcours desservis
Liste des arrêts à 500 mètres d'une position, avec le détail des parcours qui passent à ces arrêts :
[out:json];
(
node
(around:500,48.86343,2.40997)
["highway"="bus_stop"];
)->.a;
rel(bn);
out body;
.a out body;
Arrêts d'une zone, avec les parcours desservis
Liste des arrêts d'une zone géographique, avec comme précédemment, le détail des parcours qui passent à ces arrêts :
[out:json];
(
node
["highway"="bus_stop"]
({{bbox}})
)->.a;
rel(bn)["route"="bus"];
out center;
.a out body;
Arrêts d'un parcours
Liste de tous les arrêts d'un parcours en particulier (défini par son id, ici 1083331)
[out:csv(::"id", name, public_transport, "ref:FR:STIF", ::"user")];
relation(1083331);node(r:"platform");out meta;
Si la ligne n'est pas en schéma v2, alors remplacer platform par stop :
[out:csv(::"id", name, public_transport, "ref:FR:STIF", ::"user")];
relation(1257174);node(r:"stop");out meta;
Arrêts non desservis
Liste des arrêts qui ne sont desservis par aucune ligne de bus.
//[out:csv(::"id", name, public_transport)];
[out:json];
node({{bbox}})["highway"="bus_stop"]->.all;relation(bn.all)["route"="bus"];node(r);
( .all; - ._; );out skel;
Arrêts sans nom
Liste des arrêts de bus sans nom d'une zone géographique :
[out:csv(::"id", public_transport, "ref:FR:STIF", ::"user")];
(
node
["highway"="bus_stop"][!"name"]
({{bbox}})
);
out body;
Nombre d'arrêts sans nom d'un parcours
Liste des arrêts de bus d'un parcours qui n'ont pas de nom renseigné :
[out:csv(total)];
//[out:json];
relation(1083331);node(r:"platform")[!"name"];out count;
Comme précédemment, si la ligne respecte le schéma v1 et non le v2, alors il faudra remplacer platform par stop.
Parcours d'une zone
Liste des parcours de bus dans une zone géographique :
[out:csv(::"id", name, network, operator, ::"user")];
(
relation["route"="bus"]({{bbox}});
);
out meta;
Parcours orphelins
Liste des parcours de bus qui n'ont pas de ligne de bus associée
[out:csv(::"id", name, network, operator, ::"user")];
rel({{bbox}})["route"="bus"]->.all;
rel["route_master"="bus"](br.all);
rel["route"="bus"](r);
( .all; - ._; );
out meta;
Avec ça, vous avez tout ce qu'il faut pour prendre soin des bus dans OSM ;)
mai 28, 2017
Aujourd'hui, je vous propose quelques rappels théoriques sur comment bien cartographier les bus dans OSM.
NB : Je prends pour référence le modèle dit "Public Transport v2", approuvé par la communauté OSM en 2010. À noter qu'il n'y a pas eu de mise à niveau globale vers ce modèle et donc que le modèle historique, plus simple mais moins précis, continue d'exister et est souvent le seul reconnu par les outils utilisant les données OSM.
Pour commencer, on a l'arrêt de bus.

Dans le modèle historique, pour cartographier cet arrêt de bus, on se contentait de mettre un tag highway = bus_stop, en général au niveau du trottoir.
Mais ça, c'était avant ! Maintenant, on crée deux objets dans OSM :
Tout d'abord, pour désigner l'endroit où le voyageur attend le bus (ici, l'abribus), on crée un noeud, avec les tags public_transport = platform.
Pour bien préciser le mode (car ce tag s'applique aussi pour les arrêts de tram ou de train), et pour la rétro-compatibilité avec l'ancien modèle (notamment sur les outils de rendu), on ajoute également highway = bus_stop.
Puis, on peut créer un deuxième noeud, qui représente l'endroit sur la chaussée où le bus s'arrête. À noter que le noeud doit faire partie du chemin décrivant la route et non pas être posé dessus.
Sur ce noeud, on ajoute les tags public_transport = stop_position et bus=yes
Une fois qu'on a fait ça, on peut ajouter les infos contextuelles propres à cet arrêt, comme son nom (name = ...), s'il y a un abri (shelter =yes/no), un banc (bench = yes/no), une bande podotactile, etc
En général, on ajoutera tout ça uniquement sur l'objet platform (même s'il est courant de répéter le nom aussi sur le stop_position).

Une fois qu'on a bien cartographié notre arrêt, il nous faut indiquer quels bus s'y arrêtent.
Les lignes de bus sont représentées dans OSM par des relations, c'est-à-dire des objets qui sont des regroupements d'autres objets.
Une ligne de bus dans OSM sera une relation de type = route_master.
On lui ajoutera les autres tags suivants :
- route_master = bus pour indiquer son mode
- ref = un nombre, pour indiquer le numéro de la ligne
- operator = ..., pour renseigner l'entreprise qui fait rouler ces bus
- network = ..., pour indiquer le nom du réseau
- name = ..., pour indiquer le nom de la ligne
Dans cette relation ligne de bus, on mettra les objets OSM qui représentent les variantes de tracés de la ligne, ses parcours.
En général, on aura au moins le parcours de la ligne en sens aller et le parcours de la ligne en sens retour. On trouvera aussi parfois le parcours spécial du matin qui s'arrête devant l'école, ou le parcours spécial du jeudi qui passe dans une autre rue à cause du marché.
Les parcours (variantes de lignes ou trajets) sont aussi des relations, de type = route.
On leur ajoute les tags suivants :
- route = bus pour indiquer le mode
- ref = un nombre, pour rappeler le numéro de la ligne
- operator = ..., pour rappeler l'entreprise qui fait rouler ces bus
- network = ..., pour rappeler le nom du réseau
- name = ..., pour indiquer le nom du parcours
- from = ..., pour indiquer le point de départ du parcours
- to = ..., pour indiquer la destination du parcours
- public_transport:version = 2, pour indiquer qu'on utilise le "nouveau" modèle et non le modèle historique
Et dans cette relation parcours, on ajoute :
- tous les chemins que prend le bus
- nos fameux arrêts, platform et stop_position, dans l'ordre où ils sont desservis.

En particulier, on ajoutera les platform avec le rôle ... platform, et les stop_position avec le rôle ... stop (ben oui, vous pensiez quand même pas que ça serait si simple !).
Et on le fera bien sûr pour toutes les lignes (ou plus précisément variantes de lignes) qui s'arrêtent à cet arrêt.
Si vous avez bien suivi, on a donc des noeuds (platform et stop_position), qu'on met dans les relations (type = route), qu'on met elles-mêmes dans des relations (type = route_master)

À noter que dans le modèle historique, les relations parcours (type = route) contenaient uniquement les arrêts (highway = bus_stop) avec le rôle stop. Avec le nouveau modèle, les objets qui ont le tag highway=bus_stop ont en général plutôt le rôle platform.
Pour bien savoir ce que représente un objet qui a le rôle stop, on ajoute public_transport:version = 1 sur les relations parcours (type = route) qui ont été cartographiées suivant le modèle historique et n'ont pas encore été mises à niveau.
Vous suivez toujours ? Parce que ce n'est pas fini !
Pour rassembler tous les arrêts en correspondance, on utilisera encore une autre relation, avec les tags type = public_transport et public_transport = stop_area.
De la même manière, les platform auront le rôle platform, et les stop_position le rôle stop.
Ces relations sont encore très peu répandues dans OSM ; pour les bus on les retrouve surtout dans les grandes gares routières.

Une fois que vous avez ajouté vos platform et stop_position dans tous les parcours (type = route et route = bus) et dans sa zone d'arrêt (type = public_transport et public_transport = stop_area), vous avez fini !
Félicitations, vous pouvez maintenant vous attaquer à l'arrêt de bus qui est de l'autre côté de la rue ;)
Le mot de la fin :
Vous trouvez que tout ceci est bien compliqué pour pas grand chose, et qu'on devrait pouvoir faire ça de manière transparente dans une appli, directement quand on est sur le terrain ?
Vous avez raison : soutenez le projet Jungle Bus pour rendre tout ceci possible !
Vous pestez parce que je n'ai pas parlé des rôles exit_only et entry_only, ni du fait qu'il fallait parfois couper les chemins ? Rejoignez le projet Jungle Bus, les bussophiles sont y sont accueillis à bras ouverts ;)