Géolocaliser des utilisateurs sur l’IP en Python

Depuis quelques temps, plusieurs clients nous demandent de pouvoir géolocaliser leurs visiteurs de manière plus ou moins précise.
La plupart du temps, leur but est simplement d’afficher une carte centrée sur la localisation (approximative) de l’utilisateur.

Pour mener cela à bien, nous avons décidé d’utiliser Geolite Country.
Celui-ci permet de géolocaliser l’utilisateur en fonction de son ip sur la base du Pays. Pour une recherche plus affinée, les services sont payants. Mais le client désire uniquement centrer sur le pays de l’utilisateur. L’offre gratuite est donc amplement suffisante.

L’application étant en Python et ayant décidé d’utiliser la base binaire, j’ai donc installé la librairie pygeoip.
Son utilisation est particulièrement simple.

[code language= »python »]gmaps = urllib.urlopen(‘http://maps.google.com/maps/geo?q=%s&output=csv’ % urllib.quote(country)).read().rsplit(‘,’)[/code]

Le fichier GeoIP.dat est la base de données binaire, accessible sur GeoLite via ce lien direct.
Ainsi notre variable « country » est un string contenant le nom du pays. Ici « France ».

Il faut par la suite obtenir la latitude et la longitude de ce pays. Pour cela, Google Maps API est particulièrement utile.

[code language= »python »]gi = pygeoip.GeoIP(‘lib/GeoIP.dat’)<br />
country = gi.country_name_by_name(‘o2sources.com’)[/code]

Notre variable « gmaps » contiendra ainsi un tableau pour lequel les deux derniers éléments sont respectivement la latitude et la longitude.
Il n’y a plus qu’à afficher notre carte Google Maps centrée sur des données 🙂

Et puisque du code sans son contexte est d’une utilité moyenne, voici la vue permettant d’obtenir ces données

[code language= »python »]from django.shortcuts import render_to_response
from django.template import RequestContext

import pygeoip
import urllib

def home(request):
gi = pygeoip.GeoIP(‘lib/GeoIP.dat’)
country = gi.country_name_by_name(request.META[‘REMOTE_ADDR’])
gmaps = urllib.urlopen(‘http://maps.google.com/maps/geo?q=%s&output=csv’ % urllib.quote(country)).read().rsplit(‘,’)
return render_to_response(‘centers/home.html’, { ‘country’: country, ‘latitude’: gmaps[2], ‘longitude’: gmaps[3] }, context_instance=RequestContext(request))[/code]

Et dans notre template nous n’avons plus qu’à traiter ces données comme nous le désirons. Dans mon cas en affichant une carte Google Maps.
Mais vos besoins peuvent varier et les possibilitées sont quasiment illimitées.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *