Géolocalisation de vos visiteurs (revisé)

2/5 (12 avis)

Vue 19 540 fois - Téléchargée 1 713 fois

Description

Bonjour à tous
C'est une source sans aucune prétention que je poste suite à la source de nlion que vous pouvez trouver ici : http://www.phpcs.com/codes/LOCALISER-VISITEURS-VOTRE-SITE-SUR-CARTE_45966.aspx
J'ai fais une source qui fait sensiblement la même chose mais plus optimisé autant en temps qu'en longueur du code.

J'ai d'ailleurs pris sa liste de coordonées de pays que j'ai modifier afin d'avoir le nom complet du pays, je le remercis :).

Ajout:
1.Mise à jour en temps réel de la base de IP (associer le IP au pays avant de l'inserer: sauve du temps de traitement)
2.Prise en charge d'un cache pour l'image.
3.Top 20 des pays les plus visités sur l'image

Prérequis:
Un serveur avec MySql, php et la librairie GD

Utilisation:
Importer le fichier sql/import_me.sql.gz dans votre base
Éditer le fichier config.php

index.php : affiche l'image

index.php?force=1 : Force la mise à jour de la base, par exemple si vous avez une liste d'IP qui ne sont pas associé à aucun pays vous pouvez lancer le script qui va trouver le pays des ips déja présent et noter leurs pays.

visits.php: page à inclure en haut de chacunes de vos pages pour ajouter le ip et son pays en temps réel.

Le mieu est d'ajouter visits.php sur chaque page, mais si vous trouver ça trop lent vous pouvez ajouter visits_nolookup.php sur chaque page, et executer index.php?force=1 environ une fois par jour.

Bugs ?
Il ne devrait pas y en avoir

Amélioration possible ?
Sans aucun doute, à vous de ne le dire ;) .

Démo: http://jolteon.net/geo/

Source / Exemple :


<?php
  include('config.php');
  header('Content-type: image/png');

  /*Indice de taille pour le cercle */
  (array) $indice = Array(1000=>18,500=>15,100=>11,10=>8,1=>5);
  
  if (!file_exists('cache/map.png') || filemtime('cache/map.png')+$CACHE_TTL < time() || isset($_GET['force']))
  {
    $img = imagecreatefromgif('img/map2.gif');
    $black = imagecolorallocate($img,0,0,0);
      if (@mysql_connect($mysql['HOTE'],$mysql['USER'],$mysql['PASSWORD']))
      {
        if (@mysql_select_db($mysql['DATABASE']))
        {
          if($query = mysql_query('SELECT country,count,(Select map_position.x from map_position where map_position.COUNTRY_CODE= visitors.country),(Select map_position.y from map_position where map_position.COUNTRY_CODE= visitors.country) FROM `visitors` where country!=\'\'  ORDER BY `count` DESC'))
          {
              if (mysql_num_rows($query)>0)
              {
                (int) $cn = 10;
                while ($tab = mysql_fetch_row($query))
                {
                    foreach ($indice as $nbr=>$size) if ($nbr<$tab[1]) break;

                    $color   = imagecolorallocate($img, rand(120,220),   rand(120,220),   rand(120,220));
                    imagefilledellipse  ($img,imagesx($img)*$tab[2] ,imagesy($img)*$tab[3],$size,$size,$color);

                    ++$cn;
                    if ($cn <30)
                      imagestring($img, 3 ,2, $cn*10, $tab[0].' : '.$tab[1], $color);
                }

                $x = imagesx($img);
                foreach ($indice as $nbr=>$size)
                {
                    $x -= 30;
                    imagefilledellipse  ($img,$x ,imagesy($img)-24,$size,$size,$black);
                    imagestring($img, 2 ,$x-5, imagesy($img)-15, $nbr, $black);
                }
              }
              @imagepng($img,'cache/map.png');
          }
        }
      }
  
      if (mysql_error() !== '')
        imagestring($img, 3 ,2, 10, 'Erreur SQL: '. mysql_error(), $black);
   
    imagepng($img); 
  }
  else
    readfile('cache/map.png');
?>

Conclusion :


Note: Les pays affichés sur l'image sont en code 2 lettres, il est possible d'afficher le plein nom en modifiant quelques peu la source mais je trouvais ça beaucoup moin esthetique :P .

Questions pour les experts: Est-ce que ce serait mieu de charger la liste complete des coordonées par pays et mettre ça dans un array, ou la requête imbriqué c'est mieu ? Parce que j'hésite beaucoup...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
6 mars 2008 à 23:51
ca m'a l'air vraiment sympa, tout comme le code de nlion au passage :) Mais avec la gestion des erreurs en plus et une allègement du code (:

J'aime bien l'indication du nombre de personnes, c'est un plus que ne proposais pas nlion. Mais est-ce que tu vérifie que la personne ne rafraichis pas l'image ? (se faire compter plusieurs fois ?)

Perso je rajouterai l'indice des tailles (faire que tel diametre corresponde entre x et y personnes) afin d'éviter un rond trop gros par la suite :p

Nikel ! 8/10
On va bientot pouvoir concurrencer google ... hum
nlion Messages postés 12 Date d'inscription vendredi 10 septembre 2004 Statut Membre Dernière intervention 1 mars 2009
7 mars 2008 à 09:54
Motivé en effet ! J'ai chargé mon fichier avant-hier non ?

Pour "garder seulement le nombre d'entrés par Pays, et de ne pas garder une liste complete des IP accélererait beaucoup le traitement puisqu'on aurait que deux requêtes", je crois que c'est indispensable voir obligatoire. + de 1000 visites > + 15 s de chargement. Sauf si c'est pour un site avec peu de visites, on peut utiliser que les ips.

Une option qui est sympa, c'est de pouvoir mettre sa propre carte ;) (plus grande ou plus petite, ou une autre image). Pour mettre une autre image, il faut pouvoir redéfinir des nouvelles coordonnées pour chaque pays. J'avais mis cette option sur mon script (si tu veux t'en inspirer. Cette partie je l'ai faite très rapidement car je pensais m'en servir qu'une foie pour définir les emplacements sur l'image, donc il faut pas être trop critique lol). Les saisir toutes à la main y'en a pour beaucoup trop de temps.
ex: http://nlion.free.fr/IPsGEO/functions/UpdateCountrysPositions.php
De plus sur ma table des coordonnées des pays, il faut savoir qu'il manque des pays.

Mon code était un peu long c'est vrais. Tu m'as devancé ;) Je n'ai pas eu le temps de me pencher sur mon script depuis. C'est pas plus mal la preuve tu as développé un nouveau script.

En tout cas je suis très content d'avoir fournis ma source. Certains on été motivés pour faire quelque chose ;) Et peu de scripts proposent une localisation sur une carte sur phpcs. J'en est trouvé un quand même depuis qui a eu quelques idées communes avant. http://www.phpcs.com/codes/MAP-AVEC-TOUS-PAYS_39839.aspx Je n'ai pas essayé son script, mais apriori d'aspect c'est un peu similaire.

Bonne continuation !

PS : je met un 9 car ce script mérite de durée et d'évoluer encore. Pas 10 car j'ai donné l'idée ;)
GillesWebmaster Messages postés 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
27 mars 2008 à 09:26
Bravo! ça c'est du code!
Excellentes idées!!!
TheWeasel47 Messages postés 39 Date d'inscription mercredi 19 mars 2008 Statut Membre Dernière intervention 25 août 2009
21 avril 2008 à 16:53
Balaise! je reconnais. 10/10
cs_cadavor Messages postés 16 Date d'inscription lundi 26 novembre 2007 Statut Membre Dernière intervention 20 mai 2008
1 mai 2008 à 00:10
Bonjour,

Je trouve cette source vraiment génial mais est-il possible d'avoir la liste des pays dans des fichiers plutôt que en base de donnée?
Je sais que certains scripts utilisent des fichiers...

Au lieu d'avoir des rond pour représenter le nombre de visiteur des pays pourquoi ne pas colorier le pays suivant une échelle (bleu à rouge par exemple) avec des détails au survol du pays?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.