Jour 4 – Éviter les doublons

Supposons que nous cherchons les hôtels et les restaurants. Nous avons vu qu'une requête peut retourner plusieurs lots de données :

nwr[amenity=restaurant]({{bbox}});
out geom;
nwr[tourism=hotel]({{bbox}});
out geom;

Le problème de cette requête est qu'elle peut retourner des doublons : les hôtels-restaurants, qui portent à la fois le tag amenity=restaurant et tourism=hotel. Ainsi l'hôtel-restaurant “Les Flots Bleus” à Palavas-les-Flots, est en double dans le résultat de la requête : regardez dans l'onglet Données (en haut à droite de la carte).

Pour éviter cela, la solution consiste à assembler les hôtels et les restaurants en un seul lot de données, en effectuant une union avec la syntaxe suivante :

(
requete1;
requete2;
);

Placer plusieurs requêtes entre parenthèses a pour effet de créer l'union des lots de données résultant de chaque requête : les doublons sont éliminés. Voici ce que cela donne pour notre exemple :

(
nwr[amenity=restaurant]({{bbox}});
nwr[tourism=hotel]({{bbox}});
);
out geom;

Notez que l'on peut inclure dans l'union un nombre quelconque de requêtes : ajoutons les fast-foods. Une astuce au passage : pour éviter de répéter la syntaxe ({{bbox}}) pour chaque requête, il est possible de le préciser une seule fois au tout début de la requête, avec la syntaxe suivante : [bbox:{{bbox}}];.

On obtient donc :

[bbox:{{bbox}}];
(
nwr[amenity=restaurant];
nwr[tourism=hotel];
nwr[amenity=fast_food];
);
out geom;
{{style:
node, way, relation {
text: name;
}
}}

Tiens ! Des étiquettes apparaissent sur la carte ! C'est le résultat du bloc {{style: }} ci-dessus, qui indique d'afficher la valeur du tag name en étiquette (text:) pour tous les nodes, ways et relations. Il s'agit d'une syntaxe MapCSS comprise par Overpass Turbo – nous y reviendrons.

Exercices

Trouvez les magasins de vêtements et de chaussures.

Trouvez les galeries d'art, pratiquant la vente ou pas.

Rédigez une requête qui retourne les distributeurs de billets et les banques équipées d'un ATM.

© CC-by-sa Carto’Cité