Le géocodage consiste à attribuer une coordonnée géographique (longitude, latitude) à une adresse postale (numéro, rue, ville, pays) ou à n’importe quel objet spatial. Par exemple, le géocodage de l’adresse “58, Rue des Wallons, 1348 Louvain-la-Neuve, Belgique” nous donne une position latitude/longitude 50.668238/4.617183, ce qui permet de positionner avec précision l’adresse en question sur une carte. Nous allons voir dans cet article les outils qui vont nous permettre d’automatiser ce processus dans nos applications Rails.
Nous allons voir dans cet article comment installer et utiliser “graticule” et “acts_as_geocodable” dans nos applications Rails pour automatiser le géocodage. La gem “graticule” encapsule l’utilisation de diverses API de géocodage (Yahoo, Google, Geocoder.us, …). Le plugin “acts_as_geocodable”, quant à lui, utilise graticule pour incorporer une logique de géocodage au sein même de vos modèles ActiveRecord.
Graticule
Il convient tout d’abord d’installer la gem Graticule. Pour ce faire, c’est comme d’habitude assez simple:
gem install graticule --include-dependencies
Graticule se base sur des APIs publiques, notamment:
* Yahoo * Google * Geocoder.ca * Geocoder.us * PostcodeAnywhere * MetaCartaNous allons utiliser l’API de Google, qui nécessite une clef pour pouvoir l’utiliser. Fort heureusement, la demande de cette clef est absolument gratuite; il suffit de se rendre à l’adresse suivante: http://www.google.com/apis/maps/signup.html, de marquer son accord avec leur “Terms & Conditions” et de spécifier l’URL du site web sur lequel vous allez l’utiliser. Mais quelle URL entrer?
L’astuce est que la clef que Google Maps va générer ne pourra être utilisée pour manipuler des cartes Google Maps qu’à l’intérieur du nom de domaine que vous aurez spécifié. Pour le géocodage proprement dit, l’URL importe peu puisque vous utilisez uniquement l’API via Graticule; ceci dit, pour pouvoir éventuellement utiliser ultérieurement des cartes Google Maps sur un site développé en local sur votre machine – ce que nous ferons dans un prochain article – entrez comme URL “http://localhost:3000”. Notez quelque part la clef que Google Maps vous aura généree pour cette URL.
Nous pouvons d’ores et déjà tester graticule en console; lancez donc irb et entrez :
irb> require 'rubygems'
=> true
irb> require 'graticule'
=> true
irb> geocoder = Graticule.service(:google).new "votre_clef_gmaps"
=> #<Graticule::Geocoder::Google:0x102b22c @url=#<URI::HTTP:0x8157ea
URL:http://maps.google.com/maps/geo>, @key="votre_clef_gmaps">
irb> location = geocoder.locate "58, Rue des Wallons, 1348
Louvain-la-Neuve, Belgique"
=> #<Graticule::Location:0x158423c @postal_code="1348",
@longitude=4.617183, @region="R\303\251gion Wallonne",
@latitude=50.668238, @precision=:address, @locality="Ottignies",
@country="BE", @street="Place des Wallons 58">
irb> location.latitude
=> 50.668238
irb> location.longitude
=> 4.617183
irb> location.distance_to(geocoder.locate("Paris, France"),:units=>:kilometers)
=> 259.258399023483
Pas mal, non ?
acts_as_geocodable
Maintenant que nous avons vérifié que la gem graticule fonctionnait bien, nous allons essayer de l’exploiter dans Rails. C’est le rôle du plugin acts_as_geocodable.
Pour notre exemple, nous allons rapidement créer une application de type “pages jaunes”, c’est-à-dire un annuaire de commerces. Celle-ci exposera un modèle “Shop”, représentant un magasin disponible dans l’annuaire; chaque shop possèdera un nom et une adresse complète.
Nous commençons par créer et configurer l’application et sa base de données:
rails pagesjaunes
cd pagesjaunes
sudo mysqladmin create pagesjaunes_development
Nous créons ensuite le modèle Shop:
script/generate model Shop name:string street:string locality:string
region:string postal_code:string country:string
Avant de lancer la migration qui créera effectivement la table dans la base de données, nous procédons ensuite à l’installation du plugin acts_as_geocodable:
script/plugin install
http://source.collectiveidea.com/public/rails/plugins/acts_as_geocodable
Ensuite, nous créons les tables requises par le plugin:
script/generate geocodable_migration add_geocodable_tables
Nous pouvons enfin lancer la migration:
rake db:migrate
Maintenant que la base de données est prête, nous devons indiquer dans environment.rb la clef que Google nous a donnée (voir ci-dessus), ceci afin que acts_as_geocodable fonctionne correctement:
Geocode.geocoder = Graticule.service(:google).new "votre_clef_gmaps"
Il nous faut maintenant indiquer que nous souhaitons activer la géolocalisation pour notre modèle Shop. Pour cela, rien de plus simple: comme il est de coutume avec les plugins “acts_as”, rajoutez simplement une ligne “acts_as_geocodable” dans le modèle:
class Shop < ActiveRecord::Base
acts_as_geocodable
end
Par défaut, acts_as_geocodable suppose que votre modèle dispose des attributs street, locality, region, postal_code, et country; c’est pourquoi nous avions spécifié précisément ces attributs dans la migration de notre modèle (il est bien sûr possible d’outrepasser cette convention, voir la doc).
Voilà, notre modèle Shop est maintenant géolocalisable. Si nous créons par exemple l’objet suivant, en console (commande script/console) :
>> shop = Shop.create(:name => "Cercle Industriel", :street => "rue des Wallons, 58",
:locality => "Louvain-la-Neuve", :postal_code => "1348", :country => "Belgique")
Nous pouvons alors automatiquement obtenir sa latitude et sa longitude (qui sont par défaut des objets BigDecimal , d’où l’utilisation de la méthode to_f pour les convertir en un simple Float):
>> shop.geocode.latitude.to_f
=> 50.668213
>> shop.geocode.longitude.to_f
=> 4.617841
Nous pouvons aussi calculer la distance du magasin par rapport à un autre endroit:
shop.distance_to("Grand-Place, Bruxelles",:units=>:kilometers) #=> 27.6476537771852
Enfin, il est même possible d’effectuer des recherches basées sur la proximité géographique; en effet, acts_as_geocodable étend la méthode find d’ActiveRecord:
Shop.find(:all, :within => 50, :origin => "Paris")
Shop.find(:nearest, :origin => "Marseille")
A suivre…
Dans un prochain article, nous verrons comment exploiter ces fonctionnalités de géolocalisation pour afficher facilement l’emplacement d’objets sur une carte Google Maps.
0 Commentaires