Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

GÉOLOCALISATION DE VOS VISITEURS (REVISÉ)


Information sur la source

Catégorie :Graphique Classé sous : geolocalisation, visiteurs, compteurs, ip Niveau : Débutant Date de création : 06/03/2008 Date de mise à jour : 07/03/2008 11:59:40 Vu / téléchargé: 10 382 / 740

Note :
9,2 / 10 - par 5 personnes
9,20 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
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

  • <?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');
  • ?>
<?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...
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

06 mars 2008 21:38:56 :
Un oubli
06 mars 2008 21:44:50 :
Ajout d'une question après relecture du code
07 mars 2008 00:27:22 :
Ajout d'un indice de taille parametrable
07 mars 2008 09:56:49 :
La capture a déconnée..
07 mars 2008 09:59:13 :
La capture a déconnée..
07 mars 2008 11:02:20 :
On garde juste les visites par ip, pas la liste complête des ips. Ajout de vérification si la personne passe par un proxy.
07 mars 2008 11:59:40 :
Zip mal passe, decidement konqueror m'aime pas :(

Commentaires et avis

signaler à un administrateur
Commentaire de codefalse le 06/03/2008 23:51:56 administrateur CS 8/10

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

signaler à un administrateur
Commentaire de yoman64 le 07/03/2008 00:26:07

Salut,

En fait index.php ne compte pas les visites, elle ne fait qu'afficher la carte (qui est mise en cache, donc pas de génération inutile).

Ensuite pour le compteur de visites "visits.php" il crée une session pour éviter les doublons évidement :) Toute manière le champs "ip" est unique dans la base mysql.
Pour l'idée de l'indice de taille j'y avais pensé, j'ai eu un coup de paresse :P, je vais corriger ça tout de suite....voila c'est fait :)

signaler à un administrateur
Commentaire de neo2k2 le 07/03/2008 09:29:24

Bravo, je trouve ton code vraiment sympa.

Comme je l'ai signalé pour ls source de nlion, je t'invite à rajouter des informations sympas du genre:
- marquer plus distinctement l'emplacement du visiteur
- afficher les informations du visiteur dans un tableau (ip, pays, ville, etc.)

Un exemple que je trouve sympa: http://www.geoiptool.com/

signaler à un administrateur
Commentaire de codefalse le 07/03/2008 09:34:54 administrateur CS

Moi jvou'l dit, on va finir par concurrencer Google ;)

signaler à un administrateur
Commentaire de nlion le 07/03/2008 09:54:42 9/10

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 ;)

signaler à un administrateur
Commentaire de twisteurwin le 07/03/2008 22:38:10

Yop NLION !
De passage par là je te passe le bonjour ça fait un bail dis donc toi lol (On a un peu bossé ensemble sur CRV si tu te souvient^^)
Joli script en tout cas et déjà optimisé (yoman64 quelle rapidité, chapeau !) ça a tout d'une belle source utile en tout cas !
Bon je retourne dans mon débug de script, j'ai deux mots à leur dire alors bon courage pour la suite !
+++ all


signaler à un administrateur
Commentaire de bezzaz le 23/03/2008 12:48:46

Bonjour,

Bravo, ton code est vraiment sympa.

Mais j'ai une question comme ça ! Est ce que on peut faire dans le même principe une carte qui affiche des points (importation/exportation du pétrole par exemple) sur les pays importatrice, avec le diamètre du point qui change par rapport à la quantité importer ! ??

signaler à un administrateur
Commentaire de GillesWebmaster le 27/03/2008 09:26:15 10/10

Bravo! ça c'est du code!
Excellentes idées!!!

signaler à un administrateur
Commentaire de TheWeasel47 le 21/04/2008 16:53:49 10/10

Balaise! je reconnais. 10/10

signaler à un administrateur
Commentaire de cadavor le 01/05/2008 00:10:19 9/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?

signaler à un administrateur
Commentaire de GillesWebmaster le 01/05/2008 11:23:58

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...

signaler à un administrateur
Commentaire de cadavor le 01/05/2008 12:17:42

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...

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

l'IP des visiteurs d'un blog [ par shigure ] Je voudrais enregistrer l'IP des visiteurs de mon blog.Mon blog est sur 20six.Pour l'enregistrement des données, soit vers un fichier *.txt sur un ftp probleme update et delete [ par blinix123 ] Bonjour à tous, alors voila, j'ai un script qui me permet de compter le nombre de visiteurs totale et le nombre de visiteurs en ligne, or bien evidemm Connaître l'IP des visiteurs [ par bigcheek ] Bonjour à tous,Je suis assez débutant en php et je souhaiterai connaître l'adresse ip des personnes visitant une certaine page de mon site.Je me suis Proposer des compteurs à mes visiteurs ! [ par skaterboss2000 ] Salut tt le monde !Bon, comme sur certain site (http://www.discompteur.com par exemple) je voudrais proposer à mes visiteurs de créer leur compteur te Adresse IP [ par MiTcH37 ] bijour,j'ai un visiteur sur mon site qui change tout le temps d'IP :64.68.81.14564.68.81.14064.68.81.14164.68.81.16764.68.81.19464.68.81.15164.68.81.1 Image et Ip [ par ooosakilo ] Bonjour, ca fait quelque temps que je cherche et je trouve pas.Alors je voudrais afficher l'ip, l'acces internet, le navigateur internet et l'OS d'une compteur de nombre de visiteurs connecté [ par developvbdebut ] Bonjour tout le mondeQuel qu'un a ti'l déja utilisé la source de antidoteVoici le nom de la source ce dessou:COMPTEUR DE VISITEURS CONNECTÉS EN TEMPS comment empêcher une poste à accéder à mon site connaissant son IP [ par sahliali ] Je vient de créer un site web intranet et je veut réaliser une table dont laquelle j'enregistre tous les traces d'un visiteur parmis ces traces son IP Sondage, reconnaissance IP... [ par jojomillenium ] Hello!Voila ma question. Je propose un sondage sur mon site, et j'aimerai interdire le vote multiple...J'ai alors fait le test de l'adresse IP enregis Vraie adresse IP [ par Jarod1980 ] Bonjour,J'ai une petite question. Je voudrais enregistrer l'adresse IP de mes visiteurs. J'ai vu quelques scripts sur phpcs permettant de faire ceci.


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.