====== Jour 1 – La requête élémentaire ======
La requête élémentaire est constituée de **deux instructions** :
La première instruction consiste à **sélectionner un lot de données** dans la base de données OSM (ou plutôt dans une copie). Voici sa syntaxe :
* ''node'', ''way'' ou ''rel'' : le type d'élément recherché
* entre ''[ ]'' : un ou plusieurs filtres sur les tags
* entre ''( )'' : un ou plusieurs filtres de divers types
Les filtres entre parenthèses sont souvent des filtres géographiques, comme ''%%{{bbox}}%%'' qui décrit la zone visible sur la carte sur Overpass Turbo. Nous en verrons d'autres.
La seconde instruction consiste à **retourner ce lot de données** comme //résultat de la requête// Overpass. Il s'agit de l'instruction ''out'' dont nous verrons quelques variantes.
Par exemple, la requête suivante retourne les arrêts de bus avec un abri. L'instruction de sélection combine deux filtres sur les //tags// et un filtre géographique : les 3 conditions doivent être remplies (//ET// logique). Seuls les //nodes// qui portent les //tags// ''highway=bus_stop'' **//ET//** ''shelter=yes'', **//ET//** se trouvent dans la zone visible de la carte, sont sélectionnés.
node
[highway=bus_stop]
[shelter=yes]
({{bbox}});
out;
Une instruction peut être écrite sur une ou plusieurs lignes, cela n'a pas d'importance. Par contre, toute instruction Overpass, se termine par un point-virgule : '';''. Il est même possible de placer plusieurs instructions sur la même ligne, ainsi la requête ci-dessus peut être écrite :
node[highway=bus_stop][shelter=yes]({{bbox}}); out;
Un filtre de tag peut ne contenir que la //clef// : sont conservés les éléments pour lequel ce //tag// **est défini**, //quelle que soit sa valeur// :
node
[highway=bus_stop]
[shelter]
({{bbox}});
out;
Si on ajoute un point d'exclamation avant la clef, seuls les éléments pour lesquels ce tag **n'est pas défini** sont retournés :
node
[highway=bus_stop]
[!shelter]
({{bbox}});
out;
Lorsque la //clef// ou la //valeur// du filtre contient une espace, un accent ou un caractère spécial, il est nécessaire de placer cette //clef// et/ou cette //valeur// **entre //quotes//**. Exemple avec un nom de lieu en breton :
node
[place=town]
["name:br"="Karaez-Plougêr"];
out;
Les //quotes// simples et doubles sont possibles, je conseille toutefois les **//quotes// doubles** qui ne seront pas perturbées par la présence de //quotes// simples dans les noms.
Notez que cette dernière requête contient deux filtres de tags mais **aucun filtre géographique**. Les filtres de tags sont en effet suffisamment restrictifs pour que le résultat soit de taille raisonnable. Mais ne faites pas ça pour obtenir tous les restaurants de la planète : les serveurs Overpass sont très utilisés et limitent la durée d'exécution d'une requête et le volume du résultat.
===== Exercices =====
* Modifier la requête pour trouver les arrêts de bus accessibles aux personnes à mobilité réduite (PMRs).
* Modifier la requête pour trouver les arrêts de bus sans information sur leur accessibilité aux PMRs.
* Écrire une requête qui retourne les parkings à vélo de type arceaux (documentation : https://wiki.openstreetmap.org/wiki/FR:Tag:amenity=bicycle_parking)
© CC-by-sa Carto’Cité