Subversion Repositories eFlore/Applications.coel-consultation

Rev

Rev 25 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 25 Rev 29
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Composant Cartographie gérant les images représentant le fond de carte à insérer dans un fichier html contenant une
4
 * Composant Cartographie gérant les images représentant le fond de carte à insérer dans un fichier html contenant une
5
 * image map.
5
 * image map.
6
 * Avantage : 
6
 * Avantage : 
7
 *  - pas de base de données liée au composant (simplicité d'utilisation dans les applications)
7
 *  - pas de base de données liée au composant (simplicité d'utilisation dans les applications)
8
 *  - facilite l'utilisation du Javascript et CSS pour intéragir avec la carte (affichage du nom des zones au survol)
8
 *  - facilite l'utilisation du Javascript et CSS pour intéragir avec la carte (affichage du nom des zones au survol)
9
 *  - l'application qui utilise le composant définie elle-même l'intéraction avec le clic sur une zone
9
 *  - l'application qui utilise le composant définie elle-même l'intéraction avec le clic sur une zone
10
 * Inconvénient :
10
 * Inconvénient :
11
 *  - l'utilisation d'une balise map alourdie la page à renvoyer
11
 *  - l'utilisation d'une balise map alourdie la page à renvoyer
12
 *  
12
 *  
13
 * Il est possible de créer des fond de carte en vraies couleurs 
13
 * Il est possible de créer des fond de carte en vraies couleurs 
14
 * (16 millions de zones maxi sur la carte) ou en couleurs indexées (255 zones maxi sur la carte).
14
 * (16 millions de zones maxi sur la carte) ou en couleurs indexées (255 zones maxi sur la carte).
15
 * Les couleurs réservées et a ne pas utiliser pour créer l'image png de fond sont : 
15
 * Les couleurs réservées et a ne pas utiliser pour créer l'image png de fond sont : 
16
 * - le blanc (rvb : 255-255-255)
16
 * - le blanc (rvb : 255-255-255)
17
 * - le noir (rvb : 0-0-0)
17
 * - le noir (rvb : 0-0-0)
18
 * - le gris (rvb : 128-128-128)
18
 * - le gris (rvb : 128-128-128)
19
 * - le rouge (rvb : 255-0-0)
19
 * - le rouge (rvb : 255-0-0)
20
 * Pour activer le cache indiquer la date de dernière mise à jour des données servant à créer la carte de cette façon :
20
 * Pour activer le cache indiquer la date de dernière mise à jour des données servant à créer la carte de cette façon :
21
 * $Carte->setCarteInfo(array('donnees_date_maj' => $date_maj_donnees));
21
 * $Carte->setCarteInfo(array('donnees_date_maj' => $date_maj_donnees));
22
 *
22
 *
23
 * @category	PHP5
23
 * @category	PHP5
24
 * @package		Collection
24
 * @package		Collection
25
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
25
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
26
 * @copyright	2010 Tela-Botanica
26
 * @copyright	2010 Tela-Botanica
27
 * @license		GPL-v3 et CECILL-v2
27
 * @license		GPL-v3 et CECILL-v2
28
 * @version		SVN:$Id$
28
 * @version		SVN:$Id$
29
 */
29
 */
30
 
30
 
31
class Cartographie {
31
class Cartographie {
32
	/*** Constantes : ***/
32
	/*** Constantes : ***/
33
	const FORMULE_PROPORTIONNEL = 'proportionnel';
33
	const FORMULE_PROPORTIONNEL = 'proportionnel';
34
	const FORMULE_LEGENDE = 'legende';
34
	const FORMULE_LEGENDE = 'legende';
35
 
35
 
36
	//+----------------------------------------------------------------------------------------------------------------+
36
	//+----------------------------------------------------------------------------------------------------------------+
37
	/*** Attributs : ***/
37
	/*** Attributs : ***/
38
	/**
38
	/**
39
	* L'image de la carte.
39
	* L'image de la carte.
40
	* @var string l'image de la carte.
40
	* @var string l'image de la carte.
41
	*/
41
	*/
42
	private $carte;
42
	private $carte;
43
	
43
	
44
	/**
44
	/**
45
	* Le nom du fichier contenant la carte sans l'extension.
45
	* Le nom du fichier contenant la carte sans l'extension.
46
	* @var string le nom du fichier de la carte.
46
	* @var string le nom du fichier de la carte.
47
	*/
47
	*/
48
	private $carte_nom;
48
	private $carte_nom;
49
	
49
	
50
	/**
50
	/**
51
	* @var string le chemin et le nom du fichier de l'image de la carte générée.
51
	* @var string le chemin et le nom du fichier de l'image de la carte générée.
52
	*/
52
	*/
53
	private $carte_fichier;
53
	private $carte_fichier;
54
	
54
	
55
	/**
55
	/**
56
	* Tableaux associatif contenant les informations sur la carte.
56
	* Tableaux associatif contenant les informations sur la carte.
57
	* donnees_date_maj = date de dernière mise à jour des données servant à créer la carte, si plus récente que la carte 
57
	* donnees_date_maj = date de dernière mise à jour des données servant à créer la carte, si plus récente que la carte 
58
	* déjà créée getCarteCache renvoie false.
58
	* déjà créée getCarteCache renvoie false.
59
	* 
59
	* 
60
	* @var array le tableau des infos sur la carte.
60
	* @var array le tableau des infos sur la carte.
61
	*/
61
	*/
62
	private $carte_info = array();
62
	private $carte_info = array();
63
 
63
 
64
	/**
64
	/**
65
	* Indique si la carte existe déjà et à besoin ou pas d'être créée.
65
	* Indique si la carte existe déjà et à besoin ou pas d'être créée.
66
	* @var bool true si la carte existe..
66
	* @var bool true si la carte existe..
67
	*/
67
	*/
68
	private $carte_cache = false;
68
	private $carte_cache = false;
69
	
69
	
70
	/**
70
	/**
71
	* Le nom du fichier de la carte de fond.
71
	* Le nom du fichier de la carte de fond.
72
	* @var string nom du fichier de la carte de fond.
72
	* @var string nom du fichier de la carte de fond.
73
	*/
73
	*/
74
	private $carte_fond_fichier;
74
	private $carte_fond_fichier;
75
	
75
	
76
	/**
76
	/**
77
	* Le nom du dossier contenant les cartes de fond.
77
	* Le nom du dossier contenant les cartes de fond.
78
	* @var string nom du dossier contenant les cartes de fond.
78
	* @var string nom du dossier contenant les cartes de fond.
79
	*/
79
	*/
80
	private $carte_fond_dossier;
80
	private $carte_fond_dossier;
81
	
81
	
82
	/**
82
	/**
83
	* Le nom du dossier où stocker les cartes créer via la classe Cartographie.
83
	* Le nom du dossier où stocker les cartes créer via la classe Cartographie.
84
	* @var string nom du dossier contenant les cartes créées.
84
	* @var string nom du dossier contenant les cartes créées.
85
	*/
85
	*/
86
	private $carte_stockage_dossier;
86
	private $carte_stockage_dossier;
-
 
87
	
-
 
88
	/**
-
 
89
	* L'url correspondant au dossier où sont stockées les cartes crées via la classe Cartographie.
-
 
90
	* L'url est passé à la fonction sprintf est doit donc contennir %s afin d'indiquer l'endroite où ajouter le nom du 
-
 
91
	* fichier de la carte.
-
 
92
	* @var string url des cartes créées.
-
 
93
	*/
-
 
94
	private $carte_stockage_url;
87
 
95
 
88
	/**
96
	/**
89
	* Format du tableau :
97
	* Format du tableau :
90
	* carte_zone_info est un tableau de tableaux associatifs.
98
	* carte_zone est un tableau de tableaux associatifs.
91
	* Chaque zone de la carte doit avoir son entrée dans ce tableau. Chaque zone est représentée par :
99
	* Chaque zone de la carte doit avoir son entrée dans ce tableau. Le code de la zone sert de clé.
-
 
100
	* Chaque zone est représentée par :
92
	* - nom : (string)
101
	* - nom : (string)
93
	* 	le nom de la zone.
-
 
94
	* - index : (int) 
-
 
95
	* 	l'index de la couleur dans la palette si on a à faire à une image indexée (moins de 255 zones sur la carte)
102
	* 	le nom de la zone qui sera affiché dans l'attribut title de la balise map html.
96
	* - rvb_fond : (string) Exemple : 255-255-255. 
103
	* - rvb_fond : (string) Exemple : 255-255-255.
97
	* 	les valeurs entre 0 et 255 séparées par des tirets (-) de la couleur de la zone sur la carte de fond
104
	* 	les valeurs entre 0 et 255 séparées par des tirets (-) de la couleur de la zone sur la carte de fond
98
	* 	Ne pas utiliser le blanc (255-255-255) et utiliser le noir pour les contours(0-0-0).
105
	* 	Ne pas utiliser le blanc (255-255-255) et utiliser le noir pour les contours (0-0-0).
-
 
106
	* - poly : (string)
-
 
107
	* 	les coordonnées pour la balise map html. Si une même zone à plusieurs polygones, les séparer par le 
-
 
108
	* 	caractère pipe "|".
-
 
109
	* - info_nombre : (int) Exemple : nombre de personnes présentent dans un département. 
-
 
110
	* 	nombre d'occurence dans cette zone. 
-
 
111
	* - url : (string) l'url qui doit être appelée sur un clic dans la zone.
99
	* - rvb_carte : (string) Exemple : 255-255-255.
112
	* - rvb_carte : (string) Exemple : 255-255-255.
100
	* 	les valeurs entre 0 et 255 séparées par des tirets (-) de la couleur de remplacement
113
	* 	les valeurs entre 0 et 255 séparées par des tirets (-) de la couleur de remplacement dans le cas de la formule 
101
	* - nombre : (int) Exemple : nombre de personnes présentent dans un département.
-
 
102
	* 	nombre d'occurence dans cette zone.
114
	* 	de coloriage de type "légende". 	
103
	* @var array les informations sur les zones de la carte.
115
	* @var array les informations sur les zones de la carte.
104
	*/
116
	*/
105
	private $carte_zone_info = array();
117
	private $carte_zones = null;
106
	
118
	
107
	/**
119
	/**
108
	* Tableau contenant la valeur RVB de la zone du fond de carte en clé et la valeur RVB venant la remplacer en valeur.
120
	* Tableau contenant la valeur RVB de la zone du fond de carte en clé et la valeur RVB venant la remplacer en valeur.
109
	* @var array valeur RVB de la zone du fond de carte en clé et valeur RVB venant la remplacer en valeur.
121
	* @var array valeur RVB de la zone du fond de carte en clé et valeur RVB venant la remplacer en valeur.
110
	*/
122
	*/
111
	private $carte_correspondance_couleurs = array();
123
	private $carte_correspondance_couleurs = array();
112
	
124
	
113
	/**
125
	/**
114
	* La valeur RVB, sous forme de chaine de nombres séparées par des tirets (-), de la zone géographique à mettre en
126
	* La valeur RVB, sous forme de chaine de nombres séparées par des tirets (-), de la zone géographique à mettre en
115
	* surbrillance.
127
	* surbrillance.
116
	* @var string la valeur RVB de la zone à repérer.
128
	* @var string la valeur RVB de la zone à repérer.
117
	*/
129
	*/
118
	private $zone_marker;
130
	private $zone_marker;
119
	
131
	
120
	/**
132
	/**
121
	* La formule de coloriage de la carte. Les formules disponibles sont : légende, proportionnel.
133
	* La formule de coloriage de la carte. Les formules disponibles sont : légende, proportionnel.
122
	* @var string la formule de coloriage.
134
	* @var string la formule de coloriage.
123
	*/
135
	*/
124
	private $formule_coloriage;
136
	private $formule_coloriage;
125
	
137
	
126
	/**
138
	/**
127
	* Les valeurs RVB séparés par des virgules pour la couleur la plus foncée utilisée, entre autre, par la formule de 
139
	* Les valeurs RVB séparés par des virgules pour la couleur la plus foncée utilisée, entre autre, par la formule de 
128
	* coloriage "proportionnel".
140
	* coloriage "proportionnel".
129
	* @var string les valeurs RVB séparées par des virgules.
141
	* @var string les valeurs RVB séparées par des virgules.
130
	*/
142
	*/
131
	private $coloriage_couleur_max;
143
	private $coloriage_couleur_max;
132
	
144
	
133
	/**
145
	/**
134
	* Les valeurs RVB séparés par des virgules pour la couleur la plus claire utilisée, entre autre, par la formule de 
146
	* Les valeurs RVB séparés par des virgules pour la couleur la plus claire utilisée, entre autre, par la formule de 
135
	* coloriage "proportionnel".
147
	* coloriage "proportionnel".
136
	* @var string les valeurs RVB séparées par des virgules.
148
	* @var string les valeurs RVB séparées par des virgules.
137
	*/
149
	*/
138
	private $coloriage_couleur_min;
150
	private $coloriage_couleur_min;
139
 
151
 
140
	/**
152
	/**
141
	* Contient le nombre de couleurs différentes utilisées par le coloriage pour créer l'image finale.
153
	* Contient le nombre de couleurs différentes utilisées par le coloriage pour créer l'image finale.
142
	* @var int le nombre de couleurs.
154
	* @var int le nombre de couleurs.
143
	*/
155
	*/
144
	private $coloriage_couleurs;
156
	private $coloriage_couleurs;
145
	
157
	
146
	/**
158
	/**
147
	* Contient le tableau des fréquences et des couleurs correspondantes.
159
	* Contient le tableau des fréquences et des couleurs correspondantes.
148
	* @var array les frequences et leurs couleurs.
160
	* @var array les frequences et leurs couleurs.
149
	*/
161
	*/
150
	private $coloriage_tableau_frequence = array();
162
	private $coloriage_tableau_frequence = array();
-
 
163
 
-
 
164
	/**
-
 
165
	* Permet de savoir si la cartographie est en mode déboguage ou pas.
-
 
166
	* @var bool true si on est en mode débug, sinon false.
-
 
167
	*/
-
 
168
	private $mode_debug;
151
 
169
	
152
	//+----------------------------------------------------------------------------------------------------------------+
170
	//+----------------------------------------------------------------------------------------------------------------+
153
	/*** Constructeur : ***/
171
	/*** Constructeur : ***/
154
	public function __construct($options = array()) {
172
	public function __construct($options = array()) {
155
		// Initialisation de l'objet Cartographie
173
		// Initialisation de l'objet Cartographie
156
		$this->setCarteNom(isset($options['carte_nom']) ? $options['carte_nom'] : '');
174
		$this->setCarteNom(isset($options['carte_nom']) ? $options['carte_nom'] : '');
157
		$this->setFormuleColoriage(isset($options['formule']) ? $options['formule'] : '');
175
		$this->setFormuleColoriage(isset($options['formule']) ? $options['formule'] : '');
-
 
176
		$this->setColoriageCouleurClaire(isset($options['couleur_claire']) ? $options['couleur_claire'] : '');
-
 
177
		$this->setColoriageCouleurFoncee(isset($options['couleur_foncee']) ? $options['couleur_foncee'] : '');
158
		$this->setCarteFondFichier(isset($options['fond_fichier']) ? $options['fond_fichier'] : '');
178
		$this->setCarteFondFichier(isset($options['fond_fichier']) ? $options['fond_fichier'] : '');
159
		$this->setCarteFondDossier(isset($options['fond_dossier']) ? $options['fond_dossier'] : '');
179
		$this->setCarteFondDossier(isset($options['fond_dossier']) ? $options['fond_dossier'] : '');
160
		$this->setCarteStockageDossier(isset($options['stock_dossier']) ? $options['stock_dossier'] : '');
180
		$this->setCarteStockageDossier(isset($options['stock_dossier']) ? $options['stock_dossier'] : '');
-
 
181
		$this->setCarteStockageUrl(isset($options['stock_url']) ? $options['stock_url'] : '');
161
		$this->setCarteZoneInfo(isset($options['infos']) ? $options['infos'] : array());
182
		$this->setCarteZones(isset($options['zones']) ? $options['zones'] : null);
162
		$this->setZoneMarker(isset($options['zone_marker']) ? $options['zone_marker'] : '');
183
		$this->setZoneMarker(isset($options['zone_marker']) ? $options['zone_marker'] : '');
-
 
184
		$this->setModeDebug(isset($options['debug']) ? $options['debug'] : false);
163
	}
185
	}
164
 
186
 
165
	//+----------------------------------------------------------------------------------------------------------------+
187
	//+----------------------------------------------------------------------------------------------------------------+
166
	/*** Accesseur : ***/
188
	/*** Accesseur : ***/
167
	public function getTableauFrequence() {
189
	public function getTableauFrequence() {
168
		ksort($this->coloriage_tableau_frequence);
190
		ksort($this->coloriage_tableau_frequence);
169
		return $this->coloriage_tableau_frequence;
191
		return $this->coloriage_tableau_frequence;
170
	}
192
	}
171
	
193
	
172
	public function getCarteCache() {
194
	public function getCarteCache() {
173
		// Gestion du cache
195
		// Gestion du cache
174
		if ($this->getCarteNom() != '') {
196
		if ($this->getCarteNom() != '') {
175
			$fichier_carte = $this->carte_stockage_dossier.$this->getCarteNom().'.png';
197
			$fichier_carte = $this->carte_stockage_dossier.$this->getCarteNom().'.png';
176
			if (file_exists($fichier_carte)) {
198
			if (file_exists($fichier_carte)) {
177
				//echo filemtime($fichier_carte).'-'.strtotime($this->carte_info['donnees_date_maj']);
199
				//echo filemtime($fichier_carte).'-'.strtotime($this->carte_info['donnees_date_maj']);
178
				if (filemtime($fichier_carte) < strtotime($this->carte_info['donnees_date_maj'])) {
200
				if (filemtime($fichier_carte) < strtotime($this->carte_info['donnees_date_maj'])) {
179
					$this->carte_cache = false;
201
					$this->carte_cache = false;
180
				} else {
202
				} else {
181
					$this->carte_cache = true;
203
					$this->carte_cache = true;
182
				}
204
				}
183
			}
205
			}
184
		}
206
		}
185
		return $this->carte_cache;
207
		return $this->carte_cache;
186
	}
208
	}
187
	
209
	
188
	public function getCarteInfo() {
210
	public function getCarteInfo() {
189
		return $this->carte_info;
211
		return $this->carte_info;
190
	}
212
	}
191
	public function setCarteInfo($ci) {
213
	public function setCarteInfo($ci) {
192
		$this->carte_info = $ci;
214
		$this->carte_info = $ci;
193
	}
215
	}
194
	
216
	
195
	public function getColoriageCouleurClaire() {
217
	public function getColoriageCouleurClaire() {
196
		return $this->coloriage_couleur_min;
218
		return $this->coloriage_couleur_min;
197
	}
219
	}
198
	public function setColoriageCouleurClaire($ccmi) {
220
	public function setColoriageCouleurClaire($ccmi) {
199
		$this->coloriage_couleur_min = $ccmi;
221
		$this->coloriage_couleur_min = $ccmi;
200
	}
222
	}
201
	
223
	
202
	public function getColoriageCouleurFoncee() {
224
	public function getColoriageCouleurFoncee() {
203
		return $this->coloriage_couleur_max;
225
		return $this->coloriage_couleur_max;
204
	}
226
	}
205
	public function setColoriageCouleurFoncee($ccma) {
227
	public function setColoriageCouleurFoncee($ccma) {
206
		$this->coloriage_couleur_max = $ccma;
228
		$this->coloriage_couleur_max = $ccma;
207
	}
229
	}
208
	
230
	
209
	public function getFormuleColoriage() {
231
	public function getFormuleColoriage() {
210
		return $this->formule_coloriage;
232
		return $this->formule_coloriage;
211
	}
233
	}
212
	public function setFormuleColoriage($fc) {
234
	public function setFormuleColoriage($fc) {
213
		$this->formule_coloriage = $fc;
235
		$this->formule_coloriage = $fc;
214
	}
236
	}
215
	
237
	
216
	public function getCarteNom() {
238
	public function getCarteNom() {
217
		return $this->carte_nom;
239
		return $this->carte_nom;
218
	}
240
	}
219
	public function setCarteNom($cn) {
241
	public function setCarteNom($cn) {
220
		$this->carte_nom = $cn;
242
		$this->carte_nom = $cn;
221
	}
243
	}
222
	
244
	
223
	public function getCarteFichier() {
245
	public function getCarteFichier() {
224
		return $this->carte_fichier;
246
		return $this->carte_fichier;
225
	}
247
	}
226
	public function setCarteFichier($cf) {
248
	public function setCarteFichier($cf) {
227
		$this->carte_fichier = $cf;
249
		$this->carte_fichier = $cf;
228
	}
250
	}
229
	
251
	
230
	public function getCarteFondFichier() {
252
	public function getCarteFondFichier() {
231
		return $this->carte_fond_fichier;
253
		return $this->carte_fond_fichier;
232
	}
254
	}
233
	public function setCarteFondFichier($cff) {
255
	public function setCarteFondFichier($cff) {
234
		$this->carte_fond_fichier = $cff;
256
		$this->carte_fond_fichier = $cff;
235
	}
257
	}
236
	
258
	
237
	public function getCarteFondDossier() {
259
	public function getCarteFondDossier() {
238
		return $this->carte_fond_dossier;
260
		return $this->carte_fond_dossier;
239
	}
261
	}
240
	public function setCarteFondDossier($cfd) {
262
	public function setCarteFondDossier($cfd) {
241
		$this->carte_fond_dossier = $cfd;
263
		$this->carte_fond_dossier = $cfd;
242
	}
264
	}
243
	
265
	
244
	public function getCarteStockageDossier() {
266
	public function getCarteStockageDossier() {
245
		return $this->carte_stockage_dossier;
267
		return $this->carte_stockage_dossier;
246
	}
268
	}
247
	public function setCarteStockageDossier($csd) {
269
	public function setCarteStockageDossier($csd) {
248
		$this->carte_stockage_dossier = $csd;
270
		$this->carte_stockage_dossier = $csd;
249
	}
271
	}
-
 
272
	
-
 
273
	public function getCarteStockageUrl() {
-
 
274
		return $this->carte_stockage_url;
-
 
275
	}
-
 
276
	public function setCarteStockageUrl($csu) {
-
 
277
		$this->carte_stockage_url = $csu;
-
 
278
	}
250
	
279
	
-
 
280
	public function getCarteZones() {
-
 
281
		if (is_null($this->carte_zones)) {
-
 
282
			$this->chargerZones();
251
	public function getCarteZoneInfo() {
283
		}
252
		return $this->carte_zone_info;
284
		return $this->carte_zones;
253
	}
285
	}
254
	public function setCarteZoneInfo($czi) {
286
	public function setCarteZones($cz) {
255
		$this->carte_zone_info = $czi;
287
		$this->carte_zones = $cz;
256
	}
288
	}
257
	
289
	
258
	public function getZoneMarker() {
290
	public function getZoneMarker() {
259
		return $this->zone_marker;
291
		return $this->zone_marker;
260
	}
292
	}
261
	public function setZoneMarker($zm) {
293
	public function setZoneMarker($zm) {
262
		$this->zone_marker = $zm;
294
		$this->zone_marker = $zm;
263
	}
295
	}
-
 
296
	
-
 
297
	public function getModeDebug() {
-
 
298
		return $this->mode_debug;
-
 
299
	}
-
 
300
	public function setModeDebug($md) {
-
 
301
		$this->mode_debug = $md;
-
 
302
	}
264
 
303
 
265
	//+----------------------------------------------------------------------------------------------------------------+
304
	//+----------------------------------------------------------------------------------------------------------------+
266
	/*** Méthodes PUBLIQUES : ***/
305
	/*** Méthodes PUBLIQUES : ***/
267
	
306
	
268
	public function creerCarte() {
307
	public function creerCarte() {
269
		// Création de la carte car aucun cache ou cache à vider
308
		// Création de la carte car aucun cache ou cache à vider
270
		$carte_fond_fichier = $this->carte_fond_dossier.$this->getCarteFondFichier().'.png';
309
		$carte_fond_fichier = $this->carte_fond_dossier.$this->getCarteFondFichier().'.png';
271
		$this->carte = imagecreatefrompng($carte_fond_fichier);
310
		$this->carte = imagecreatefrompng($carte_fond_fichier);
272
		// Vérification que la création à fonctionnée
311
		// Vérification que la création à fonctionnée
273
		if (!$this->carte) { 
312
		if (!$this->carte) { 
274
			// Une erreur est survenue : création d'une image blanche
313
			// Une erreur est survenue : création d'une image blanche
275
			$this->carte = imagecreatetruecolor(520, 60);
314
			$this->carte = imagecreatetruecolor(520, 60);
276
			$bgc = imagecolorallocate($this->carte, 255, 255, 255);
315
			$bgc = imagecolorallocate($this->carte, 255, 255, 255);
277
			$tc  = imagecolorallocate($this->carte, 0, 0, 0);
316
			$tc  = imagecolorallocate($this->carte, 0, 0, 0);
278
			imagefilledrectangle($this->carte, 0, 0, 520, 60, $bgc);
317
			imagefilledrectangle($this->carte, 0, 0, 520, 60, $bgc);
279
			// Affichage d'un message d'erreur
318
			// Affichage d'un message d'erreur
280
			imagestring($this->carte, 1, 5, 5, "Erreur de chargement de l'image :", $tc);
319
			imagestring($this->carte, 1, 5, 5, "Erreur de chargement de l'image :", $tc);
281
			imagestring($this->carte, 1, 5, 15, $carte_fond_fichier, $tc);
320
			imagestring($this->carte, 1, 5, 15, $carte_fond_fichier, $tc);
282
		} else {
321
		} else {
283
			// Nous construison le tableau de correspondance entre les couleurs présente sur l'image de fond
322
			// Nous construison le tableau de correspondance entre les couleurs présente sur l'image de fond
284
			// et les couleurs qui doivent les remplacer.
323
			// et les couleurs qui doivent les remplacer.
285
			$this->construireCorrespondanceCouleur();
324
			$this->construireCorrespondanceCouleur();
286
			
325
			
287
			// Nous lançons la création de la carte
326
			// Nous lançons la création de la carte
288
			$this->colorierCarte();
327
			$this->colorierCarte();
289
		}
328
		}
290
 
329
 
291
		// Nous chercons à créer une image indéxées en sortie
330
		// Nous chercons à créer une image indéxées en sortie
292
		if (imageistruecolor(&$this->carte) && $this->formule_coloriage != 'legende') {
331
		if (imageistruecolor(&$this->carte) && $this->formule_coloriage != 'legende') {
293
			if ($this->coloriage_couleurs <= 253) {
332
			if ($this->coloriage_couleurs <= 253) {
294
				//imagetruecolortopalette(&$this->carte, false, ($this->coloriage_couleurs + 2));// + 2 car noir et blanc réservés.
333
				//imagetruecolortopalette(&$this->carte, false, ($this->coloriage_couleurs + 2));// + 2 car noir et blanc réservés.
295
			} else {
334
			} else {
296
				// On force la création d'une palette... si cela pose problème ajouter un attribut permettant de désactiver 
335
				// On force la création d'une palette... si cela pose problème ajouter un attribut permettant de désactiver 
297
				// ce fonctionnement.
336
				// ce fonctionnement.
298
				imagetruecolortopalette(&$this->carte, false, 255);
337
				imagetruecolortopalette(&$this->carte, false, 255);
299
			}
338
			}
300
		}
339
		}
301
		
340
		
302
		// Nous écrivons le fichier de la carte.
341
		// Nous écrivons le fichier de la carte.
303
		if ($this->getCarteNom() == '') {
342
		if ($this->getCarteNom() == '') {
304
			$this->setCarteNom(md5($this->carte));
343
			$this->setCarteNom(md5($this->carte));
305
		}
344
		}
306
		
345
		
307
		$this->setCarteFichier($this->carte_stockage_dossier.$this->getCarteNom().'.png');
346
		$this->setCarteFichier($this->carte_stockage_dossier.$this->getCarteNom().'.png');
308
		imagepng(&$this->carte, $this->getCarteFichier());
347
		imagepng(&$this->carte, $this->getCarteFichier());
309
		return true;
348
		return true;
310
	}
349
	}
311
	
350
	
312
	public function getImageMap() {
351
	public function getImageMap() {
313
		// Initialisation de variables
352
		// Initialisation de variables
314
		$carte_map = '';
353
		$carte_map = '';
315
		
354
		
316
		// Gestion de l'image map
355
		// Gestion de l'image map
317
		$chemin_carte_map_fond = $this->getCarteFondDossier().$this->getCarteNom().'.tpl.html';
356
		$chemin_carte_map_fond = $this->getCarteFondDossier().$this->getCarteFondFichier().'.tpl.html';
318
		$chemin_carte_map = $this->getCarteStockageDossier().$this->getCarteNom().'.html';
357
		$chemin_carte_map = $this->getCarteStockageDossier().$this->getCarteNom().'.html';
-
 
358
		
319
		if (file_exists($chemin_carte_map)) {
359
		if (file_exists($chemin_carte_map)) {
320
			$carte_map = file_get_contents($chemin_carte_map);
360
			$carte_map = file_get_contents($chemin_carte_map);
321
		} else {
361
		} else {
-
 
362
			$nom_carte_png = $this->getCarteNom().'.png';
-
 
363
			$chemin_carte_png = $this->getCarteStockageDossier().$nom_carte_png;
-
 
364
			$donnees['carte_url'] = sprintf($this->getCarteStockageUrl(), $nom_carte_png);
-
 
365
			$donnees['carte_alt'] = 'info';
322
			$donnees['zones'] = $this->getCarteInfo();
366
			$donnees['zones'] = $this->getCarteZones();
-
 
367
			//Debug::printr($donnees);
323
			$carte_map = SquelettePhp::analyser($chemin_carte_map_fond, $donnees);
368
			$carte_map = SquelettePhp::analyser($chemin_carte_map_fond, $donnees);
324
			if (!file_put_contents($chemin_carte_map, $carte_map)) {
369
			if (!file_put_contents($chemin_carte_map, $carte_map)) {
325
				$e = "Écriture du fichier contenant le html de la carte impossible : $chemin_carte_map";
370
				$e = "Écriture du fichier contenant le html de la carte impossible : $chemin_carte_map";
326
				trigger_error($e, E_USER_WARNING);
371
				trigger_error($e, E_USER_WARNING);
327
			}
372
			}
328
		}
373
		}
329
		
374
		
330
		return $carte_map;
375
		return $carte_map;
331
	}
376
	}
-
 
377
	
332
	
378
	//+----------------------------------------------------------------------------------------------------------------+	
-
 
379
	/*** Méthodes PRIVÉES : ***/
-
 
380
	
-
 
381
	/**
-
 
382
	 * Charge en mémoire les données du fichier csv des zones géographique de la carte
-
 
383
	 */
-
 
384
	private function chargerZones() {
-
 
385
		$fichier_csv = $this->getCarteFondDossier().$this->getCarteFondFichier().'.csv';
-
 
386
		$zones = array();
-
 
387
		if (($handle = fopen($fichier_csv, 'r')) !== false) {
-
 
388
			$ligne = 1;
-
 
389
			$cles = array();
-
 
390
			while (($donnees = fgetcsv($handle, 1000, ',')) !== false) {
-
 
391
				$cle = array_shift($donnees);
-
 
392
				if ($ligne == 1) {
-
 
393
					// Ligne 1 : les noms des champs
-
 
394
					$cles = $donnees;
-
 
395
					
-
 
396
				} else {
-
 
397
					// Ligne > 1 : traitements des données
-
 
398
					$zones[$cle] = array_combine($cles, $donnees);
-
 
399
				}
-
 
400
				$ligne++;
-
 
401
			}
-
 
402
			fclose($handle);
-
 
403
		}
-
 
404
		$this->setCarteZones($zones);
-
 
405
	}
333
	/*** Méthodes PRIVÉES : ***/
406
	
334
	private function construireCorrespondanceCouleur() {
407
	private function construireCorrespondanceCouleur() {
335
		switch ($this->formule_coloriage) {
408
		switch ($this->formule_coloriage) {
336
			case self::FORMULE_LEGENDE :
409
			case self::FORMULE_LEGENDE :
337
				$this->construireCorrespondanceCouleurLegende();
410
				$this->construireCorrespondanceCouleurLegende();
338
				break;
411
				break;
339
			case self::FORMULE_PROPORTIONNEL :
412
			case self::FORMULE_PROPORTIONNEL :
340
				$this->construireCorrespondanceCouleurProportionnel();
413
				$this->construireCorrespondanceCouleurProportionnel();
341
				break;
414
				break;
342
			default :
415
			default :
343
				$e = 	"Aucune formule de coloriage n'a été définie parmis : ".
416
				$e = 	"Aucune formule de coloriage n'a été définie parmis : ".
344
						self::FORMULE_LEGENDE.' et '.self::FORMULE_PROPORTIONNEL.'. '.
417
						self::FORMULE_LEGENDE.' et '.self::FORMULE_PROPORTIONNEL.'. '.
345
						"Veuillez la définir avec la méthode setFormuleColoriage().";
418
						"Veuillez la définir avec la méthode setFormuleColoriage().";
346
				trigger_error($e, E_USER_ERROR);
419
				trigger_error($e, E_USER_ERROR);
347
		}
420
		}
348
	}
421
	}
349
	
422
	
350
	private function construireCorrespondanceCouleurProportionnel() {
423
	private function construireCorrespondanceCouleurProportionnel() {
351
		// Création d'un tableau contenant seulement les nombres d'information pour chaque zone.
424
		// Création d'un tableau contenant seulement les nombres d'information pour chaque zone.
352
		$tab_valeurs = array();
425
		$tab_valeurs = array();
353
		foreach ($this->carte_zone_info as $cle => $valeur) {
426
		foreach ($this->getCarteZones() as $cle => $valeur) {
354
			//Nous recherchons le minimum, le maximum et le la valeur médium juste au dessous du maximum.
427
			//Nous recherchons le minimum, le maximum et le la valeur médium juste au dessous du maximum.
355
			if (isset($valeur['info_nombre'])) {
428
			if (isset($valeur['info_nombre'])) {
356
				$tab_valeurs[] = $valeur['info_nombre'];
429
				$tab_valeurs[] = $valeur['info_nombre'];
357
				if ($valeur['info_nombre'] == 0){
430
				if ($valeur['info_nombre'] == 0){
358
					//trigger_error($valeur['nom'], E_USER_NOTICE);
431
					//trigger_error($valeur['nom'], E_USER_NOTICE);
359
				}
432
				}
360
			}
433
			}
361
		}
434
		}
362
		
435
		
363
		//Nombre d'entrées dans le tableau de valeurs non nulles :
436
		//Nombre d'entrées dans le tableau de valeurs non nulles :
364
		$valeurs_nbre = count($tab_valeurs);
437
		$valeurs_nbre = count($tab_valeurs);
365
		$valeurs_somme = array_sum($tab_valeurs);
438
		$valeurs_somme = array_sum($tab_valeurs);
366
		// Tabeau des fréquences trié de la plus petite à la plus grande clé.
439
		// Tabeau des fréquences trié de la plus petite à la plus grande clé.
367
		$tab_frequences = array_count_values($tab_valeurs);
440
		$tab_frequences = array_count_values($tab_valeurs);
368
		krsort($tab_frequences);
441
		krsort($tab_frequences);
369
		//trigger_error(print_r($tab_frequences, true), E_USER_NOTICE);
442
		//trigger_error(print_r($tab_frequences, true), E_USER_NOTICE);
370
		$frequences_nbre = count($tab_frequences);
443
		$frequences_nbre = count($tab_frequences);
371
		if ($valeurs_nbre > 0){
444
		if ($valeurs_nbre > 0){
372
			// Nous trions le tableau dans l'ordre croissant :
445
			// Nous trions le tableau dans l'ordre croissant :
373
			sort($tab_valeurs);
446
			sort($tab_valeurs);
374
			// Nous récupérons la valeur la plus petite :
447
			// Nous récupérons la valeur la plus petite :
375
			$mini = $tab_valeurs[0];
448
			$mini = $tab_valeurs[0];
376
			$maxi = $tab_valeurs[$valeurs_nbre - 1];
449
			$maxi = $tab_valeurs[$valeurs_nbre - 1];
377
			$medium = isset($tab_valeurs[$valeurs_nbre - 2]) ? $tab_valeurs[$valeurs_nbre - 2] : 0;
450
			$medium = isset($tab_valeurs[$valeurs_nbre - 2]) ? $tab_valeurs[$valeurs_nbre - 2] : 0;
378
			$moyenne = $valeurs_somme / $valeurs_nbre;
451
			$moyenne = $valeurs_somme / $valeurs_nbre;
379
			$ecart_au_carre_moyen = 0;
452
			$ecart_au_carre_moyen = 0;
380
			for ($i = 0; $i < $valeurs_nbre; $i++) {
453
			for ($i = 0; $i < $valeurs_nbre; $i++) {
381
				$ecart_au_carre_moyen += pow(($tab_valeurs[$i] - $moyenne), 2);
454
				$ecart_au_carre_moyen += pow(($tab_valeurs[$i] - $moyenne), 2);
382
			}
455
			}
383
			$variance = $ecart_au_carre_moyen / $valeurs_nbre;
456
			$variance = $ecart_au_carre_moyen / $valeurs_nbre;
384
			$ecart_type = round(sqrt($variance), 0);
457
			$ecart_type = round(sqrt($variance), 0);
385
			$moyenne = round($moyenne, 0);
458
			$moyenne = round($moyenne, 0);
386
			$variance = round($variance, 0);
459
			$variance = round($variance, 0);
387
		}
460
		}
388
		
461
		
389
		// Calcul de l'écart moyen pour chaque élément R, V et B.		
462
		// Calcul de l'écart moyen pour chaque élément R, V et B.		
390
		list($r_min, $v_min, $b_min) = explode(',', $this->coloriage_couleur_max);
463
		list($r_min, $v_min, $b_min) = explode(',', $this->coloriage_couleur_max);
391
		list($r_max, $v_max, $b_max) = explode(',', $this->coloriage_couleur_min);
464
		list($r_max, $v_max, $b_max) = explode(',', $this->coloriage_couleur_min);
392
		$r_diff = $r_min - $r_max;
465
		$r_diff = $r_min - $r_max;
393
		$r_ecart_moyen = abs($r_diff / $frequences_nbre);
466
		$r_ecart_moyen = abs($r_diff / $frequences_nbre);
394
		
467
		
395
		$v_diff = $v_min - $v_max;
468
		$v_diff = $v_min - $v_max;
396
		$v_ecart_moyen = abs($v_diff / $frequences_nbre);
469
		$v_ecart_moyen = abs($v_diff / $frequences_nbre);
397
		
470
		
398
		$b_diff = $b_min - $b_max;
471
		$b_diff = $b_min - $b_max;
399
		$b_ecart_moyen = abs($b_diff / $frequences_nbre);
472
		$b_ecart_moyen = abs($b_diff / $frequences_nbre);
400
		
473
		
401
		// Pour chaque fréquence nous attribuons une couleur.
474
		// Pour chaque fréquence nous attribuons une couleur.
402
		$i = 1;
475
		$i = 1;
403
		foreach ($tab_frequences as $cle => $valeur){
476
		foreach ($tab_frequences as $cle => $valeur){
404
			if ($cle == 0) {
477
			if ($cle == 0) {
405
				$this->coloriage_tableau_frequence[$cle] = '255-255-255';
478
				$this->coloriage_tableau_frequence[$cle] = '255-255-255';
406
			} else {
479
			} else {
407
				$r = $r_min + round(($i * $r_ecart_moyen), 0);
480
				$r = $r_min + round(($i * $r_ecart_moyen), 0);
408
				
481
				
409
				$v = $v_min + round(($i * $v_ecart_moyen), 0);
482
				$v = $v_min + round(($i * $v_ecart_moyen), 0);
410
				$b = $b_min + round(($i * $b_ecart_moyen), 0);
483
				$b = $b_min + round(($i * $b_ecart_moyen), 0);
411
				$this->coloriage_tableau_frequence[$cle] = $r.'-'.$v.'-'.$b;
484
				$this->coloriage_tableau_frequence[$cle] = $r.'-'.$v.'-'.$b;
412
			}
485
			}
413
			$i++;
486
			$i++;
414
		}
487
		}
415
		
488
		
416
		// Attribution du nombre de couleurs utilisé pour réaliser la carte
489
		// Attribution du nombre de couleurs utilisé pour réaliser la carte
417
		$this->coloriage_couleurs = count(array_count_values($this->coloriage_tableau_frequence));
490
		$this->coloriage_couleurs = count(array_count_values($this->coloriage_tableau_frequence));
418
		//trigger_error('<pre>'.print_r($this->coloriage_couleurs, true).'</pre>', E_USER_ERROR);
491
		//trigger_error('<pre>'.print_r($this->coloriage_couleurs, true).'</pre>', E_USER_ERROR);
419
		
492
		
420
		// Nous attribuons les couleurs à chaque zone géographique
493
		// Nous attribuons les couleurs à chaque zone géographique
421
		foreach ($this->carte_zone_info as $cle => $zg) {
494
		foreach ($this->getCarteZones() as $cle => $zg) {
422
			if (isset($this->coloriage_tableau_frequence[$zg['info_nombre']])) {
495
			if (isset($this->coloriage_tableau_frequence[$zg['info_nombre']])) {
423
				$this->carte_correspondance_couleurs[$zg['rvb_fond']] = $this->coloriage_tableau_frequence[$zg['info_nombre']];
496
				$this->carte_correspondance_couleurs[$zg['rvb_fond']] = $this->coloriage_tableau_frequence[$zg['info_nombre']];
424
			} else {
497
			} else {
425
				$e = "La zone ".$zg['nom']." (".$zg['rvb_fond'].") ne possède pas de couleur RVB pour la remplir. ".
-
 
426
					 "La valeur 128-128-128 lui a été attribué.";
-
 
427
				trigger_error($e, E_USER_WARNING);
-
 
428
				$this->carte_correspondance_couleurs[$zg['rvb_fond']] = '128-128-128';
498
				$this->carte_correspondance_couleurs[$zg['rvb_fond']] = '128-128-128';
-
 
499
				if ($this->getModeDebug()) {
-
 
500
					$e = "La zone ".$zg['nom']." (".$zg['rvb_fond'].") ne possède pas de couleur RVB pour la remplir. ".
-
 
501
					 "La valeur 128-128-128 lui a été attribué.";
-
 
502
					trigger_error($e, E_USER_WARNING);
-
 
503
				}
429
			}
504
			}
430
		}
505
		}
431
	}
506
	}
432
	
507
	
433
	private function construireCorrespondanceCouleurLegende() {
508
	private function construireCorrespondanceCouleurLegende() {
434
		$tab_couleurs = array();
509
		$tab_couleurs = array();
435
		foreach ($this->carte_zone_info as $cle => $zg) {
510
		foreach ($this->getCarteZones() as $cle => $zg) {
436
			if ($zg['rvb_carte'] != '') {
511
			if ($zg['rvb_carte'] != '') {
437
				$this->carte_correspondance_couleurs[$zg['rvb_fond']] = $zg['rvb_carte'];
512
				$this->carte_correspondance_couleurs[$zg['rvb_fond']] = $zg['rvb_carte'];
438
			} else {
513
			} else {
439
				$e = "La zone ".$zg['nom']." (".$zg['rvb_fond'].") ne possède pas d'information pour la légende dans le champ".
-
 
440
					 " rvb_carte. La valeur 128-128-128 lui a été attribué.";
-
 
441
				trigger_error($e, E_USER_WARNING);
-
 
442
				$this->carte_correspondance_couleurs[$zg['rvb_fond']] = '128-128-128';
514
				$this->carte_correspondance_couleurs[$zg['rvb_fond']] = '128-128-128';
-
 
515
				if ($this->getModeDebug()) {
-
 
516
					$e = "La zone ".$zg['nom']." (".$zg['rvb_fond'].") ne possède pas d'information pour la légende dans le champ".
-
 
517
					 " rvb_carte. La valeur 128-128-128 lui a été attribué.";
-
 
518
					trigger_error($e, E_USER_WARNING);
-
 
519
				}
443
			}
520
			}
444
			if (!isset($tab_couleurs[$this->carte_correspondance_couleurs[$zg['rvb_fond']]])) {
521
			if (!isset($tab_couleurs[$this->carte_correspondance_couleurs[$zg['rvb_fond']]])) {
445
				$tab_couleurs[$this->carte_correspondance_couleurs[$zg['rvb_fond']]] = 1;
522
				$tab_couleurs[$this->carte_correspondance_couleurs[$zg['rvb_fond']]] = 1;
446
			}
523
			}
447
		}
524
		}
448
		// Attribution du nombre de couleurs utilisé pour réaliser la carte
525
		// Attribution du nombre de couleurs utilisé pour réaliser la carte
449
		$this->coloriage_couleurs = count($tab_couleurs);
526
		$this->coloriage_couleurs = count($tab_couleurs);
450
	}
527
	}
451
	
528
	
452
	private function colorierCarte() {
529
	private function colorierCarte() {
453
		if (imageistruecolor(&$this->carte)) {
530
		if (imageistruecolor(&$this->carte)) {
454
			//+--------------------------------------------------------------------------------------------------------+
531
			//+--------------------------------------------------------------------------------------------------------+
455
			// Remplacement des couleurs sur la carte en mode vraies couleurs (RGB)
532
			// Remplacement des couleurs sur la carte en mode vraies couleurs (RGB)
456
			
-
 
457
			// Nous commençons le rempalcement des couleurs sur la carte de fond.  
-
 
458
			$hauteur = imagesy(&$this->carte);
533
			$this->colorierCarteModeVraiCouleur();
459
			$largeur = imagesx(&$this->carte);
-
 
460
			
-
 
461
			// Tableau contenant les couleurs traitées, pour éviter de traiter plusieurs fois la même couleur			
-
 
462
			$tab_rvb_ok = array();
-
 
463
			for ($x = 0; $x < $largeur; $x++) {
-
 
464
				for ($y = 0; $y < $hauteur; $y++) {
-
 
465
					$rvb = ImageColorAt(&$this->carte, $x, $y);
-
 
466
					if (!isset($tab_rvb_ok[$rvb])) {
-
 
467
		   				// Récupération de la couleur rvb au format xxx-xxx-xxx
-
 
468
		   				$cle = (($rvb >> 16) & 0xFF).'-'.(($rvb >> 8) & 0xFF).'-'.($rvb & 0xFF);
-
 
469
		   				// Si nous n'avons pas à faire à la couleur noire (utilisé pour délimité les zones), nous continuons
-
 
470
		   				if ($cle != '255-255-255') {
-
 
471
			   				$rvb_final = null;
-
 
472
			   				if (isset($this->carte_correspondance_couleurs[$cle])) {
-
 
473
			   					if ($this->zone_marker != '' && $cle == $this->zone_marker) {
-
 
474
									$rvb_final = '255'<<16 | '0'<<8 | '0';
-
 
475
								} else {
-
 
476
			   						list($rouge, $vert, $bleu) = explode('-', $this->carte_correspondance_couleurs[$cle]);
-
 
477
			   						$rvb_final = $rouge<<16 | $vert<<8 | $bleu;
-
 
478
			   					}
-
 
479
			   					// Si le nombre de couleurs sur la carte finale est infèrieur à 255 nous créons une image indexée
-
 
480
			   					imagefill(&$this->carte, $x, $y, $rvb_final);
-
 
481
			   				} else {		   					
-
 
482
			   					$rvb_final = '128'<<16 | '128'<<8 | '128';
-
 
483
			   					imagefill(&$this->carte, $x, $y, $rvb_final);
-
 
484
			   				}
-
 
485
		   					// Nous ajoutons la couleur ajoutée à la carte dans le tableau des couleurs traitées
-
 
486
		   					$tab_rvb_ok[$rvb_final] = true;
-
 
487
		   				}
-
 
488
		   				// Nous ajoutons la couleur trouvées sur la carte de fond dans le tableau des couleurs traitées
-
 
489
		   				$tab_rvb_ok[$rvb] = true;
-
 
490
					}
-
 
491
				}
-
 
492
			}
-
 
493
		} else {
534
		} else {
494
			//+--------------------------------------------------------------------------------------------------------+
535
			//+--------------------------------------------------------------------------------------------------------+
495
			// Remplacement des couleurs sur la carte en mode couleurs indexées (palette de couleurs)
536
			// Remplacement des couleurs sur la carte en mode couleurs indexées (palette de couleurs)
-
 
537
			$this->colorierCarteModeIndexe();
-
 
538
		}
-
 
539
	}
-
 
540
	
-
 
541
	private function colorierCarteModeVraiCouleur() {
-
 
542
		// Nous commençons le rempalcement des couleurs sur la carte de fond.  
-
 
543
		$hauteur = imagesy(&$this->carte);
-
 
544
		$largeur = imagesx(&$this->carte);
-
 
545
		
-
 
546
		// Tableau contenant les couleurs traitées, pour éviter de traiter plusieurs fois la même couleur			
-
 
547
		$tab_rvb_ok = array();
-
 
548
		for ($x = 0; $x < $largeur; $x++) {
-
 
549
			for ($y = 0; $y < $hauteur; $y++) {
-
 
550
				$rvb = ImageColorAt(&$this->carte, $x, $y);
-
 
551
				if (!isset($tab_rvb_ok[$rvb])) {
-
 
552
	   				// Récupération de la couleur rvb au format xxx-xxx-xxx
-
 
553
	   				$cle = (($rvb >> 16) & 0xFF).'-'.(($rvb >> 8) & 0xFF).'-'.($rvb & 0xFF);
-
 
554
	   				// Si nous n'avons pas à faire à la couleur noire (utilisé pour délimité les zones), nous continuons
-
 
555
	   				if ($cle != '255-255-255') {
-
 
556
		   				$rvb_final = null;
-
 
557
		   				if (isset($this->carte_correspondance_couleurs[$cle])) {
-
 
558
		   					if ($this->zone_marker != '' && $cle == $this->zone_marker) {
-
 
559
								$rvb_final = '255'<<16 | '0'<<8 | '0';
-
 
560
							} else {
-
 
561
		   						list($rouge, $vert, $bleu) = explode('-', $this->carte_correspondance_couleurs[$cle]);
-
 
562
		   						$rvb_final = $rouge<<16 | $vert<<8 | $bleu;
-
 
563
		   					}
-
 
564
		   					// Si le nombre de couleurs sur la carte finale est infèrieur à 255 nous créons une image indexée
-
 
565
		   					imagefill(&$this->carte, $x, $y, $rvb_final);
-
 
566
		   				} else {		   					
-
 
567
		   					$rvb_final = '128'<<16 | '128'<<8 | '128';
-
 
568
		   					imagefill(&$this->carte, $x, $y, $rvb_final);
-
 
569
		   				}
-
 
570
	   					// Nous ajoutons la couleur ajoutée à la carte dans le tableau des couleurs traitées
-
 
571
	   					$tab_rvb_ok[$rvb_final] = true;
-
 
572
	   				}
-
 
573
	   				// Nous ajoutons la couleur trouvées sur la carte de fond dans le tableau des couleurs traitées
-
 
574
	   				$tab_rvb_ok[$rvb] = true;
-
 
575
				}
-
 
576
			}
-
 
577
		}
-
 
578
	}
-
 
579
	
-
 
580
	private function colorierCarteModeIndexe() {
-
 
581
		// Nous attribuons à chaque zone présente dans le tableau $this->getCarteZones() la valeur de l'index 
-
 
582
		// de la couleur RVB représentant cette zone sur la carte de fond.
-
 
583
		$this->construireAssociationIndexZone();
496
 
-
 
497
			// Nous attribuons à chaque zone présente dans le tableau $this->carte_zone_info la valeur de l'index 
-
 
498
			// de la couleur RVB représentant cette zone sur la carte de fond.
-
 
499
			$this->construireAssociationIndexZone();
-
 
500
 
584
 
501
			foreach ($this->carte_zone_info as $zg) {
585
		foreach ($this->getCarteZones() as $zg) {
502
				if (isset($this->carte_correspondance_couleurs[$zg['rvb_fond']])) {
586
			if (isset($this->carte_correspondance_couleurs[$zg['rvb_fond']])) {
503
					//Dans le cas où nous voulons repérer une zone sur la carte :
587
				//Dans le cas où nous voulons repérer une zone sur la carte :
504
					if ($this->zone_marker != '' && $zg['rvb_fond'] == $this->zone_marker) {
588
				if ($this->getZoneMarker() != '' && $zg['rvb_fond'] == $this->getZoneMarker()) {
505
						$rouge = 255;
589
					$rouge = 255;
506
						$vert = 0;
590
					$vert = 0;
507
						$bleu = 0;
591
					$bleu = 0;
508
					} else {
592
				} else {
509
						list($rouge, $vert, $bleu) = explode('-', $this->carte_correspondance_couleurs[$zg['rvb_fond']]);
593
					list($rouge, $vert, $bleu) = explode('-', $this->carte_correspondance_couleurs[$zg['rvb_fond']]);
-
 
594
				}
510
					}
595
				if (isset($zg['index'])) {
-
 
596
					imagecolorset(&$this->carte, $zg['index'], $rouge, $vert, $bleu);
-
 
597
				} else if ($this->getModeDebug()) {
-
 
598
					$e = "La zone '{$zg['nom']}' n'est pas présente sur la carte.";
511
					imagecolorset(&$this->carte, $zg['index'], $rouge, $vert, $bleu);
599
					trigger_error($e, E_USER_WARNING);
512
				}				
600
				}
513
			}
601
			}				
514
		}
602
		}
515
	}
603
	}
516
	
604
	
517
	private function construireAssociationIndexZone() {
605
	private function construireAssociationIndexZone() {
518
		// Nous récupérons le nombre de couleur différentes contenues dans l'image.
606
		// Nous récupérons le nombre de couleur différentes contenues dans l'image.
519
		$taille_palette = imagecolorstotal($this->carte);
607
		$taille_palette = imagecolorstotal($this->carte);
520
		//print_r($this->carte_zone_info);
-
 
521
		// Pour chaque couleur contenue dans l'image, nous cherchons l'objet correspondant
608
		// Pour chaque couleur contenue dans l'image, nous cherchons l'objet correspondant
522
		// dans le tableau $this->carte_zone_info, qui contient des informations sur chaque zone de l'image,
609
		// dans le tableau $this->getCarteZones(), qui contient des informations sur chaque zone de l'image,
523
		// et nous attribuons la valeur de l'index de sa couleur sur la carte de fond.
610
		// et nous attribuons la valeur de l'index de sa couleur sur la carte de fond.
524
		for ($i = 0; $i < $taille_palette; $i++) {
611
		for ($i = 0; $i < $taille_palette; $i++) {
525
			$rvb = array();
612
			$rvb = array();
526
			$rvb = imagecolorsforindex($this->carte, $i);
613
			$rvb = imagecolorsforindex($this->carte, $i);
527
			$rvb_cle = $rvb['red'].'-'.$rvb['green'].'-'.$rvb['blue'];
614
			$rvb_cle = $rvb['red'].'-'.$rvb['green'].'-'.$rvb['blue'];
528
			// La couleur ne doit pas correspondre au noir ou au blanc car ces couleurs ne sont pas traitées
615
			// La couleur ne doit pas correspondre au noir ou au blanc car ces couleurs ne sont pas traitées
529
			if ($rvb_cle != '255-255-255' && $rvb_cle != '0-0-0') {
616
			if ($rvb_cle != '255-255-255' && $rvb_cle != '0-0-0') {
530
				$index_ok = false;
617
				$index_ok = false;
531
				foreach($this->carte_zone_info as $cle => $zg) {
618
				foreach($this->getCarteZones() as $cle => $zg) {
532
					if (isset($zg['rvb_fond']) && $zg['rvb_fond'] == $rvb_cle) {
619
					if (isset($zg['rvb_fond']) && $zg['rvb_fond'] == $rvb_cle) {
533
						$this->carte_zone_info[$cle]['index'] = $i;
620
						$this->carte_zones[$cle]['index'] = $i;
534
						$index_ok = true;
621
						$index_ok = true;
535
						//print_r($this->carte_zone_info[$cle]);
-
 
536
						break;
622
						break;
537
					}
623
					}
538
				}
624
				}
539
				if (!$index_ok && $rvb_cle != '0-0-0') {
625
				if (!$index_ok && $rvb_cle != '0-0-0' && $this->getModeDebug()) {
540
					$e = "Aucune zone trouvée pour l'index $i : $rvb_cle";
626
					$e = "Aucune information n'est fournie pour la zone sur la carte d'index $i : $rvb_cle";
541
					trigger_error($e, E_USER_WARNING);
627
					trigger_error($e, E_USER_WARNING);
542
					$this->carte_zone_info[] = array('rvb_fond' => $rvb_cle, 'rvb_carte' => '128-128-128', 'index' => $i);
628
					//$this->carte_zones[] = array('rvb_fond' => $rvb_cle, 'rvb_carte' => '128-128-128', 'index' => $i);
543
				}
629
				}
544
			}
630
			}
545
		}
631
		}
546
	}
632
	}
547
	
633
	
548
}
634
}
549
?>
635
?>