Géolocalisation de vos visiteurs (revisé)

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

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.