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...
6 mars 2008 à 23:51
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
7 mars 2008 à 09:54
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 ;)
27 mars 2008 à 09:26
Excellentes idées!!!
21 avril 2008 à 16:53
1 mai 2008 à 00:10
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.