Subversion Repositories eFlore/Archives.eflore-consultation-v2

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
153 jpm 1
<?php
2
/*vim: set expandtab tabstop=4 shiftwidth=4: */
3
// +------------------------------------------------------------------------------------------------------+
4
// | PHP version 5.0.3                                                                                    |
5
// +------------------------------------------------------------------------------------------------------+
6
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org)                                         |
7
// +------------------------------------------------------------------------------------------------------+
8
// | This file is part of Cartographie.                                                                   |
9
// |                                                                                                      |
10
// | Foobar is free software; you can redistribute it and/or modify                                       |
11
// | it under the terms of the GNU General Public License as published by                                 |
12
// | the Free Software Foundation; either version 2 of the License, or                                    |
13
// | (at your option) any later version.                                                                  |
14
// |                                                                                                      |
15
// | Foobar is distributed in the hope that it will be useful,                                            |
16
// | but WITHOUT ANY WARRANTY; without even the implied warranty of                                       |
17
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                        |
18
// | GNU General Public License for more details.                                                         |
19
// |                                                                                                      |
20
// | You should have received a copy of the GNU General Public License                                    |
21
// | along with Foobar; if not, write to the Free Software                                                |
22
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                            |
23
// +------------------------------------------------------------------------------------------------------+
24
// CVS : $Id: carto_carte.class.php,v 1.1 2005-02-17 10:58:00 jpm Exp $
25
/**
26
* Classe Carto_Carte.
27
*
28
* Calsse permettant de réaliser des cartes.
29
*
30
*@package Cartographie
31
//Auteur original :
32
*@author        Nicolas MATHIEU
33
//Autres auteurs :
34
*@author        Jean-Pascal MILCENT <jpm@tela-botanica.org>
35
*@author        Alexandre GRANIER <alexandre@tela-botanica.org>
36
*@copyright     Tela-Botanica 2000-2004
37
*@version       $Revision: 1.1 $ $Date: 2005-02-17 10:58:00 $
38
// +------------------------------------------------------------------------------------------------------+
39
*/
40
 
41
// +------------------------------------------------------------------------------------------------------+
42
// |                                            ENTETE du PROGRAMME                                       |
43
// +------------------------------------------------------------------------------------------------------+
44
require 'carto_action.class.php';
45
require 'carto_couleur.class.php';
46
require 'carto_historique.class.php';
47
 
48
// +------------------------------------------------------------------------------------------------------+
49
// |                                            CORPS du PROGRAMME                                        |
50
// +------------------------------------------------------------------------------------------------------+
51
 
52
class Carto_Carte
53
{
54
    var $id;
55
    var $_id_zone_geo_carte;
56
    var $nom;
57
    var $masque;
58
    var $fond;
59
    var $chemin;
60
    var $image;
61
    var $fils;
62
    var $url;
63
    var $_info_table_zg;
64
    var $filiation;
65
    var $image_x;
66
    var $image_y;
67
    var $historique_cartes;
68
    var $liste_zone_carte;
69
    var $historique;
70
    // La couleur dominante ( $maxiRVB ), la couleur la plus claire ($miniRVB) et la couleur
71
    // intermédiaire précédant le maximum ( $mediumRVB ) au cas ou il y aurait un trop grand
72
    //ecart entre les deux plus grandes valeurs.
73
    var $_zeroR;
74
    var $_zeroV;
75
    var $_zeroB;
76
    var $_miniR;
77
    var $_miniV;
78
    var $_miniB;
79
    var $_mediumR;
80
    var $_mediumV;
81
    var $_mediumB;
82
    var $_maxiR;
83
    var $_maxiV;
84
    var $_maxiB;
85
    //Le type de formule mathématique permettant de colorier la carte
86
    var $_formule_coloriage;
87
    //L'action à réaliser
88
    var $_action;
89
    // +--------------------------------------------------------------------------------------------------+
90
    // Conifugration de la carto
91
    var $_maxiB;
92
 
93
 
94
    // +--------------------------------------------------------------------------------------------------+
95
    function _construct($id, $id_zone_geo_carte, $nom, $masque, $fond, $chemin, $info_table)
96
    {
97
        $this->id = $id;
98
        $this->_id_zone_geo_carte = $id_zone_geo_carte;
99
        $this->nom = $nom;
100
        $this->masque = $chemin.$masque;
101
        $this->fond = $chemin.$fond;
102
        $this->chemin = $chemin;
103
        $this->_info_table_zg = $info_table;
104
 
105
        $this->_action = new Carto_Action($info_table['nom_table_zone'],$info_table['nom_chp_id_zone'], $info_table['nom_chp_rouge'], $info_table['nom_chp_vert'], $info_table['nom_chp_bleu'],
106
                                                            'carto_ACTION', 'CA_ID_Carte', 'CA_ID_Zone_geo', 'CA_Type_zone', 'CA_Action', 'CA_ID_Carte_destination');
107
        $this->fils = array();
108
        $this->filiation = $id;
109
        $this->historique_cartes = '';
110
        $this->liste_zone_carte = '';
111
        $this->definirCouleurs();
112
        $this->definirFormuleColoriage();
113
    }
114
    // +--------------------------------------------------------------------------------------------------+
115
 
116
    function definirCouleurs (
117
        $couleur_zero_R = '255', $couleur_zero_V = '255', $couleur_zero_B = '255',
118
        $couleur_mini_R = '210', $couleur_mini_V = '230', $couleur_mini_B = '210',
119
        $couleur_medium_R  = '92', $couleur_medium_V = '181', $couleur_medium_B = '92',
120
        $couleur_maxi_R = '0', $couleur_maxi_V = '127', $couleur_maxi_B = '0')
121
    {
122
        $this->_zeroR = $couleur_zero_R;
123
        $this->_zeroV = $couleur_zero_V;
124
        $this->_zeroB = $couleur_zero_B;
125
        $this->_miniR = $couleur_mini_R;
126
        $this->_miniV = $couleur_mini_V;
127
        $this->_miniB = $couleur_mini_B;
128
        $this->_mediumR = $couleur_medium_R;
129
        $this->_mediumV = $couleur_medium_V;
130
        $this->_mediumB = $couleur_medium_B;
131
        $this->_maxiR = $couleur_maxi_R;
132
        $this->_maxiV = $couleur_maxi_V;
133
        $this->_maxiB = $couleur_maxi_B;
134
    }
135
 
136
    function definirFormuleColoriage ($nomFormuleColoriage = 'defaut')
137
    {
138
        $this->_formule_coloriage = $nomFormuleColoriage;
139
    }
140
 
141
    //********************************************************************************************************
142
    // La méthode donnerImageSimple ($objet) permet de récupérer une image non cliquable.
143
    //*********************************************************************************************************
144
 
145
    function donnerImageSimple($objet)
146
    {
147
        $nom_fichier_image = $this->_donnerIdUnique();
148
        $objet->_lancerColoriage('', $nom_fichier_image);
149
        $retour = '<img src="cartographie/bibliotheque/lib.carto.extractimg.php?fichier='.$nom_fichier_image.'" alt="Carte" />';
150
        return $retour;
151
    }
152
 
153
    //********************************************************************************************************
154
    // La methode ajouterFils() est essentielle. Elle permet d'ajouter toutes les sous cartes voulues.
155
    // Il faut lui indiquer, comme a la carte du niveau du dessus, son nom, le masque, le fond et info_table_couleur.
156
    // On a ainsi une inclusion d'objets les uns dans les autres.
157
    //*********************************************************************************************************
158
 
159
    function ajouterFils($id, $id_zone_geo_carte, $nom, $masque, $fond, $info_table)
160
    {
161
        $this->fils[$id] = new Carto_Carte ($id, $id_zone_geo_carte, $nom, $masque, $fond, $this->chemin, $info_table);
162
        //Si on ajoute à la carte du monde comme fils celle de l'europe, alors
163
        //on aura comme valeur pour $this->filiation de la carte d'europe : monde*europe
164
        $this->fils[$id]->filiation = $this->filiation.'*'.$id;
165
        $this->fils[$id]->url = $this->url;
166
        //Si on ajoute à la carte du monde dont le nom est 'Monde' comme fils celle de l'europe,
167
        //dont le nom est 'Europe', alors on aura comme valeur pour $this->nom de la carte d'europe : Monde*Europe
168
        $this->fils[$id]->nom = $this->nom.'*'.$nom;
169
        $this->fils[$id]->historique_cartes = $this->historique_cartes;
170
    }
171
 
172
    //*********************************************************************************************************
173
    // La methode donnerFormulaireImage() est la methode principale de la carto. C'est elle qui gere ce qu'il y a faire en
174
    // fonction de l'action de l'utilisateur.
175
    // Trois cas se distinguent :
176
    //      -soit l'utilisateur a clique sur un point de la carte.
177
    //      -soit il a clique sur un des liens que l'on a afficher avec la méthode afficherHistoriqueCarte de l'objet Carto_HistoriqueCarte.
178
    //      -soit il a sélectionné une zone géographique dans la liste déroulante.
179
    // Elle renvoit a la fin:
180
    //      -soit une nouvelle carte coloriée
181
    //      -soit false.
182
    //**********************************************************************************************************
183
 
184
    function donnerFormulaireImage ()
185
    {
186
        global $GS_GLOBAL;
187
        $res = '';
188
 
189
        // Nous commençons par tester tout d'abords si nous venons d'une autre carte. Pour cela nous vérifions,
190
        // si les attributs $this->image_x et $this->image_y de la classe Carte existe ou ne sont pas null.
191
        // La carte est une image appelée par une balise <input type="image"> et non par une balise classique <img>.
192
        // Ansi, lorsqu'on clique sur la carte le formulaire appelle (via l'url du formulaire) l'application
193
        // utilisant la classe carte et lui renvoit deux variables contenant les coordonnées x et y du clic.
194
        // L'application instancie à nouveau les objets cartes mais cette fois ci la carte affichée dépendra des
195
        // informations founit par une table de la base de données.
196
        // La classe carto_action instanciée dans l'application utilisant la classe carte fournit les noms
197
        // des champs et celui de la table contenant les valeur RVB de chaque zone des cartes, l'identifiant
198
        // de la zone et l'action à entreprendre pour la zone conssidérée.
199
        // La méthode imgform() utilise la méthode get_cartoAction() de l'objet Carto_Action pour connaître
200
        // en fonction des coordonnées du clic l'action à entreprendre.
201
 
202
 
203
        // Quoi qu'il arrive, on ouvre la balise formulaire
204
        $res = '<form action="'.$this->url.'" method="post">'."\n";
205
        $res .= '<p>'.CAR_CLIQUER_ACCEDER ;
206
        if (isset ($this->image_x) && ($this->image_x != '') && isset ($this->image_y) && ($this->image_y != '')) {
207
            // on regarde ici si l'on a pas un objet de plus bas niveau présent dans la variable de session carte
208
            //a charger a la place de l'objet de plus haut niveau
209
 
210
            $var_session_retour = $_SESSION['carte'] ;
211
 
212
            if ($var_session_retour) {
213
                $image_x = $this->image_x;
214
                $image_y = $this->image_y;
215
                $liste_zone_carte = $this->liste_zone_carte;
216
                // Nous chargons alors l'ojet approprié en descendant grâce a la généalogie
217
 
218
                $historique_cartes = explode('*',$this->historique_cartes);
219
                foreach ($historique_cartes as $key => $value) {
220
                    if ($key != 0) {
221
                        $this = $this->fils[$value];
222
                    }
223
                }
224
                $this->image_x = $image_x;
225
                $this->image_y = $image_y;
226
                $this->liste_zone_carte = $liste_zone_carte;
227
                unset ($_SESSION['carte']) ;
228
            }
229
 
230
            // on regarde qu'est-ce qu'on doit faire grace a la methode _consulterAction() de l'objet Carto_Action
231
 
232
            $action = $this->_action->_consulterActionImage($this->image_x, $this->image_y, $this->masque, $this->id);
233
 
234
            // Nous distinguons 2 cas :
235
            //le cas ou il faut afficher une nouvelle carte ... :
236
            if ($action['type_action'] == 'Aller_a') {
237
 
238
                $id_carte_destination = $action['id_carte_destination'] ;
239
                $this->fils[$id_carte_destination]->liste_zone_carte = $this->liste_zone_carte;
240
                $res .= ''.$this->fils[$id_carte_destination]->_donnerListeZoneCarte()."<br />\n";
241
                $res .= '<input type="image" src="';
242
                $id_image = $this->_donnerIdUnique();
243
                $this->fils[$id_carte_destination]->_lancerColoriage($id_image);
244
                $obj = serialize($this->fils[$id_carte_destination]);
245
                $_SESSION['carte'] = $obj ;
246
                $this->historique = $this->fils[$id_carte_destination]->filiation;
247
                $this->id = $this->fils[$id_carte_destination]->id;
248
                $this->nom = $this->fils[$id_carte_destination]->nom;
249
            }
250
            //Dans le cas où l'on veut rappeler une nouvelle carte, il se peut que la nouvelle carte à rappeler
251
            //soit la même que précédement.
252
            //Cette possibilité peut se présenter quand on clique sur un zone blanche d'une carte (càd dans la mer)
253
            //Là, on recharge la carte précédente :
254
            elseif ($action['type_action'] == 'Recharger') {
255
                $res .= ''.$this->_donnerListeZoneCarte()."<br />\n";
256
                $res .= '<input type="image" src="';
257
                $id_image = $this->_donnerIdUnique();
258
                $this->_lancerColoriage($id_image);
259
                $obj = serialize($this);
260
                $_SESSION['carte'] = $obj ;
261
                $this->historique = $this->filiation;
262
            }
263
            // ... et le cas ou il faut lancer le dernier niveau
264
            else if ($action['type_action'] == 'Stop') {
265
                unset ($_SESSION['carte']) ;
266
                $this->historique = $this->filiation.'*'.$action['id_zone_geo'];
267
                $obj = serialize($this);
268
                $_SESSION['carte'] = $obj ;
269
                return false;
270
            }
271
        }
272
        elseif ($this->liste_zone_carte != '') {
273
            $liste_zone_carte = $this->liste_zone_carte;
274
            $historique_cartes = explode('*',$this->historique_cartes);
275
            foreach ($historique_cartes as $key => $value) {
276
                if ($key != 0) {
277
                    $this = $this->fils[$value];
278
                }
279
            }
280
            $this->liste_zone_carte = $liste_zone_carte;
281
 
282
            $res .= ''.$this->_donnerListeZoneCarte($this->liste_zone_carte)."<br />\n";
283
            $res .= '<input type="image" src="';
284
            $id_image = $this->_donnerIdUnique();
285
            $this->_lancerColoriage($id_image, '', $this->liste_zone_carte);
286
            $this->historique = $this->historique_cartes;
287
            $obj = serialize($this);
288
            $_SESSION['carte'] = $obj ;
289
        }
290
        // On teste maintenant si l'on vient d'un lien. Si c'est le cas on a recu un argument
291
        // qui nous donne la "genealogie" de la carte que l'on doit afficher
292
        else if ($this->historique_cartes) {
293
            // Nous chargons alors l'ojet approprié en descendant grâce a la généalogie
294
            $historique_cartes = explode('*',$this->historique_cartes);
295
            foreach ($historique_cartes as $key => $value) {
296
                if ($key != 0) {
297
                    $this = $this->fils[$value];
298
                }
299
            }
300
            // une foit que l'on a charge le bon objet nous le colorions
301
            $res .= ''.$this->_donnerListeZoneCarte()."<br />\n";
302
 
303
            $res .= '<input type="image" src="';
304
            $id_image = $this->_donnerIdUnique();
305
            $this->_lancerColoriage($id_image);
306
            $this->historique = $this->historique_cartes;
307
            $obj = serialize($this);
308
            $_SESSION['carte'] = $obj ;
309
        }
310
        // Enfin si on ne vient pas d'une carte ou d'un lien c'est que l'on vient de l'onglet carto du menu
311
        // et on affiche alors la premiere carte
312
        else {
313
            unset ($_SESSION['carte']) ;
314
            $res .= ''.$this->_donnerListeZoneCarte()."<br />\n";
315
 
316
            $res .= '<input type="image" src="';
317
            $id_image = $this->_donnerIdUnique();
318
            $this->_lancerColoriage($id_image);
319
            $this->historique = $this->id;
320
            $obj = serialize($this);
321
 
322
            $_SESSION['carte'] = $obj ;
323
        }
324
        $res .= CAR_CHEMIN_LIBRAIRIE.'/lib.carto.extractimg.php?fichier='.$this->id.$id_image.'"';
325
        $res .= ' name="image" onmouseover="javascript:show(\'d\');" onmouseout="javascript:show(\'d\');" />'."\n";
326
        $res .= '<input type="hidden" name="historique_cartes" value="'.$this->historique.'" /></p>';
327
        $res .= '</form>'."\n";
328
        return $res;
329
    }
330
 
331
    /*|=============================================================================================|*/
332
    /*|                                LES METHODES PRIVEES                                         |*/
333
    /*|---------------------------------------------------------------------------------------------|*/
334
    function _donnerListeZoneCarte($zone_par_defaut = '')
335
    {
336
        $retour = '';
337
 
338
        $requete =
339
                    'SELECT '.$this->_info_table_zg['nom_chp_id_zone'].', '.$this->_info_table_zg['nom_chp_nom_zone'].
340
                    ' FROM '.$this->_info_table_zg['nom_table_zone'];
341
        if ($this->_info_table_zg['nom_chp_zone_sup'] != ''){
342
            if(ereg("[a-z]+",$this->_id_zone_geo_carte)){
343
                $requete .=
344
                    ' WHERE '.$this->_info_table_zg['nom_chp_zone_sup'].' = "'.$this->_id_zone_geo_carte.'"';
345
            }
346
            else{
347
                $requete .=
348
                    ' WHERE '.$this->_info_table_zg['nom_chp_zone_sup'].' = '.$this->_id_zone_geo_carte;
349
            }
350
        }
351
        $requete .=
352
                    ' ORDER BY '.$this->_info_table_zg['nom_chp_nom_zone'].' ASC';
353
 
354
        $resultat = mysql_query ($requete) or die('
355
            <H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
356
            '<b>Requete : </b>'.$requete.
357
            '<br/><br/><b>Erreur : </b>'.mysql_error());
358
 
359
        $i=0;
360
 
361
        $retour = '<select name="liste_zone_carte" onchange="javascript:this.form.submit();">'."\n";
362
        $retour .= '<option value="">Visualiser une zone :</option>'."\n";
363
 
364
        $nom_chp_nom_zone = $this->_info_table_zg['nom_chp_nom_zone'];
365
        $nom_chp_id_zone = $this->_info_table_zg['nom_chp_id_zone'];
366
 
367
        while ($ligne = mysql_fetch_object ($resultat)) {
368
            if ($zone_par_defaut == $ligne->$nom_chp_id_zone){
369
                $retour .= '<option value="'.$ligne->$nom_chp_id_zone.'" selected="selected">'.$ligne->$nom_chp_nom_zone.'</option>'."\n";
370
            }
371
            else {
372
                $retour .= '<option value="'.$ligne->$nom_chp_id_zone.'">'.$ligne->$nom_chp_nom_zone.'</option>'."\n";
373
            }
374
            $i++;
375
        }
376
 
377
        $retour .= '</select>'."\n";
378
 
379
        return $retour;
380
    }
381
    //==============================================================================
382
    // METHODE _lancerColoriage()
383
    //
384
    // Elle lance le coloriage de l'image.
385
    // Elle est lancée toute seule par la méthode donnerFormulaireImage().
386
    // Les informations qui lui sont necessaires sont déjà données à l'objet carte (fond, info_table_couleur).
387
    //==============================================================================
388
 
389
    function _lancerColoriage ($id_image = '_00', $nom_fichier = '', $id_zone_a_reperer = '')
390
    {
391
        $this->image = imagecreatefrompng($this->fond);
392
        $this->_colorierImage ($this->image, $this->_info_table_zg['nom_table_zone'], $this->_info_table_zg['nom_chp_id_zone'], $this->_info_table_zg['nom_chp_rouge'],
393
                                        $this->_info_table_zg['nom_chp_vert'], $this->_info_table_zg['nom_chp_bleu'], $this->_info_table_zg['nom_chp_zone_sup'],
394
                                        $this->_info_table_zg['tableau_valeurs_zone'], $id_zone_a_reperer) ;
395
        if ($nom_fichier != '') {
396
            imagepng(&$this->image,'tmp/carto/'.$nom_fichier.'.png');
397
            //$this->image = imagepng(&$this->image);
398
        }
399
        else {
400
            imagepng(&$this->image,'tmp/carto/'.$this->id.$id_image.'.png');
401
            //imagepng(&$this->image);
402
        }
403
    }
404
 
405
    //==============================================================================
406
    // METHODE _colorierImage()
407
    //
408
    // Elle réalise le coloriage de l'image.
409
    //==============================================================================
410
 
411
    function _colorierImage (&$image_fond, $table_zone_geo, $chp_id_zone_couleur, $chp_rouge, $chp_vert, $chp_bleu, $chp_zone_sup, $tableau_valeurs_zone, $id_zone_a_reperer)
412
    {
413
        //----------------------------------------------------------------------------
414
        // Cherche les valeurs RVB de la couleur de chaque zone géographique et les rentre dans
415
        //un tableau d'objets Carto_InformationCouleur (voir la description de la classe ci-dessus.
416
 
417
        $requete_01 =
418
                    'SELECT *'.
419
                    ' FROM '.$table_zone_geo;
420
        if ($chp_zone_sup != ''){
421
            if(ereg("[a-z]+",$this->_id_zone_geo_carte)){
422
                $requete_01 .=
423
                    ' WHERE '.$chp_zone_sup.' = "'.$this->_id_zone_geo_carte.'"';
424
            }
425
            else{
426
                $requete_01 .=
427
                    ' WHERE '.$chp_zone_sup.' = '.$this->_id_zone_geo_carte;
428
            }
429
        }
430
        $resultat_01 = mysql_query ($requete_01) or die('
431
            <H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
432
            '<b>Requete : </b>'.$requete_01.
433
            '<br/><br/><b>Erreur : </b>'.mysql_error());
434
        $i=0;
435
        $attachments = array();
436
        while ($ligne_01 = mysql_fetch_object ($resultat_01)) {
437
            $attachments[$i] = new Carto_InformationCouleur ($ligne_01->$chp_id_zone_couleur, $ligne_01->$chp_rouge, $ligne_01->$chp_vert, $ligne_01->$chp_bleu);
438
            $i++;
439
        }
440
 
441
        //Nous libérons toute la mémoire associée à l'identifiant de résultat.
442
        mysql_free_result ($resultat_01);
443
 
444
        //----------------------------------------------------------------------------
445
        // On realide l'association entre l'index des couleurs et la zone de meme couleur
446
 
447
        $attachments = $this->_construireAssociationIndexZone ($image_fond, $attachments);
448
 
449
        //----------------------------------------------------------------------------
450
        //Dans l'application qui utilise la classe carte, nous avons instancié un tableau
451
        //associatif qui contient en clé l'identifiant d'une zone géographique et en valeur
452
        //un nombre (qui peut-être un nombre d'inscrit, d'institutions, de taxons...).
453
        // Nous récupérons ci-dessous la valeur minimum autre que 0 présente dans ce tableau
454
        //puis une valeur conscidérée comme maximum
455
 
456
        if (!is_array($tableau_valeurs_zone)) {
457
            $mini = 0;
458
            $medium = 0;
459
            $maxi = 0;
460
            $nbre_valeurs = 0;
461
        }
462
        else {
463
            if (count($tableau_valeurs_zone) == 0) {
464
                $mini=0;
465
                $medium = 0;
466
                $maxi=0;
467
            }
468
            else {
469
                $i=0;
470
                foreach ($tableau_valeurs_zone as $cle => $valeur) {
471
                    //Nous recherchons le minimum, le maximum et le la valeur médium juste au dessous du maximum.
472
                    if ($valeur != 0) {
473
                        $tablo_valeurs[$i] = $valeur;
474
                        $i++;
475
                    }
476
                }
477
                //Nombre d'entrées dans le tableau de valeurs non nulles :
478
                $nbre_valeurs = count($tablo_valeurs);
479
                $somme_valeurs = array_sum($tablo_valeurs);
480
                $tablo_frequences = array_count_values($tablo_valeurs);
481
                $nbre_frequences = count($tablo_frequences);
482
                if ($nbre_valeurs > 0){
483
                    //Nous trions le tableau dans l'ordre croissant :
484
                    sort($tablo_valeurs);
485
                    //Nous récupérons la valeur la plus petite :
486
                    $mini = $tablo_valeurs[0];
487
                    $maxi = $tablo_valeurs[$nbre_valeurs-1];
488
                    isset($tablo_valeurs[$nbre_valeurs-2]) ? $medium = $tablo_valeurs[$nbre_valeurs-2] : $medium = 0;
489
                    $moyenne = $somme_valeurs/$nbre_valeurs;
490
                    $ecart_au_carre_moyen = 0;
491
                    for ($i = 0; $i < $nbre_valeurs; $i++) {
492
                        $ecart_au_carre_moyen += pow(($tablo_valeurs[$i] - $moyenne), 2);
493
                    }
494
                    $variance = $ecart_au_carre_moyen/$nbre_valeurs;
495
                    $ecart_type = sqrt($variance);
496
 
497
                    $moyenne = round($moyenne, 0);
498
                    $variance = round($variance, 0);
499
                    $ecart_type = round($ecart_type, 0);
500
 
501
                    /*echo 'Nombre de valeurs : '.$nbre_valeurs.'<br>';
502
                    echo 'Nombre de frequences : '.$nbre_frequences.'<br>';
503
                    echo 'Moyenne : '.$moyenne.'<br>';
504
                    echo 'Variance : '.$variance.'<br>';
505
                    echo 'Ecart-type : '.$ecart_type.'<br>';
506
                    echo 'Formule de coloriage : '.$this->_formule_coloriage.'<br>';
507
                    echo "mini : $mini medium : $medium maxi : $maxi<br/>";
508
            */
509
                }
510
            }
511
        }
512
 
513
        //----------------------------------------------------------------------------
514
        // Nous réalisons le coloriage de toutes les zones :
515
 
516
        $requete_03 =
517
            "SELECT $chp_id_zone_couleur ".
518
            "FROM $table_zone_geo";
519
 
520
        $resultat_03 = mysql_query ($requete_03) or die('
521
            <H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
522
            '<b>Requete : </b>'.$requete_03.
523
            '<br/><br/><b>Erreur : </b>'.mysql_error());
524
 
525
        while ($ligne_03 = mysql_fetch_object ($resultat_03)) {
526
            $id_zone_geo = $ligne_03->$chp_id_zone_couleur;
527
            if (!isset ($tableau_valeurs_zone[$id_zone_geo])) {
528
                $tableau_valeurs_zone[$id_zone_geo] = 0;
529
            }
530
            //Nous cherchons la couleur a afficher pour chaque zone.
531
            if ($tableau_valeurs_zone[$id_zone_geo] != 0) {
532
                //echo 'ZONE:'.$id_zone_geo."<br/>";
533
                //echo $tableau_valeurs_zone[$id_zone_geo]."<br/>";
534
                $theColor = $this->_donnerCouleur (
535
                                        $this->_miniR, $this->_miniV, $this->_miniB,
536
                                        $this->_mediumR , $this->_mediumV , $this->_mediumB ,
537
                                        $this->_maxiR , $this->_maxiV , $this->_maxiB ,
538
                                        $mini, $medium, $maxi, $nbre_valeurs, $ecart_type, $moyenne, $tablo_valeurs,
539
                                        $tablo_frequences, $nbre_frequences,
540
                                        $tableau_valeurs_zone[$id_zone_geo],
541
                                        $this->_formule_coloriage);
542
                //echo $theColor['R'].'<br>';
543
                //echo $theColor['V'].'<br>';
544
                //echo $theColor['B'].'<br>';
545
            }
546
            else {
547
                $theColor['R'] = $this->_zeroR;
548
                $theColor['V'] = $this->_zeroV;
549
                $theColor['B'] = $this->_zeroB;
550
            }
551
            //Nous réalisons le coloriage de toutes les zones de l'image avec la couleur obtenue.
552
            $this->_remplacerCouleur ($image_fond, $attachments, $id_zone_geo,  $theColor['R'], $theColor['V'], $theColor['B'], $id_zone_a_reperer);
553
        }
554
        //Nous libérons toute la mémoire associée à l'identifiant de résultat de la requête.
555
        mysql_free_result ($resultat_03);
556
    }
557
 
558
    //==============================================================================
559
    // METHODE  _construireAssociationIndexZone ($image, &$att)
560
    //
561
    // Le tableau $att est passé par référence. La méthode modifie donc directement
562
    // le tableau et ne renvoit donc rien.
563
    // Attache dans un tableau $att, contenant sous forme d'objet (Carto_ColorInfo)
564
    // les valeurs RVB des zones d'une image, la valeur de l'index correspondant
565
    // à la couleur de la zone.
566
    // Note : les images en question sont constituées de zones distincte possédant
567
    // chacune une couleur unique et unie.
568
    //==============================================================================
569
 
570
    function _construireAssociationIndexZone (&$image_fond, &$att)
571
    {
572
        // Nous récupérons le nombre de couleur différentes contenues dans l'image.
573
        //echo $this->fond.'<BR>';
574
        $image_fond = imagecreatefrompng($this->fond);
575
        $taille_palette = imagecolorstotal ($image_fond);
576
        //echo $taille_palette.'<br>';
577
        // Pour chaque couleur contenue dans l'image, nous cherchons l'objet correspondant
578
        // dans le tableau $att, qui contient des informations sur chaque zone de l'image,
579
        // et nous attribuons à l'objet la valeur de l'index de sa couleur dans l'image.
580
 
581
        for ($i = 0; $i < $taille_palette; $i++) {
582
            $valeurs_RVB = array();
583
            $valeurs_RVB = imagecolorsforindex ($image_fond, $i);
584
            for ($j = 0; $j < count ($att); $j++) {
585
 
586
                if (($att[$j]->rouge == $valeurs_RVB['red']) && ($att[$j]->vert == $valeurs_RVB['green']) && ($att[$j]->bleu == $valeurs_RVB['blue'])) {
587
                    $att[$j]->index = $i;
588
                    //echo 'ICI'.$att[$j]->id_zone.$att[$j]->index.'<br>';
589
                    break;
590
                }
591
            }
592
        }
593
 
594
        return $att;
595
    }//Fin méthode _construireAssociationIndexZone()
596
 
597
    //==============================================================================
598
    // METHODE _donnerCouleur()
599
    //------------------------------------------------------------------------------
600
    // Renvoie pour une valeur donnee la couleur a mettre
601
    //------------------------------------------------------------------------------
602
    // ENTREE
603
    // $miniR : valeur rouge du minimum
604
    // $miniV : valeur vert du minimum
605
    // $miniB : valeur blue du minimum
606
    // $maxiR : valeur rouge du maximum
607
    // $maxiV : valeur vert du maximum
608
    // $maxiB : valeur bleu du maximum
609
    // $mediumR : valeur rouge du deuxieme maximum
610
    // $mediumV : valeur vert du deuxieme maximum
611
    // $mediumB : valeur bleu du deuxieme maximum
612
    // $mini  : valeur mini sur l'echelle
613
    // $medium  : valeur juste au dessous du maximum sur l'echelle
614
    // $maxi  : valeur maxi sur l'echelle
615
    // $val   : valeur dont on cherche la couleur
616
    //------------------------------------------------------------------------------
617
    // SORTIE
618
    // $couleur array donne la couleur pour la valeur demande ($val)
619
    //------------------------------------------------------------------------------
620
 
621
    function _donnerCouleur ($miniR, $miniV, $miniB, $mediumR, $mediumV, $mediumB, $maxiR,
622
                            $maxiV, $maxiB, $mini, $medium, $maxi, $nbre_valeurs, $ecart_type, $moyenne, $tablo_valeurs, $tablo_frequences, $nbre_frequences, $val, $formuleColoriage)
623
    {
624
        if ($formuleColoriage == 'defaut'){
625
            if ($val == $maxi) {
626
                $couleur['R'] = $maxiR;
627
                $couleur['V'] = $maxiV;
628
                $couleur['B'] = $maxiB;
629
            }
630
            if ($val == $mini && $val != $maxi) {
631
                $couleur['R'] = $miniR;
632
                $couleur['V'] = $miniV;
633
                $couleur['B'] = $miniB;
634
            }
635
            if ($maxi/10 > $medium && $maxi/40 < $medium) {
636
                $diff = $medium - $mini;
637
                if ($diff > 0 && $val != $medium && $val != $maxi) {
638
                    $diffR   = $mediumR - $miniR;
639
                    $diffV   = $mediumV - $miniV;
640
                    $diffB   = $mediumB - $miniB;
641
                    $variationR =  round ( ($diffR/$diff ), 0 );
642
                    $variationV =  round ( ($diffV/$diff ), 0 );
643
                    $variationB =  round ( ($diffB/$diff ), 0 );
644
                    $couleur['R'] = couleur_bornerNbre(($miniR + ($val * $variationR)), 0, 255);
645
                    $couleur['V'] = couleur_bornerNbre(($miniV + ($val * $variationV)), 0, 255);
646
                    $couleur['B'] = couleur_bornerNbre(($miniB + ($val * $variationB)), 0, 255);
647
                }
648
                else if ($val == $medium) {
649
                    $couleur['R'] = $mediumR;
650
                    $couleur['V'] = $mediumV;
651
                    $couleur['B'] = $mediumB;
652
                }
653
            }
654
            else {
655
                $diff = $maxi - $mini;
656
                if ($diff > 0 && $val != $maxi && $val != $mini) {
657
                    $diffR = $maxiR - $miniR;
658
                    $diffV = $maxiV - $miniV;
659
                    $diffB = $maxiB - $miniB;
660
                    $variationR =  round ( ($diffR/$diff ), 0 );
661
                    $variationV =  round ( ($diffV/$diff ), 0 );
662
                    $variationB =  round ( ($diffB/$diff ), 0 );
663
                    $couleur['R'] = couleur_bornerNbre(($miniR + ($val * $variationR)), 0, 255);
664
                    $couleur['V'] = couleur_bornerNbre(($miniV + ($val * $variationV)), 0, 255);
665
                    $couleur['B'] = couleur_bornerNbre(($miniB + ($val * $variationB)), 0, 255);
666
                }
667
                else if ($diff == 0){
668
                    $couleur['R'] = $mediumR;
669
                    $couleur['V'] = $mediumV;
670
                    $couleur['B'] = $mediumB;
671
                }
672
            }
673
        }
674
        elseif ($formuleColoriage == 'ecart_type') {
675
            if ($ecart_type == 0) {
676
                    $couleur['R'] = $maxiR;
677
                    $couleur['V'] = $maxiV;
678
                    $couleur['B'] = $maxiB;
679
            }
680
            elseif ($ecart_type >= 1 && $ecart_type <= 15) {
681
                if ($val == $mini) {
682
                    $couleur['R'] = $miniR;
683
                    $couleur['V'] = $miniV;
684
                    $couleur['B'] = $miniB;
685
                }
686
                elseif ($val == $medium) {
687
                    $couleur['R'] = $mediumR;
688
                    $couleur['V'] = $mediumV;
689
                    $couleur['B'] = $mediumB;
690
                }
691
                elseif ($val == $maxi) {
692
                    $couleur['R'] = $maxiR;
693
                    $couleur['V'] = $maxiV;
694
                    $couleur['B'] = $maxiB;
695
                }
696
                else {
697
                    $dif_valeur_maxi_mini = $maxi - $mini;
698
                    $diffR = $maxiR - $miniR;
699
                    $diffV = $maxiV - $miniV;
700
                    $diffB = $maxiB - $miniB;
701
                    $variationR =  round ( ($diffR/$dif_valeur_maxi_mini ), 0 );
702
                    $variationV =  round ( ($diffV/$dif_valeur_maxi_mini ), 0 );
703
                    $variationB =  round ( ($diffB/$dif_valeur_maxi_mini ), 0 );
704
                    $couleur['R']=$miniR + ($val * $variationR);
705
                    $couleur['V']=$miniV + ($val * $variationV);
706
                    $couleur['B']=$miniB + ($val * $variationB);
707
                }
708
            }
709
            elseif ($ecart_type > 15) {
710
                //Le tableau est trié de la plus petite à la plus grande clé.
711
                ksort($tablo_frequences);
712
                $i = 0;
713
                foreach ($tablo_frequences as $cle => $valeur){
714
                    //Nous cherchons la correspondance entre la valeur et la clé.
715
                    if ($cle == $val) {
716
                        //Pour faire le Rouge, Vert, Bleu
717
                        $couleur['R'] = $miniR + ($i/$nbre_frequences) * ($maxiR - $miniR);
718
                        $couleur['V'] = $miniV + ($i/$nbre_frequences) * ($maxiV - $miniV);
719
                        $couleur['B'] = $miniB + ($i/$nbre_frequences) * ($maxiB - $miniB);
720
                    }
721
                    $i++;
722
                }
723
            }
724
        }
725
 
726
        return $couleur;
727
 
728
    }//Fin méthode _donnerCouleur()
729
 
730
    //==============================================================================
731
    // METHODE _remplacerCouleur ($img, $att, $id_zone_geo, $r, $g, $b)
732
    //
733
    // $img is the image, $att an array of carto_colorinfo objects, $id_zone_geo the name
734
    // of an object of $att, ($r, $g, $b) the new color.
735
    //
736
    // In the palette of $img, the color matching with $id_zone_geo is modified.
737
    //==============================================================================
738
 
739
    function _remplacerCouleur (&$image, &$atta, $id_zone_geo, $rouge, $vert, $bleu, $id_zone_a_reperer)
740
    {
741
        // Nous recherchons la valeur de l'index.
742
 
743
        $index = -1;
744
        for ($i = 0; $i < count ($atta); $i++) {
745
            if ($atta[$i]->id_zone == $id_zone_geo) {
746
                $index = $atta[$i]->index;
747
                //Dans le cas où nous voulons repérer une zone sur la carte :
748
                if($id_zone_geo == $id_zone_a_reperer) {
749
                    $rouge = 255;
750
                    $vert = 0;
751
                    $bleu = 0;
752
                }
753
                break;
754
            }
755
        }
756
 
757
        // Nous mettons à jour l'image de la carte avec la valeur de l'index.
758
 
759
        if ($index >= 0) {
760
            imagecolorset (&$image, $index, $rouge, $vert, $bleu);
761
        }
762
 
763
    }//Fin de la méthode _remplacerCouleur
764
 
765
    //==============================================================================
766
    // METHODE _donnerIdUnique ()
767
    //
768
    // Cette méthode privée retourne un identifiant de 32 caractères unique.
769
    //
770
    //==============================================================================
771
 
772
    function _donnerIdUnique ()
773
    {
774
        $id = '';
775
        $id = md5 (uniqid (rand()));
776
 
777
        return $id;
778
    }//Fin de la méthode _donnerIdUnique()
779
 
780
 
781
}//Fin de la classe Carto_Carte()
782
 
783
 
784
// +------------------------------------------------------------------------------------------------------+
785
 
786
 
787
// +------------------------------------------------------------------------------------------------------+
788
// |                                           LISTE de FONCTIONS                                         |
789
// +------------------------------------------------------------------------------------------------------+
790
 
791
 
792
 
793
 
794
// +------------------------------------------------------------------------------------------------------+
795
// |                                            PIED du PROGRAMME                                         |
796
// +------------------------------------------------------------------------------------------------------+
797
 
798
 
799
/* +--Fin du code ----------------------------------------------------------------------------------------+
800
*
801
* $Log: not supported by cvs2svn $
802
*
803
* +-- Fin du code ----------------------------------------------------------------------------------------+
804
*/
805
?>