Le blog de nlehuby

avril 29, 2014

Script d’intégration des arrêts de bus dans OSM à partir de navitia.io

Vous l'aurez compris, mon TOC (trouble obsessionnel cartographique) du moment, c'est les arrêts de bus !

Et en travaillant sur le projet KartoKartier, avec mes collègues, dans le cadre du concours Cartoviz, je me suis rendue compte qu'il y avait une belle marge de manoeuvre pour améliorer la qualité des données OSM pour les arrêts de bus : j'en parlais ici.

C'est ainsi que je me suis mise en tête de faire un script qui se nourrit de l'opendata RATP  via l'API navitia.io, pour enrichir les données OSM en ajoutant, pour commencer, les noms des arrêts manquants.

Ce script est disponible sur github, et librement réutilisable.

Que fait ce script ?

Tout d’abord, il récupère la liste de tous les arrêts de bus, situé dans la ville de Paris (par exemple), qui n’ont pas de nom renseigné.

J'ai commencé par l'utiliser sur des villes plus proches de la mienne, voici quelques métriques :

  • nombre d’arrêts sans nom à Paris : 267
  • nombre d’arrêts sans nom à Boissy-Saint-Léger : 21
  • nombre d’arrêts sans nom à Sucy-en-Brie : 38
  • nombre d’arrêts sans nom à Créteil : 25
  • nombre d’arrêts sans nom à Bonneuil-sur-Marne : 3

Ensuite, pour chacun de ces arrêts, j’appelle navitia.io (une API pour les transports en commun, développée par Kisio Digital (anciennement Canal TP), et qui s'alimente, entre autres, des données opendata RATP) et je lui demande de me retourner les points d’arrêts à proximité des coordonnées du point OSM.

Les données opendata de la RATP, qui sont utilisées dans navitia.io ont une géolocalisation peu précise, donc en faisant varier la distance d’accroche, on obtient des résultats plus ou moins pertinents :

Métriques sur Paris :

  • Nombre d’arrêts OSM ayant un arrêt RATP à moins de 100 mètres : 249
  • Nombre d’arrêts OSM ayant un arrêt RATP à moins de 50 mètres : 221
  • Nombre d’arrêts OSM ayant un arrêt RATP à moins de 20 mètres : 145
  • Nombre d’arrêts OSM ayant un arrêt RATP à moins de 10 mètres : 74

Sur ces arrêts, j’ai choisi, dans un premier temps, de ne conserver que
ceux qui ont un unique arrêt RATP (ou plusieurs arrêts avec le même nom)
ce sont les plus faciles à intégrer.

Pour ceux-là, je crée un fichier JOSM avec le nom pré-rempli.

Il n’y a plus alors qu’à ouvrir le fichier dans JOSM, à charger les données existantes autour du point, à vérifier que les infos sont cohérentes, puis à envoyer la modification dans OSM.

image : retour

exemple de retour du script

image : retour du script sur Boissy

Ci-dessus, le retour du script sur Boissy-St-Léger : il n'y a un seul arrêt RATP (l'arrêt noctilien que j'ai cartographié dans un article précédent), et il a déjà un nom !

Dans la pratique, l’intégration :

J’ai choisi d’y aller itérativement, et de commencer par les moins ambigus, donc ceux ayant un arrêt RATP très proche. J'ai aussi choisi de commencer par ceux proches de chez moi, pour pouvoir faire une vérification sur le terrain en cas de doute.

Les premiers arrêts que j'ai intégrés étaient parfaits : c'est le cas typique

  • où navitia a trouvé une correspondance entre mon arrêt sans nom et les données opendata
  • où il n'y a que deux arrêts de bus dans tout le quartier, placé chacun d'un côté de la route (le sens aller et le sens retour)
  • le second arrêt a déjà un nom, et c'est le même que celui trouvé par navitia
  • éventuellement, mon arrêt a un tag name:RATP rempli, et concordant (mais il a peut-être été aussi généré par un script, je ne sais pas si c'est vraiment une mesure de fiabilité)

Là, on peut intégrer les yeux fermés :)

Malheureusement, c'est loin de représenter la majorité des cas ...

À vrai dire, j'ai même trouvé une bonne poignée d'exemples carrément invalides (c'est le cas de le dire) : par exemple, cet arrêt

image : cet arrêt

Il est situé à 16 mètres d’un arrêt de bus que l’opendata RATP appelle Invalides.

Mais, dans les données déjà présentes sur OSM, il est indiqué que c’est un arrêt desservi par les cars Air France.

En conséquence, navitia, alimenté par des données opendata RATP et SNCF (et pas Air France) n’est pas une source fiable pour me fournir le nom de l’arret.

Ça ne veut pas dire que l'arrêt ne s'appelle pas Invalides, mais à moins d'aller voir sur place, je ne peux pas en être certaine ...

On l'oublie souvent, mais il n'y a pas que la RATP comme opérateur de transport, même à Paris !

J’ai même découvert des opérateurs de transport que je ne connaissais pas :

image : opérateur

Enfin, il ya aussi des exceptions géographiques étranges : je pense par exemple aux arrêts de bus autour de Porte Dorée : on trouve deux arrêts, chacun d'un côté de la route, et il y en a un des deux qui ne s'appelle pas Porte Dorée !

image : cet arrêt

Bref, on aurait pu croire qu’on pouvait tout importer automatiquement, mais en creusant un peu, on se rend compte que souvent, il y a des petites subtilités et qu’une vérification humaine est effectivement nécessaire. On comprend ainsi beaucoup mieux les réticences de la communauté OSM face aux imports massif de données d’autres sources (c'est d'ailleurs pour ça qu'on parle ici d'intégration, et non d'import).

État des lieux :

En bref ... aujourd'hui, j'ai intégré tous les arrêts RATP des villes proches de chez moi (Boissy, Sucy, Bonneil, Créteil). Mais malheureusement, ils ne représentent pas la majorité des arrêts de bus de ces villes, qui sont massivement desservies par d'autres compagnies, dont les données de transport ne sont pas en opendata, et donc pas dans navitia.io !

Sur Paris, il m'en reste aujourd'hui moins de 100 !

Et après ?

Les possibilités sont multiples : par exemple, l'intégration dans Osmose pourrait permettre à d'autres contributeurs de vérifier avant d'envoyer les modifications dans OSM (comme ce qui est fait pour les données opendata des écoles par exemple).

Il serait intéressant également de regarder les rejets de mon script, comme les arrêts OSM ayant plusieurs arrêts opendata (avec un nom différent) à proximité : sur ceux-là, une vérification sur le terrain s'impose pour choisir entre les possibilités.

Ensuite, pourquoi pas réfléchir à l'intégration des lignes de bus RATP à partir de navitia.io !

De plus, OSM est un projet international, et navitia aussi, donc le modèle pourrait s'exporter sans soucis ...

Mais j'attends surtout l’opendata des données transports sur toute l’Île-de-France, pour compléter les villes près de chez moi !

EDIT 2015 : c'est fait, les données de toute l'Île-de-France sont librement accessibles

EDIT 2017 : mise à jour de quelques liens cassés