Jour 12 – L'instruction < et la récursion

Nous avons vu le jour 2 l'instruction > qui permet d'obtenir les nodes référencés par les ways. Si le lot de données courant contient des relations, cette instruction inclut les nodes et ways référencés par les relations, ainsi que les nodes de ces ways. L'instruction > permet donc de produire un résultat complet : toutes les références sont « résolues ». Overpass parle de récursion descendante.

Ainsi la requête suivante produit le circuit de randonnée, les ways référencés par la relation et les nodes référencés par ces ways.

relation
  [type=route]
  [route=hiking]
  [name="Circuit de Haute-Perche"];
out;
>;
out;

Observez le résultat dans l'onglet Données et comparez avec les données obtenues en remplaçant les trois dernières lignes par l'instruction out geom; : dans un cas on récupère les ways et les nodes avec leurs tags, dans l'autre les coordonnées sont intégrées à la relation.

Il existe également l'instruction < qui a l'effet inverse : sont produits les ways et relations qui référencent un node ou un way du lot de données courant : c'est la récursion ascendante. On peut alors compléter le résultat avec l'instruction > pour inclure les ways et nodes référencés. Exemple avec pour élément de départ l'Avenue Arthus-Princé à Chaumes-en-Retz :

area["ref:INSEE"=44005];
way[name="Avenue Arthus-Princé"](area);
<; out;
>; out;

Le résultat est conséquent ! Pour y voir clair supprimez la dernière ligne pour ne voir que les relations référencées par la rue et complétez l'instruction out par l'option tags pour ne voir que les tags, dans l'onglet Données :

area["ref:INSEE"=44005];
way[name="Avenue Arthus-Princé"](area);
<; out tags;

On observe une ligne de transport, la relation associatedStreet de la rue, et 4 itinéraires de randonnée. Si on s'intéresse aux seules randonnées, ont peut appliquer un filtre sur les relations obtenues avec l'instruction <.

area["ref:INSEE"=44005];
way[name="Avenue Arthus-Princé"](area);
<; 
rel._[route=hiking];
out geom;

Quelle est cette syntaxe rel._ !?! La variable ._ désigne le lot de données courant, rel._ désigne donc les relations de ce lot de données, sur lesquelles on applique le filtre de tag. On obtient le même résultat en utilisant une variable nommée :

area["ref:INSEE"=44005];
way[name="Avenue Arthus-Princé"](area);
< -> .refs; 
rel.refs[route=hiking];
out geom;

On peut également utiliser une variable pour le lot de données en « entrée » de l'instruction <, sur lequel la récursion opère :

area["ref:INSEE"=44005];
way[name="Avenue Arthus-Princé"](area)->.rue;
.rue < -> .refs; 
rel.refs[route=hiking];
out geom;

Bien sûr les variables peuvent aussi être utilisées avec l'instruction >. L'exemple suivant est équivalent à la première requête de ce tuto :

relation
  [type=route]
  [route=hiking]
  [name="Circuit de Haute-Perche"]->.rel;
.rel out;
.rel > -> .refs;
.refs out;

Notez l'utilisation des variables avant l'instruction out : la requête retourne le contenu de la variable et non le lot de données courant. Ce n'est pas forcément utile mais cela explicite bien le fonctionnement des variables dans Overpass.

Exercices

Au fait, vous pouvez désactiver les messages « Données incomplètes » dans les paramètres généraux, sous le choix du serveur Overpass…

© CC-by-sa Carto’Cité