Jour 7 – Filtres géographiques

Nous nous sommes jusqu'ici intéressés aux filtres sur les tags, en nous contentant d'un simple ({{bbox}}) pour le filtre géographique.

Tout d'abord précisons que la forme ({{bbox}}) ne fait pas partie de la syntaxe Overpass API. Il s'agit d'un raccourci Overpass Turbo, qui se charge de convertir les limites définies par la carte dans la syntaxe (lat_min, lon_min, lat_max, lon_max), comprise par l'API Overpass. Cela vaut aussi pour la forme [bbox:{{bbox}}] placée en entête de requête :

[bbox:46.892,-2.322,47.037,-2.144];
nwr[amenity=restaurant];
out geom;

Recherche dans une surface

Effectuer une recherche à l'intérieur du périmètre d'une collectivité peut fonctionner avec une requête très simple. Exemple avec les restaurants de Rezé :

area[name="Rezé"];
nwr[amenity=restaurant](area);
out geom;

Cette requête mérite quelques explications.

L'instruction area

La première ligne trouve les surfaces dont le nom est “Rezé”. Des surfaces ? Oui, un serveur Overpass stocke, en complément des nodes, ways et relations, des surfaces dans un format adapté à l'exécution de tests comme « ce point est-il à l'intérieur ? ». Ces surfaces sont créées à partir des données OSM, pour toutes les relations de type multipolygon, et un grand nombre de ways fermés comme le décrit la page https://wiki.osm.org/wiki/Overpass_turbo/Polygon_Features. L'instruction area permet d'accéder à ces surfaces, en y appliquant les filtres habituels.

Lot de données courant

Comme pour les instructions node, way, rel et nwr, la première ligne produit un lot de données. Celui-ci peut l'être avec l'instruction out), mais constitue le « lot de données courant ». Celui-ci est utilisé par la seconde instruction, qui recherche les restaurants se trouvant dans les surfaces faisant partie de ce lot de données.

Attention ! Si ce lot de données contient plusieurs surfaces, la seconde instruction s'applique alors à chacune d'elles. L'instruction area[name=“Rezé”]; retourne toutes les surfaces avec name=Rezé, il se trouve qu'il n'en existe qu'une dans toute la base OSM. Mais si vous remplacez Rezé par Saint-Denis, vous obtenez des restaurants à Saint-Denis en Seine Saint-Denis, mais aussi à l'Île de la Réunion, dans le Val d'Aoste et un village de l'Aude.

Chercher dans la bonne surface

Vous pouvez examiner le résultat de la première instruction exécutant la requête :

area[name="Saint-Denis"];
out;

Aucune surface ne s'affiche sur la carte (nous y reviendrons), mais le résultat est visible dans l'onglet Données. On y trouve non seulement les limites des communes nommées Saint-Denis, mais également des arrondissements, une gare, un parc, et trois églises !

Pour restreindre la requête à Saint-Denis en Seine Saint-Denis, il convient d'appliquer les bons filtres sur les tags à la première instruction. En examinant les tags des différentes surfaces, on identifie la clef “ref:INSEE” comme le filtre le plus sélectif. Le filtre sur le nom devient même inutile : on obtient la requête suivante.

area["ref:INSEE"="93066"]; // Saint-Denis du 93
nwr[amenity=restaurant](area);
out;

Cette façon de limiter le résultat de la recherche dans une surface pose quelques questions. Nous y revenons demain :o)

© CC-by-sa Carto’Cité