Géolocalisation de vos visiteurs (revisé)

Soyez le premier à donner votre avis sur cette source.

Vue 18 505 fois - Téléchargée 1 582 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
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
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
cs_yoman64
Messages postés
593
Date d'inscription
samedi 19 janvier 2002
Statut
Membre
Dernière intervention
4 décembre 2008
-
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 :)
neo2k2
Messages postés
126
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
-
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/
codefalse
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
Moi jvou'l dit, on va finir par concurrencer Google ;)
nlion
Messages postés
12
Date d'inscription
vendredi 10 septembre 2004
Statut
Membre
Dernière intervention
1 mars 2009
-
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 ;)

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.