2
28 mai 2010

OSM_logo.png OpenStreetMap est un formidable projet, on ne le dira jamais assez. La constitution d'une base de données mondiale pour la constitution d'une carte libre est une avancée majeure dans la libéralisation des données géographiques. Preuve en est, certaines villes françaises commencent à alimenter la base grâce à leurs propres données.
Cependant, mis à part le fait de visualiser la carte sur le site, la façon dont on peut récupérer des données reste pour beaucoup de personnes assez obscure. Et pourtant, au delà des API existantes, il en existe une qui permet très facilement de 'requêter' la base afin d'obtenir les entités voulues.

L'API OpentreetMap v0.6

L'API principale (que j'aurais plutôt nommée protocole) d'OpenStreeMap est une Web API (type RESTful). Pour faire simple, cela signifie que les requête vont s'appuyer sur le protocole HTTP pour dialoguer avec le serveur. Si cette notion est totalement nouvelle pour vous, je vous conseille la lecture de l'excellent blog BioloGeek . Pour en revenir à XAPI, nous disions donc qu'elle permet d'interroger, via une URL, le serveur contenant les données afin d'effectuer toutes sortes d'opérations :

  • ajout d'objets
  • modification d'objets
  • suppression d'objets

Ces opérations entrainant des modifications dans la base, il est donc nécessaire de s'authentifier avant toutes actions. C'est d'ailleurs ce que vous faites quand vous utilisez des outils tels que JOSM et Potlatch. Pour plus de facilité, l'API d'OSM a été traduite dans différents langages de programmation tels que Ruby, Java ou encore Python. Je n'ai rien trouvé concernant une implémentation PHP mais cela doit, très certainement, exister.

L'authentification peut paraitre un peu compliquée et surtout superflue si vous souhaitez simplement télécharger quelques données sur une zone précise. C'est pourquoi il existe une API simplifiée, XAPI, qui permet d'interroger la base de données via une simple requête URL.

La XAPI ... zappy ...

Cette API, ne fonctionne qu'en lecture seule. Vous ne pourrez réaliser aucune modification sur la base. Ça tombe bien, c'est ce que nous souhaitons faire ici.

Les serveurs

La XAPI tourne sur plusieurs serveurs différents, il est donc possible d'interroger la base de données sur ces derniers :

Cependant ces serveurs ne sont pas toujours en très grande forme. C'est pourquoi la réponse à une requête peut parfois être très longue. Mais rassurez-vous, là encore, cela est plutôt bien fait. En effet, InformationFreeway redirige la requête vers le serveur approprié : le début de la requête sera alors le suivant : http://www.informationfreeway.org/api/0.6.

La construction d'une requête

Une requête est donc une simple URL bien formatée qui nous retournera un fichier XML. Celle-ci doit contenir les différents éléments ci-dessous :

Bounding box

Tout d'abord il convient de définir l'emprise géographique. Pour des raisons évidentes de charge serveur, une limitation a été instaurée :

  • l'API normale avec authentification n'autorise une emprise géographique que de 0.25 degré carré.
  • la XAPI, elle, permet une zone bien plus large : 100 degrés carré soit environ 788 000 km² à une latitude de 48° - à peu près Paris.

La définition de l'emprise s'écrit donc de cette façon :

GET /api/0.6/map?bbox=left,bottom,right,top

  • left = longitude ouest
  • bottom = latitude nord
  • right = longitude est
  • top = latitude sud

Si vous ne connaissez pas l'étendue géographique de la zone que vous désirez intérroger, je vous renvoie vers l'astuce donnée sur le blog weait. Vous y trouverez tous les renseignements nécessaires.
Cette requête est équivalente à celle-ci - que nous préfèrerons par la suite parce qu'elle permet de 'poser' des questions sur les entités :


GET /api/0.6/*[bbox=left,bottom,right,top]

Les objets
OpenStreetMap propose 3 types d'entités : les noeuds, les chemins et les relations - cf. ici

  • Les noeuds sont des points.
  • Les chemins sont des groupes de noeuds.
  • Les relations sont composées de chemins et de noeuds ayant des rôles.

Les noeuds
Pour récupérer des noeuds sur une zone prédéfinie, ce n'est pas très compliqué :

GET /api/0.6/node[amenity=pub][bbox=left,bottom,right,top]

Notons que le principal tag des noeuds est amenity qui permet de spécifier le type du noeud. Voir la liste des valeurs principales.

Les ways
Pour les chemins, c'est la même structure :

GET /api/0.6/way[admin_level=8][bbox=left,bottom,right,top]

Pour avoir les limites administratives de niveau 8 - les communes - sur la zone demandée.

Les relations

GET /api/0.6/relation[landuse=residential][bbox=left,bottom,right,top]

Pour les zones résidentielles.

Voici la liste complète des tags utilisés dans OSM. Evidemment cette liste n'est pas arrêtée, il est possible d'en proposer des nouveaux.
Il est possible aussi de voir la liste actualisée des relations en France grâce à Tagwatch.

Note : il est malheureusement impossible pour le moment de 'demander' un objet ou un autre objet - le OR n'existe pas - il faut faire plusieurs requêtes.

Démonstration

Un petit exemple sur Toulouse en affichant les positions des toilettes présentes dans la base de données.
Ici nous avons utilisé la classe Strategy Cluster d'OpenLayers pour représenter les données - cherchez un peu sur le site pour voir comment cette dernière fonctionne :-)