Bonjour tout le monde !
Aujourd’hui, j’aimerais vous présenter mon premier projet web : Goose Search.
Goose, c’est un moteur de recherche géographique utilisant OpenStreetMap qui permet de trouver des points d’intérêt à proximité de sa position, comme des boulangeries, des points d’eau potable ou des parkings.
Comment on s’en sert ?
En arrivant sur la page d’accueil, un formulaire permet d’entrer sa position actuelle, le rayon et l’objet de sa recherche (parmi une liste). Pour entrer sa position, deux possibilités : utiliser ses coordonnées GPS (qui peuvent être remplies en cliquant sur le bouton "Me localiser") ou entrer son adresse estimée. On est ensuite redirigés sur la page des résultats, qui sont chargés par Ajax (en moins de deux secondes en moyenne). Pour chaque résultat, plusieurs informations sont affichées, telles que la direction, la distance et l’adresse estimée.
Pour chaque recherche, Goose vous donne un permalien permettant de refaire la même recherche plus tard sans avoir à re-remplir le formulaire. Par exemple, voici le permalien qui permet d’afficher les boulangeries et pâtisseries dans un rayon de 1000 mètres autour de la gare d’Oslo : https://goose-sear.ch/results/?sp=1&lat=59.9114438&lon=10.7513447&radius=1000&no_private=1.
Comment ça marche ?
Goose utilise Python 3 avec le framework Django 1.10 et Bootstrap 3 pour le front (je sais que c’est une usine à gaz, mais je suis encore un grand novice en front-end). Le site lui-même est hébergé sur un Raspberry Pi sous Raspbian avec Apache 2.
Les adresses de l’utilisateur et des résultats sont estimées, d’abord grâce à une API du gouvernement français (utilisant la base d’adresses BANO), puis grâce à Nominatim en cas d’échec (si le résultat n’est pas en France, par exemple).
Les résultats eux-même proviennent d’OpenStreetMap. Si une adresse est précisée dans leurs tags, celle-ci est utilisée à la place de l’adresse estimée.
Pourquoi ce projet ?
Il y a principalement deux raisons.
La première, c’est que je voulais essayer de mener un projet de A à Z, dans le but d’apprendre et de découvrir de nouvelles choses. J’ai notamment appris à mieux utiliser git, à mieux structurer mon code et j’ai acquis de petites bases de Javascript.
La seconde, c’est que je me demande souvent s’il n’y a pas une boulangerie / une source d’eau potable / etc dans les environs. OpenStreetMap en connait un paquet, mais je cherchais un moyen d’avoir juste des informations de base pour les trouver sans avoir, ni à télécharger la carte des environs (souvent assez lourde), ni à charger les tuiles de la carte (super long quand on n’a que peu de réseau). Je voulais juste avoir une direction, une distance et une adresse.
Détails techniques
Pour chaque type de recherche, trois champs sont enregistrés en base de donnée :
- le nom de la recherche ;
- les "clés OpenStreetMap" ;
- et les "règles de traitement".
Le champ "clés OpenStreetMap" permet de réunir toutes les nodes et ways OSM portant un des tags présents dans ce champs. Les "règles de traitement" permettent quant à elles de personnaliser l’affichage des résultats selon le type de recherche, pour pouvoir par exemple afficher le nombre de places d’un parking, ou les étoiles d’un hôtel.
Prenons l’exemple de la recherche "Restaurants et cafés". Voici son champ "clés OpenStreetMap".
1 2 | "amenity"="restaurant" "amenity"="cafe" |
Et voici ses règles de traitement (abrégées).
1 | "cuisine" "Cuisine":["bagel":"Bagels"|"burger":"Burgers"|"coffee_shop":"Cafés et collations"|"crepe":"Crêpes et galettes"] |
Le mot clé cuisine
permet de récupérer le contenu du tag correspondant si le résultat le possède. Si c’est le cas, un message sera affiché avec le label Cuisine
. Son contenu dépendra des règles entre crochets. Si il vaut bagel
, la ligne contiendra Cuisine : Bagels
.
Dans le même ordre d’idée, il est possible d’afficher directement le contenu d’un tag OSM, par exemple pour le nombre de places d’un parking.
Vie privée
Goose n’utilise aucun script ou fournisseur de scripts (CDN) appartenant à Google, Twitter, Facebook, etc. Enfin, s’il enregistre quelques données à des fins statistiques, celles-ci sont épurées afin d’empêcher l’identification des utilisateurs. Notamment, les coordonnées GPS des requêtes sont arrondies au degré près, ce qui donne une précision de 130km environ.
Liens
- Goose : https://goose-sear.ch/
- Github (sous la licence AGPLv3) : https://github.com/rezemika/goose-search