====== 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é