Cartographie Drupal : utilisation de AddressField + Geocoder

Dans la série Cartographie, nous avons vu auparavant quels modules utiliser pour stocker les données géographiques, et les présenter de manière simple.

Cependant, à ce stade la saisie d'une adresse n'était possible que via ses coordonnées géographiques, ou sur une carte.

Si on veut coupler la saisie d'une adresse et l'encodage, on peut utiliser 2 modules complémentaires :

  • Address Field : très utilisé dans Drupal Commerce, il permet de fournir un champ de saisie des adresses, de manière normalisée, avec un formulaire propre au pays
  • Geocoder : couplé avec Address Field, il pemettra d'encoder l'adresse pour la transformer en coordonnées géographiques.

A priori, il semble qu'il faille également installer le module Entity, sinon on a des messages d'erreur de type :

PHP Fatal error:  Call to undefined function entity_get_all_property_info() in /var/www/drupal/sites/all/modules/contrib/geocoder/geocoder.widget.inc on line 89

L'installation des modules s'effectue normalement. Par exemple avec drush :

drush dl geocoder addressfield entity
drush en geocoder addressfield entity

Address Field

Imaginons que nous voulions gérer des magasins dans plusieurs pays : France, Belgique, Suisse. Nous allons créer un type de contenu Magasin, avec un Nom, une description et y ajouter un champ Adresse :

Image

Au niveau du Widget, on pourra alors sélectionner les pays : Belgium, France, Switzerland (pour la démo, j'utilise un site en anglais). Et définir la France comme pays par défaut.

Image

En saisie, on a alors le formulaire qui s'affiche, avec la France comme pays par défaut :

Image

Mais à ce stade, l'adresse est uniquement affichée de manière textuelle, car nous n'avons pas encore introduit l'encodage :

Image

Geofield + Encodage

Pour permettre la cartographie, il faut donc un champ qui stocke les coordonnées géographiques (apporté par Geofield). Le fait d'avoir ajouté le module Geocoder permet d'ajouter une option dans les Widgets :

Image

Lorsqu'on ajoute un champ de type Geofield, on peut alors sélectionner le widget de type "Geocode from another field". Au niveau des paramètres du champ, on laisse le défaut.

On va ensuite choisir quel champ sera utilisé comme base de géocoding, et le "moteur" à utiliser. Plusieurs choix sont possibles :

Image

Ayant fait plusieurs tests, il faut bien avouer que c'est le service de Google qui est le plus pertinent, et quasiment le seul à trouver l'équivalence avec l'adresse. OpenStreetMap peut également renvoyer des résultats. Pour certains services (Yahoo, Bing, Yandex), il faut utiliser une clé d'API. Le service Yahoo semble payant.

Dès lors, lorsqu'on saisit une adresse, celle-ci est envoyée au service de géocodage. Les coordonnées sont bien récupérées. Dans l'exemple ci-après, elles sont juste affichées au format WKT.

Image

En effet, le paramétrage de l'affichage du champ est le suivant :

Image

Conclusion

Nous avons vu dans cet article comment utiliser les modules AddressField, Geocoder, Geofield et Entity pour ajouter un champ de type adresse et un champ de type Geofield sur un type de contenu, et récupérer les coordonnées géographiques de l'adresse via les services de Geocodage.

Les données stockées dans le champ Geofield peuvent ensuite servir à l'affichage.

Si on modifie le type de format du champ en Dynamic Google Map par exemple :

Image

L'affichage se présente sous la forme d'une carte :

Image

Dans de prochains articles, nous verrons comment intégrer Views et d'autres affichages (Leaflet par exemple)

 

Catégorie