Geocoding et recherche de proximité avec Drupal + Geo + Geocode + Views
Il est de plus en plus fréquent de localiser des nodes avec Drupal. Cck suffit si l'on veut simplement sauver la longitude et latitude d'un point géographique. Mais comment faire de la recherche par proximité dans ce contenu ou afficher les résultats d'une view sur une carte?
Historiquement, location est le module de prédilection, mais de nouveaux venus apporte une autre approche.
Ce billet explique comment depuis un champ texte contant une adresse l'on peut récupérer une position et l'enregistrer. La deuxième partie s'attarde sur la recherche par proximité.
Projets nécessaires
Geo permet de stocker des données géographiques dans un champs Cck. Non seulement des points, mais aussi des lignes et des surfaces. Il est intégré à views.
Geocode est une API extensible qui converti une information (adresse, code postal, image qui contient des données GPS,etc) en une donnée géographique.
Modules à activer
Commencer par activer tous ces modules depuis votre administration.
- CCK Content (content)
- CCK Text (content)
- CCK Geocoded value
- Geo Geo (geo)
- Geo Geo Field (geo_field)
- Geo Geocode (geocode)
Concept de base
Geocoded value permet à l'utilisateur d'entré une location (par exemple "Paris") celle-ci est géolocalisé par Geocode et stocké dans Geo Field. Geo Field utilise MySQL Spatial pour stocker les données géographiques ce qui va permettre de faire des requêtes très rapides.
En simple Geo enregistre et Geocode transforme une adreses ou autre en une donnée stockable par Geo.
Problèmes
Si vous avez des problèmes, vérifiez la liste des issues connues de geo et geocode. En particulier http://drupal.org/node/606794 si vous travailler sur un serveur distant (pas besoin de google key en localhost)
Ce domaine est relativement nouveau et les modules sont encore assez frais. N'hésitez pas à reporter des bugs sur ces projets qui ont encore besoin d'un petit coup de pouce pour passer en version stable.
Une addresse text automatiquement geocodé
Créez un type "bar" (ou autre)
Ajouter simplement un nouveau type. Pour moi ce serra "bar". J'ai désactivé les commentaires, mais rien de spécial ici.

Ajoutez un champ "address" à votre type de contenu
Ajouter au contenu bar un simple champ Text avec comme widget Text field ou Text area. Pas besoin de changer la configuration par défaut.
Ajoutez un field "geo" à votre type de contenu
C'est le moment d'utiliser le field geospatial data qui sauvegarder vos donné véritablement avec les fonctions geospatial de MySQL. Pour le widget je vais choisir Geocoded value from another field afin de géocoder le field address que nous venons de créer.
configuration du field geo
Cochez "address" comme notre champs source.

Testez votre type "bar"
Essayer de créer un node bar. Il est normal que le field geo n'apparaisse pas dans le forumlaire, le widget geocoded value from an other field cache le champ.

Vous devrier avoir quelque chose comme ça:

MAGIQUE! Nous avons donc les coordonnés...
Changer le widget d'affichage pour une carte
A venir
Recherche de proximité dans une view
J'ai écrit un autre billet sur la création d'une view de recherche par proximité .
Alternatives
Apachesolr est assez trendy et impressionnant et il permet de faire des recherches de proximité via solr local. Cependant, il nécessite l'installation de solr sur votre serveur et donc de Java. Notez que geo pourrait dans un bref avenir être intégrer à solr. Voir http://drupal.org/node/567464.
Location est le module le plus connu pour gérer des ... locations. Malheureusement pour l'instant la recherche de proximité s'appuie sur les codes postaux. Il y a des patchs par ici et par là qui améliore ça. Personnellement je trouve ce module trop monolithique.


Comments
#1 charli
D'abord merci pour ce tutoriel très efficace, après m'être égaré sur des fausses pistes, comme location, il répond exactement à ce que je cherche.
J'ai donc respecté les différentes étapes et tout marche parfaitement.
J'essaie maintenant d'afficher les coordonnées geo dans un widget map, et bien sûr c'est là que ça se gâte :(
J'utilise open layers geocoder mais la map affichée (par Google Map) ne prends pas les coordonnées transmises par geo.
Y'a t'il un paramétrage particulier qui m'aurait échappé ?
Faut il utiliser un autre module ?
J'ai besoin ensuite de faire une recherche de proximité dans une vue.
Merci de m'éclairer de tes lumières!
#2 gagarine
Merci pour ton commentaire, c'est très encourageant pour moi.
Je viens de rentrer en Suisse et j'ai deux trois choses à faire en extrême priorité ;). Je vais finir cependant ce billet au plus vite. J'espère pour le 23.
Je ne peux pas t'aider de tête car beaucoup de chose en changé et des modules comme http://drupal.org/project/gmap_geo semble ne plus fonctionner. Il faut donc que je test...
#3 charli
Bonjour gagarine,
J'ai justement résolu mon problème de widget map avec le module gmap_geo qui fonctionne très bien et que je trouve même plus esthétique, par contre sur la recherche de proximité je bloque toujours.
#4 gagarine
Hello charli!
J'ai pour finir créé un nouveau billet http://listentothis.net/drupal/recherche-de-proximite-avec-les-modules-v... afin de garder celui-ci pas trop long. Je ne l'ai pas encore relu mais ça devrait t'aider.
Salutations
#5 firgon
ce que ça fait plaisir de trouver enfin un truc de géolocalisation qui marche sans souci !
Génial, merci gagarine.
Vivement la localisation sur une carte !
#6 Laurent
Bonjour Charli,
Avez-vous réussi à configurer gmap + geo pour afficher les données de localisation sur une carte ?
Merci.
Post new comment