Subversion Repositories eFlore/Applications.bibliobota

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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