Goose Search

Un moteur de recherche géographique utilisant OpenStreetMap

a marqué ce sujet comme résolu.
Auteur du sujet

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.

Page d’accueil de Goose

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

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+6 -0

Je kiff l’idée. :-)

Rajoute aussi les pharmacies, distributeurs de billets, cinémas.

Édité par qwerty

écolo-utopiste altermondialiste radicalisé sur Internet | La tero estas nur unu lando | Géographe de service | Cliquez 👍 pour dire merci

+0 -0

Excellent,

J’ai longtemps essayé de traiter ce sujet dans plusieurs projets perso.

J’ai parfois dû rapatrier les fichiers *.osm en local pour pouvoir les re-indexer dans des bases géographiques (osm2postgis, elasticsearch, redis), c’est bon de voir que dans ton cas, un simple appel API à Overpass à suffit. Ils ont fait d’énormes progrès (la dernière fois que j’avais regardé, Overpass n’existait pas encore) de ce côté, c’est top !

Bravo à toi, c’est du bon travail.


EDIT : par contre j’ai pas très bien compris (j’ai pas lu le code dans le détail) pourquoi tu avais besoin de géocoding / géocoding inverse ? (pourquoi les deux)

L’API OverPass a l’air de fonctionner avec des coordonnées, donc géocoding ok, mais géocoding inverse, pourquoi ?

Édité par Javier

Happiness is a warm puppy

+1 -0

Le nom créé une petite confusion avec Google lorsqu’on lit rapidement. Au début j’ai vraiment cru lire "Google search" quand j’ai cliqué sur le lien.

:colere2:


L’ergonomie est propre et bien faite seulement c’est dommage de ne pas avoir les résultats sur une carte et d’être redirigé vers un autre site.

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+2 -0
Auteur du sujet

Merci pour vos retours ! :)

Rajoute aussi les pharmacies, distributeurs de billets, cinémas.

qwerty

Bonne idée. Cependant, pense-tu que les cinémas sont recherchés régulièrement (vraie question) ?


Une amélioration qui pourrait être pratique : une carte. Comme ca tu pourra t’amuser avec Leaflet en plus :)

Gwend@l

L’ergonomie est propre et bien faite seulement c’est dommage de ne pas avoir les résultats sur une carte et d’être redirigé vers un autre site.

A-312

Bonne idée en effet. J’y avais un peu pensé sans savoir si ça valait le coup. Je vais le mettre en haut de ma TODO-list pour la v2.


Le nom créé une petite confusion avec Google lorsqu’on lit rapidement. Au début j’ai vraiment cru lire "Google search" quand j’ai cliqué sur le lien.

A-312

Ah oui, je n’y avais pas pensé. ^^
Bon par contre, ça va être difficile de le changer maintenant que le nom de domaine est pris…


EDIT : par contre j’ai pas très bien compris (j’ai pas lu le code dans le détail) pourquoi tu avais besoin de géocoding / géocoding inverse ? (pourquoi les deux)

L’API OverPass a l’air de fonctionner avec des coordonnées, donc géocoding ok, mais géocoding inverse, pourquoi ?

Javier

Bonne question ! Je me rends compte que je n’ai pas expliqué comment se passait le traitement d’une requête.

Voilà donc comment ça se passe pour le requêtage des résultats (dans cette fonction).

  1. Récupération de l’adresse de l’utilisateur, soit à partir de ses coordonnées GPS, soit à partir de l’adresse indiquée (le geocoding inverse est utilisé ici) (ici).
    1. Soit par l’API du gouvernement.
    2. Soit par Nominatim (le module geopy) en cas d’échec.
  2. Récupération des résultats avec une requête Overpass (ici).
  3. Récupération des adresses de tous les résultats qui n’en ont pas dans leurs tags (ici).
    1. D’abord avec l’API du gouvernement, avec un CSV envoyé en POST et retourné complété. Les adresses présentes sont utilisées.
    2. Pour les adresses manquantes, une autre tentative de récupération par Nominatim.
  4. Analyse des tags OSM de tous les résultats pour y trouver des tags exploitable par Goose pour le filtrage des résultats (ici). Cette étape est sautée en version light.
  5. Construction de la page des résultats avec un template dédié au rendu des blocs des résultats (ici).

Pour toutes les requêtes externes, un nombre maximum d’essais peut être spécifié dans le fichier de config de Django (ici), au cas où une API aurait un problème à ce moment là. En cas d’échec, deux possibilités :

  • soit c’est la localisation de l’utilisateur qui n’a pas pu être récupérée, auquel cas ça affiche une erreur au dessus du formulaire ;
  • soit c’est l’adresse d’un résultat qui est introuvable, auquel cas il sera affiché "Adresse : Adresse inconnue".

Merci encore pour vos retours qui sont très motivants ! :)

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0

pense-tu que les cinémas sont recherchés régulièrement

Oui ^^

Si ça peut t’aider : https://wiki.openstreetmap.org/wiki/FR:%C3%89l%C3%A9ments_cartographiques

écolo-utopiste altermondialiste radicalisé sur Internet | La tero estas nur unu lando | Géographe de service | Cliquez 👍 pour dire merci

+0 -0
Auteur du sujet

Ok, merci. Je viens de les rajouter. :)

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0

Salut!

Projet amusant :)

Juste une petite remarque : il serait peut-être bien d’ajuster les filtres en fonction de ce qu’on recherche. Car actuellement, quand je cherche une pharmacie, on me propose d’afficher les résultats avec un statut végétalien connu ou inconnu. Ou alors, c’est un nouveau concept :euh:

Si tu as un peu de temps, n’hésite pas à faire un p’tit tour pour voir mon projet ZONNY

+1 -0
Auteur du sujet

Juste une petite remarque : il serait peut-être bien d’ajuster les filtres en fonction de ce qu’on recherche. Car actuellement, quand je cherche une pharmacie, on me propose d’afficher les résultats avec un statut végétalien connu ou inconnu. Ou alors, c’est un nouveau concept :euh:

<?php?>

Ah oui, bonne idée en effet.

Ou alors on rajoute un tag dans OSM pour les médicaments véganes... :D

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+2 -0
Auteur du sujet

Vous ne l’attendiez plus, voici la version 2.0.0 de Goose ! \o/

Au programme :

  • Une carte des résultats avec LeafletJS, chargeable sur demande pour ne pas pomper trop de débit.
  • Filtrage des marqueurs de la carte en même temps que les blocs des résultats.
  • Réécriture complète et optimisation du filtrage des résultats (les filtres sont maintenant stockés en BDD et plus "en dur" dans le code).
  • Goose dispose désormais d’une traduction en anglais1.
  • Utilise le module timezonefinder (plus rapide que tzwhere utilisé avant) pour obtenir le fuseau horaire de l’utilisateur.
  • Mise au propre du front-end.

Toujours à la même adresse : goose-sear.ch

Merci ! :)


  1. Au passage, il faudra que je sortes un v2.0.1, j’ai honteusement oublié deux petites chaines. -_-" 

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+2 -0

Salut !

Ça a l’air sympa, je m’en vais tester ça. :)

Juste une petite question, pourquoi utiliser Django ? Puisque tu ne fais que des appels API, tu dois pouvoir te borner à du HTML et du JS côté client non ?

Edit: j’ai une erreur 500 lors de l’envoi de la requête

Édité par anonyme

+0 -0
Auteur du sujet

Salut !

Ça a l’air sympa, je m’en vais tester ça. :)

Juste une petite question, pourquoi utiliser Django ? Puisque tu ne fais que des appels API, tu dois pouvoir te borner à du HTML et du JS côté client non ?

C’est possible en effet, mais à la base, la raison d’être de Goose était d’être pour un moi un support d’apprentissage pour Django. Le but était d’apprendre à utiliser le framework et à faire une mise en prod.

Edit: j’ai une erreur 500 lors de l’envoi de la requête

thulemalta

Oups, c’est corrigé (problème de droits sur la BDD, j’avais oublié de vérifier ça). :honte: Merci !

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0
Auteur du sujet

Le nom de domaine de Goose arrive bientôt à expiration. Vous a-t-il été suffisamment utile pour que je le renouvelle, ou j’arrête le service ?

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0
Auteur du sujet

Rien ne t’empêche d’utiliser un domaine gratuit si ?

<?php?>

Tu pense à un sous-domaine comme *.free.fr ?

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+2 -0
Auteur du sujet

Ou ceux proposé par azote.org (type *.fr.nf)

qwerty

Hum, pourquoi pas… Cependant, je me demande comment ce site fait (économiquement) pour offrir des sous-domaines. Ils vendent des services à côté ?

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0

Y’a des sites qui proposent depuis très longtemps des noms de domaines gratuitement ! Depuis plusieurs années même… Par exemple dot.tk le fait depuis très longtemps. Comme tu dis, ils proposent des services externes ou des petites combines comme le fait de devoir payer pour récupérer son domaine si on oublie de le renouveler…

Après je ne te recommande pas de prendre un domaine .tk car ils n’inspirent aucune confiance. Il y a plusieurs années (et c’est toujours le cas en fait :euh:) beaucoup de sites frauduleux avaient cette extension de domaine.

Si tu as un peu de temps, n’hésite pas à faire un p’tit tour pour voir mon projet ZONNY

+0 -0

Tu peux acheter un nom de domaine générique et faire des sous-domaines pour tes projets.

écolo-utopiste altermondialiste radicalisé sur Internet | La tero estas nur unu lando | Géographe de service | Cliquez 👍 pour dire merci

+0 -0
Auteur du sujet

Bonne idée ! Je vais y réfléchir ! :)

Après, vu que Goose est mon seul projet web pour l’instant, donc je vais peut-être attendre un peu (je crois que goose-sear.ch est valide jusqu’à la fin de juillet)…

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte