Géolocalisation de vos visiteurs (revisé)

Soyez le premier à donner votre avis sur cette source.

Vue 18 781 fois - Téléchargée 1 628 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

Messages postés
16
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
20 mai 2008

Bonjour,
Il est possible en html de faire des liens sur des zones d'image (je ne me rappelle plus le nom du système par contre) je pensais à ça avec un petit script javascript (genre overlib) pour afficher une petite boite au passage de la souris sur le lien (fictif) de la zone.
Sinon un coup de flash...

Mais effectivement la source que tu mentionnes est excellente!!! Je ne connaissait pas et c'est plutôt puissant.

Pour les coordonnées des pays ça doit se trouver sur la toile...
Messages postés
496
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2009
1
Bonjour,
Ce serai une bonne idée mais; il faudrait s'amuser à définir toutes les coordonnées des bordures des pays!!!
Mais si vous êtes motivés: il y a cette source qui est géniale: http://www.phpcs.com/code.aspx?ID=46344
Et pour faire un changement de texte au passage de la souris, il faudrait faire du GIF.
Maintenant que j'y pense, si on utilisait du SVG, sorte de XML, (telle que http://upload.wikimedia.org/wikipedia/commons/4/4d/BlankMap-World.svg) mais bonjour la compatibilité...
Bonne journée...
Messages postés
16
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
20 mai 2008

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?
Messages postés
40
Date d'inscription
mercredi 19 mars 2008
Statut
Membre
Dernière intervention
25 août 2009

Balaise! je reconnais. 10/10
Messages postés
496
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2009
1
Bravo! ça c'est du code!
Excellentes idées!!!
Afficher les 12 commentaires

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.