Polygone de la ville d'Angers

L'objectif de l'exercice étant de travailler hors-ligne, nous allons travailler à partir d'exports de la base. Le plus connu est le planet.osm qui contient la totalité des données OpenStreetMap... mais c'est un peu gros pour nous. Nous allons nous limiter au fichier décrivant la région Pays-de-la-Loire disponible sur Geofabrik.

Bien entendu, la totalité du fichier ne nous intéresse pas. Nous allons devoir restreindre notre champs de recherche à la seule ville d'Angers, et pour ce faire nous allons définir le polygone géoréférencée qui délimite les frontières de la ville. La majorité des outils d'OpenStreetMap sont capable de filtrer les données selon des polygones définis dans un fichier au bon format.

Première tâche donc : définir le polygone de la ville d'Angers. Une solution consisterait à placer manuellement des points sur la carte OSM autour d'Angers de façon à construire la polygone. En tant que fainéant d'informaticien, je préfère tirer parti :

  1. de l'existence d'un script permettant de convertir une relation en polygone
  2. du superbe travail de tracé des limites administratives qui a été réalisé par la communauté.

Pour trouver l'identifiant de la relation associée aux limites administratives de la ville d'Angers, il nous suffit de passer par le service Nominatim qui propose un moteur de recherche de lieux basé justement sur les limites administratives d'OSM. La fiche de la ville d'Angers nous apprend qu'Angers est délimitée par la relation 1659048.

Plus qu'à mettre en œuvre le script getbound.pl :

$ ./getbound.pl -o ../polygone-angers.poly 1659048
Unable to load aliases from aliases.yml: Can't open 'aliases.yml' for input:
Aucun fichier ou dossier de ce type at /usr/lib/perl5/YAML/XS.pm line 46.
Downloading RelID=1659048...  Ok

Par souci de simplicité pour ceux qui veulent reproduire l'exercice, et parce que ça pourrait me servir, le fichier est disponible sur mon serveur (avec le polygone de la ville de Nantes).

Filtrage des arrêts avec Osmosis

Tout comme avec l'XAPI, il est possible avec Osmosis de filtrer le contenu qui nous intéresse, soit dans notre cas :

  • les nœuds correspondant à des arrêts de bus : highway=bus_stop
  • les nœuds correspondant à des arrêts de tramway : railway=tram_stop
  • les relations correspondant à des lignes de bus : route=bus
  • les relations correspondant à des lignes de tramway: route=tram

L'installation d'Osmosis ne pose en théorie pas de difficulté particulière : procédure d'installation sur le wiki.

Si jamais vous souhaitez par la suite retravailler sur la ville d'Angers, il peut être rentable de créer un fichier dédié regroupant l'ensemble des données. En effet, une fois décompressé, le fichier des Pays-de-la-Loire pèse un peu plus de 4Go... une masse de données pas facilement simple à manipuler.

$ bunzip2 pays-de-la-loire.osm.bz2
$ bin/osmosis --read-xml file="pays-de-la-loire.osm" --bounding-polygon file="polygone-angers.poly" --write-xml file="angers.osm"

Encore une fois, par souci de simplicité, ce fichier est directement disponible depuis mon serveur.

L'extraction des arrêts se fait relativement bien une fois les données préparées :

$ bin/osmosis \
    --read-xml file="angers.osm" \
    --tf accept-relations route=bus,tram \
    --tf accept-nodes highway=bus_stop,railway=tram_stop \
    --tf reject-ways \
    --used-node \
    --write-xml file="angers-transports.osm"

... ou encore si vous souhaitez travailler directement depuis l'extrait complet compressé :

$ bzcat pays-de-la-loire.osm.bz2 | osmosis-0.41/bin/osmosis --read-xml file=- \
   --bounding-polygon file="polygone-angers.poly"
   --tf accept-relations route=bus,tram \
   --tf accept-nodes highway=bus_stop,railway=tram_stop \
   --tf reject-ways \
   --used-node \
   --write-xml file=- | bzip2 > angers-transports.osm.bz2

Conversion en JSON

Le fichier OSM est le format de choix pour une utilisation avec les outils d'OpenStreetMap. Toutefois, il est beaucoup moins approprié à une utilisation dans le cadre d'un service web ou d'une application mobile par exemple.

J'ai écrit un petit script Python qui prend en entrée le fichier osm compressé et le transforme en un fichier JSON listant les différents arrêts de bus et de tramway ainsi que les lignes associées.

Le résultat pour la ville d'Angers est disponible sur mon serveur.