Lorsque l’on cherche à géolocaliser une image, ou une vidéo sans grandes informations disponibles, il est parfois utile de se reposer sur les seuls éléments visibles à l’écran :
- L’intersection d’un pont autoroutier avec une voie de chemin de fer.
- Un angle de rue d’une ville allemande, avec une station du bus, une borne de taxi, une église et une pharmacie…
- etc….
Dans ces cas précis, il pourrait être utile de pouvoir requêter une base cartographique sur le mode :
“Montre-moi sur la carte tous les lieux comprenant une église et une pharmacie dans un rayon de 50 mètres.”.
C’est là qu’un outil comme overpass-turbo.eu et une carte collaborative très détaillée prennent tout leur sens!
Overpass est une interface de requête pour Openstreetmap.
Il existe plusieurs tutoriels d’utilisation d’OverPass-Turbo sur le net, et le but de celui-ci n’est pas de tout montrer mais de vous présenter un exemple concret de ce qu’il est possible de lui faire faire!
A gauche de l’écran, on trouve la zone de requête. A droite se trouve la zone géographique où l’on souhaite requêter. La première des choses à faire est donc de définir notre zone de recherches, en zoomant au bon niveau de détails.
Cherchons par exemple toutes les églises situées dans un rayon de 50m d’une pharmacie à Rennes, en Bretagne. Tout d’abord, zoomons sur la ville.
Voici le script qui va nous donner ces informations :
/*
This query will retrieve churches at max distance of 50m of a pharmacy in the area
*/
[out:json][timeout:25];node({{bbox}})[amenity=pharmacy]->.pharmacy;
(
way(around.pharmacy:50)[amenity=place_of_worship];
node(around.pharmacy:50)[amenity=place_of_worship];
);
(._;>;);
out meta;
Détaillons un peu ce script :
Nous avons tout d’abord commenté un peu celui-ci pour le rendre plus lisible :
/*
This query will retrieve churches at max distance of 50m of a pharmacy in the area
*/
Ensuite nous avons explicité une sortie de type json (un format de données plat), et une limite de requête sur le serveur à 25s.
[out:json] [timeout:25];
La requête proprement dite vient ensuite :
node({{bbox}})[amenity=pharmacy]->.pharmacy;
{{bbox}} signifiant “dans la zone visible à droite”.
Par convention, une pharmacie est déclarée dans OpenStreetMap en tant que node (noeud), affublé d’une valeur spécifique amenity, correspondant à la chaîne de caractères ‘pharmacy’.
Nous allons donc chercher dans la zone à droite, tous les noeuds, dont la valeur amenity possède la chaîne « pharmacy.So we first look for every node in this area that as this specific value and insert them in a variable called ‘pharmacy’ :
->.pharmacy;
Puis nous cherchons une église.
(
way(around.pharmacy:50)[amenity=place_of_worship];
node(around.pharmacy:50)[amenity=place_of_worship];
);
Une église a une valeur amenity avec la chaîne de caractères “place_of_worship”, mais peut également être un node ou une way (c’est plutôt rare…), dans OSM.
on précise ensuite la distance en mètres :
around.pharmacy:50
(._;>;);
out meta;
Les deux dernières lignes correspondent à l’intersection de ces critères.
Une fois le script entré, on appuie sur « execute »
Ce qui nous donne ce résultat :
Il ne s’agit là que d’un simple exemple de requête.
Et bien évidemment, cette requête sera d’autant plus efficace que votre zone de recherches sera détaillée. C’est pour cela qu’il est important d’aider le projet OpenStreetMap, mais aussi de participer et d’encourager la participation à ce projet.
Quelques ressources complémentaires sur ce langage de requêtes :
Ce tutoriel sur Github est aussi très pratique.
Amusez-vous bien !
P.S. : Plein de remerciements à Eric Pommereau pour son travail toujours inspirant.
P.P.S : ce billet est basé sur un billet initialement posté sur mon blog personnel.