Jour 10 – Recherche à proximité et différence

Nous savons chercher des éléments à l'intérieur d'un rectangle (bbox) et d'une surface (area), voyons maintenant comment chercher des éléments à proximité d'un autre.

Le filtre (around:<dist>) permet de sélectionner les éléments dans un rayon de <dist> mètres autour du lot de données en entrée.

Dans sa forme la plus simple, on peut directement indiquer les coordonnées d'un point (latitude puis longitude) dans le filtre. Cette requête retourne tous les nodes autour des coordonnées indiquées :

node(around:20, 48.8576, 2.3516);
out;

Il est également possible de trouver les éléments le long d'une ligne, en fournissant une liste de coordonnées. Exemple en combinant avec un filtre sur les tags :

node["addr:housenumber"]
(around:20, 48.8569,2.3538, 48.8575,2.3515, 48.8583,2.3520);
out;

Mais l'usage le plus courant consiste à rechercher des éléments à proximité d'un lot de données, qui peut être le lot de données courant – (around:20) — ou stocké dans une variable – (around.var:20). L'exemple suivant trouve les arbres à moins de 10 m des Champs-Élysées à Paris.

area["ref:INSEE"=75056]; // Paris
way
[highway]
[name="Avenue des Champs-Élysées"]
(area);
node[natural=tree]
(around:10);
out;

Attention ! Si le lot d'entrée contient des surfaces, ce filtre retourne les éléments à proximité de leur périmètre : des éléments à l'intérieur de la surface peuvent donc être inclus. Vous pouvez le vérifier avec cette requête (notez l'utilisation des variables) :

area["ref:INSEE"=75056]->.paris;
way
[leisure=park]
[name="Parc des Buttes-Chaumont"]
(area.paris)->.parc;
node
[natural=tree]
(around.parc:20);
out;

Pour ne conserver que les arbres se trouvant à l'extérieur du parc, il est nécessaire d'introduire la soustraction entre 2 lots de données, dont la syntaxe est :

( lot1; - lot2; );

La solution consiste donc à soustraire des arbres à proximité du périmètre du parc, ceux se trouvant à l'intérieur. L'instruction map_to_area vue dans le tuto précédent est alors nécessaire, ainsi que l'utilisation de variables :

area["ref:INSEE"=75056]->.paris;
way
[leisure=park]
[name="Parc des Buttes-Chaumont"]
(area.paris)->.parc;
node
[natural=tree]
(around.parc:20)->.arbres_autour;
.parc map_to_area -> .parc_a;
node
[natural=tree]
(area.parc_a)->.arbres_dedans;
(.arbres_autour; - .arbres_dedans;);
out;

Exercices

Trouvez les arbres à proximité ET à l'intérieur du Parc des Buttes-Chaumont à Paris

Trouvez les arbres à proximité des sentiers du Parc des Buttes-Chaumont

Trouvez les restaurants à proximité (50 m) du canal Saint-Denis à Paris

© CC-by-sa Carto’Cité