Subversion Repositories eFlore/Applications.cel

Rev

Rev 560 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
416 aurelien 1
<?php
2
/**
3
 * Service fournissant des urls vers des images de graphiques sur les statistiques de l'application CEL.
4
 * Encodage en entrée : utf8
5
 * Encodage en sortie : utf8
6
 *
7
 * Cas d'utilisation :
8
 * /CelStatistique/TypeDeGraph : retourne le graphique demandé
9
 * /CelStatistique/TypeDeGraph/1 : retourne le graphique demandé sur le serveur 1 (voir http://code.google.com/intl/fr/apis/chart/docs/making_charts.html#enhancements)
10
 *
11
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
13
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
14
 * @version $Id$
15
 * @copyright 2009
16
 */
17
class CelStatistique extends Cel {
18
 
19
	/**
20
	 * Méthode appelée avec une requête de type GET.
21
	 */
22
	public function getElement($param) {
23
		$graph = null;
24
		$serveur = '';
25
 
26
		if (isset($param[0])) {
27
			$graph_demande = array_shift($param);
28
			$methode = 'get'.$graph_demande;
29
			if (method_exists($this, $methode)) {
30
				$serveur = isset($param[1]) ? array_shift($param).'.' : '';
31
				$graph = $this->$methode($param);
32
			} else {
33
				$this->messages[] = "Ce type de graphique '$graph_demande' n'est pas disponible.";
34
			}
35
		} else {
36
			$this->messages[] = "Le premier paramêtre du service CEL Statistique doit correspondre au type de graphique.";
37
		}
38
 
39
		if (!is_null($graph)) {
40
			$url = "http://{$serveur}chart.apis.google.com/chart";
41
			$contexte = stream_context_create(
42
				array('http' => array(
43
      				'method' => 'POST',
44
      				'content' => http_build_query($graph))));
45
			$image = file_get_contents($url, false, $contexte);
46
			$this->envoyer($image, 'image/png', null, false);
47
		} else {
48
			$info = 'Un problème est survenu : '.print_r($this->messages, true);
49
			$this->envoyer($info);
50
		}
51
	}
52
 
53
	private function getEvolImgLieesParMois($param) {
54
		// Récupération des données
55
 
56
		$requete = 	"SELECT DATE_FORMAT(ci_meta_date_ajout, '%Y%m') AS periode, COUNT(ci_id_image) AS nbre ".
57
			"FROM cel_obs_images LEFT JOIN cel_images ON (coi_ce_image = ci_id_image) ".
58
			"WHERE ci_meta_date_ajout != '0000-00-00 00:00:00' ".
59
			'GROUP BY periode '.
60
			'ORDER BY periode ';
61
		$resulats = $this->executerRequete($requete);
62
 
63
		$img_totale = array();
64
		foreach ($resulats as $info) {
65
			$img_totale[$info['periode']] = $info['nbre'];
66
		}
67
 
68
		// Trie des dates pour les étiquettes des axes
69
		$dates = array();
70
		$annees = array();
71
		$les_mois = array();
72
		$pas = 1; // intervalle de mois entre deux étiquettes
73
		$periode = 0;
74
		$cumul = 0;
75
		$img_totale_cumul = array();
76
		foreach ($img_totale as $annee_mois => $nbre) {
77
			$annee = substr($annee_mois, 0, 4);
78
			$mois = substr($annee_mois, 4, 2);
79
			$mois_fmt_B = strftime('%b', strtotime("0000-$mois-01"));
80
			$cumul += $nbre;
81
			$img_totale_cumul[$annee_mois] = $cumul;
82
 
83
			if (!isset($dates[$annee][$mois])) {
84
				$annees[] = (!isset($dates[$annee]) ? $annee : '');
85
				$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
86
				// Ajouter au tableau dates tjrs à la fin
87
				$dates[$annee][$mois] = 1;
88
			}
89
		}
90
 
91
		// Post traitement des données
92
		$titre = "Évolution des images liées aux observations par mois";
93
		$valeurs_y = implode(',', $img_totale);
94
		$valeurs_r = implode(',', $img_totale_cumul);
95
		$valeurs_max_y = max($img_totale);
96
		$valeurs_max_r = max($img_totale_cumul);
97
		$y_val_fin = $valeurs_max_y;
98
		$y_pas = 200;
99
		$r_val_fin = $valeurs_max_r;
100
		$r_pas = 1000;
101
		$etiquettes_x1 = implode('|', $les_mois);
102
		$etiquettes_x2 = implode('|', $annees);
103
		$etiquettes_y = 'Images';
104
 
105
		// Construire de l'url de l'image
106
		$graph = array('cht' => 'lc',
107
			'chtt'	=> $titre,
108
			'chs'	=> '600x200',
109
			'chco'	=> '007F00,99CC00',
110
			'chd'	=> 't:'.$valeurs_y.'|'.$valeurs_r,
111
			'chds'	=> "0,$valeurs_max_y,0,$valeurs_max_r",
112
			'chxt'	=> 'y,y,x,x,r',
113
			'chxl'	=> '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'',
114
			'chxp'	=> '1,50|3,0',
115
			'chxr'	=> "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas",
116
			'chm'	=> 'N ** ,000000,0,-1,8,1.0,ht',
117
			'chxs'	=> '0,007F00|4,99CC00');
118
		return $graph;
119
	}
120
 
121
	private function getEvolImgParMois($param) {
122
		// Récupération des données
123
 
124
		$requete = 	"SELECT DATE_FORMAT(ci_meta_date_ajout, '%Y%m') AS periode, COUNT(ci_id_image) AS nbre ".
125
			"FROM cel_images ".
126
			"WHERE ci_meta_date_ajout != '0000-00-00 00:00:00' ".
127
			'GROUP BY periode '.
128
			'ORDER BY periode ';
129
		$resulats = $this->executerRequete($requete);
130
 
131
		$img_totale = array();
132
		foreach ($resulats as $info) {
133
			$img_totale[$info['periode']] = $info['nbre'];
134
		}
135
 
136
		// Trie des dates pour les étiquettes des axes
137
		$dates = array();
138
		$annees = array();
139
		$les_mois = array();
140
		$pas = 1; // intervalle de mois entre deux étiquettes
141
		$periode = 0;
142
		$cumul = 0;
143
		$img_totale_cumul = array();
144
		foreach ($img_totale as $annee_mois => $nbre) {
145
			$annee = substr($annee_mois, 0, 4);
146
			$mois = substr($annee_mois, 4, 2);
147
			$mois_fmt_B = strftime('%b', strtotime("0000-$mois-01"));
148
			$cumul += $nbre;
149
			$img_totale_cumul[$annee_mois] = $cumul;
150
 
151
			if (!isset($dates[$annee][$mois])) {
152
				$annees[] = (!isset($dates[$annee]) ? $annee : '');
153
				$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
154
				// Ajouter au tableau dates tjrs à la fin
155
				$dates[$annee][$mois] = 1;
156
			}
157
		}
158
 
159
		// Post traitement des données
160
		$titre = "Évolution du dépôt d'images par mois";
161
		$valeurs_y = implode(',', $img_totale);
162
		$valeurs_r = implode(',', $img_totale_cumul);
163
		$valeurs_max_y = max($img_totale);
164
		$valeurs_max_r = max($img_totale_cumul);
165
		$y_val_fin = $valeurs_max_y;
166
		$y_pas = 500;
167
		$r_val_fin = $valeurs_max_r;
168
		$r_pas = 1000;
169
		$etiquettes_x1 = implode('|', $les_mois);
170
		$etiquettes_x2 = implode('|', $annees);
171
		$etiquettes_y = 'Images';
172
 
173
		// Construire de l'url de l'image
174
		$graph = array('cht' => 'lc',
175
			'chtt'	=> $titre,
176
			'chs'	=> '600x200',
177
			'chco'	=> '007F00,99CC00',
178
			'chd'	=> 't:'.$valeurs_y.'|'.$valeurs_r,
179
			'chds'	=> "0,$valeurs_max_y,0,$valeurs_max_r",
180
			'chxt'	=> 'y,y,x,x,r',
181
			'chxl'	=> '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'',
182
			'chxp'	=> '1,50|3,0',
183
			'chxr'	=> "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas",
184
			'chm'	=> 'h,C3C3C3,0,0.5,1,-1|N ** ,000000,0,-1,8,1.0,ht',
185
			'chxs'	=> '0,007F00|4,99CC00');
186
		return $graph;
187
	}
188
 
189
	private function getEvolUtilisateurParMois($param) {
190
		// Récupération des données
191
		$requete = 	'SELECT  DISTINCT identifiant , '.
192
					'	MIN(date_creation) AS date_min, MAX(date_creation) AS date_max, '.
193
					'	COUNT(id) AS obs_nbre '.
194
					'FROM cel_inventory '.
195
					"WHERE date_creation != '0000-00-00 00:00:00' ".
196
					"	AND identifiant LIKE '%@%' ".
197
					'GROUP BY identifiant '.
198
					'ORDER BY date_min ASC ';
199
		$resultats = $this->executerRequete($requete);
200
 
201
		// Trie des données et des dates pour les étiquettes des axes
202
		$dates = array();
203
		$annees = array();
204
		$utilisateurs = array();
205
		$les_mois = array();
206
		$pas = 2; // intervalle de mois entre deux étiquettes
207
		$periode = 0;
208
		foreach ($resultats as $enrg) {
209
			$annee = substr($enrg['date_min'], 0, 4);
210
			$mois = substr($enrg['date_min'], 5, 2);
211
			$mois_fmt_B = strftime('%b', strtotime("0000-$mois-01"));
212
 
213
			if (!isset($dates[$annee][$mois])) {
214
				$annees[] = (!isset($dates[$annee]) ? $annee : '');
215
				$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
216
				$utilisateurs["$annee-$mois"] = 1;
217
				// Ajouter au tableau dates tjrs à la fin
218
				$dates[$annee][$mois] = 1;
219
			} else {
220
				$utilisateurs["$annee-$mois"]++;
221
			}
222
		}
223
 
224
		// Post traitement des données
225
		$titre = 'Évolution des utilisateurs par mois';
226
		$valeurs = implode(',', $utilisateurs);
227
		$valeurs_max = max($utilisateurs);
228
		$y_val_fin = $valeurs_max;
229
		$y_pas = 2;
230
		$etiquettes_x1 = implode('|', $les_mois);
231
		$etiquettes_x2 = implode('|', $annees);
232
		$etiquettes_y = 'utilisateurs';
233
 
234
		// Construire de l'url de l'image
235
		$graph = array('cht' => 'lc',
236
			'chtt'	=> $titre,
237
			'chs'	=> '600x200',
238
			'chco'	=> '0000FF',//4D89F9
239
			'chd'	=> 't:'.$valeurs,
240
			'chds'	=> '0,'.$valeurs_max,
241
			'chxt'	=> 'y,y,x,x',
242
			'chxl'	=> '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'',
243
			'chxp'	=> '1,50|3,0',
244
			'chxr'	=> "0,0,$y_val_fin,$y_pas",
245
			'chm'	=> 'h,C3C3C3,0,0.5,1,-1|N ** ,000000,0,2::2,8,1.0,ht');
246
		return $graph;
247
	}
248
 
249
	private function getEvolObsParMoisGlissant($param) {
250
		// Récupération des données
251
		$format_date = '%Y%m%d';
252
		$where = 'date_creation > DATE_SUB(NOW(), INTERVAL 31 DAY)';
253
		$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id', $format_date, $where);
254
 
255
		// Trie des dates pour les étiquettes des axes
256
		$dates = array();
257
		$annees = array();
258
		$annees_mois = array();
259
		$jours = array();
260
		foreach ($obs_totale as $annee_mois_jours => $nbre) {
261
			$annee = substr($annee_mois_jours, 0, 4);
262
			$mois = substr($annee_mois_jours, 4, 2);
263
			$annee_mois_fmt_B = strftime('%B %Y', strtotime($annee.'-'.($mois+1).'-00'));
264
			$jour = substr($annee_mois_jours, 6, 2);
265
 
266
			if (!isset($dates[$annee][$mois][$jour])) {
267
				$annees_mois[] = (!isset($dates[$annee][$mois]) ? $annee_mois_fmt_B : '');
268
				$jours[] = $jour;
269
				// Ajouter au tableau dates tjrs à la fin
270
				$dates[$annee][$mois][$jour] = 1;
271
			}
272
		}
273
 
274
		// Post traitement des données
275
		$titre = 'Évolution des observations sur un mois glissant';
276
		$valeurs = implode(',', $obs_totale);
277
		$valeurs_max = max($obs_totale);
278
		$y_val_fin = $valeurs_max;
279
		$y_pas = 25;
280
		$etiquettes_x1 = implode('|', $jours);
281
		$etiquettes_x2 = implode('|', $annees_mois);
282
		$etiquettes_y1 = 'observations';
283
 
284
		// Construire de l'url de l'image
285
		$graph = array('cht' => 'lc',
286
			'chtt'	=>	$titre,
287
			'chs'	=>	'600x200',
288
			'chco'	=>	'822013',
289
			'chd'	=>	't:'.$valeurs,
290
			'chds'	=>	'0,'.$valeurs_max,
291
			'chxt'	=>	'y,y,x,x',
292
			'chxl'	=>	'1:|'.$etiquettes_y1.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1,
293
			'chxp'	=>	'0,0|1,50',
294
			'chxr'	=>	"0,0,$y_val_fin,$y_pas",
295
			'chm'	=> 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht');
296
		return $graph;
297
	}
298
 
299
	private function getEvolObsParMois($param) {
300
		// Récupération des données
301
		$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id');
302
 
303
		// Trie des dates pour les étiquettes des axes
304
		$dates = array();
305
		$annees = array();
306
		$les_mois = array();
307
		$pas = 2; // intervalle de mois entre deux étiquettes
308
		$periode = 0;
309
		$cumul = 0;
310
		$obs_totale_cumul = array();
311
		foreach ($obs_totale as $annee_mois => $nbre) {
312
			$annee = substr($annee_mois, 0, 4);
313
			$mois = substr($annee_mois, 4, 2);
314
			$mois_fmt_B = strftime('%b', strtotime("0000-$mois-01"));
315
			$cumul += $nbre;
316
			$obs_totale_cumul[$annee_mois] = $cumul;
317
 
318
			if (!isset($dates[$annee][$mois])) {
319
				$annees[] = (!isset($dates[$annee]) ? $annee : '');
320
				$les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
321
				// Ajouter au tableau dates tjrs à la fin
322
				$dates[$annee][$mois] = 1;
323
			}
324
		}
325
 
326
		// Post traitement des données
327
		$titre = 'Évolution des observations par mois';
328
		$valeurs_y = implode(',', $obs_totale);
329
		$valeurs_r = implode(',', $obs_totale_cumul);
330
		$valeurs_max_y = max($obs_totale);
331
		$valeurs_max_r = max($obs_totale_cumul);
332
		$y_val_fin = $valeurs_max_y;
333
		$y_pas = 500;
334
		$r_val_fin = $valeurs_max_r;
335
		$r_pas = 2500;
336
		$etiquettes_x1 = implode('|', $les_mois);
337
		$etiquettes_x2 = implode('|', $annees);
338
		$etiquettes_y = 'Observations';
339
 
340
		// Construire de l'url de l'image
341
		$graph = array('cht' => 'lc',
342
			'chtt'	=> $titre,
343
			'chs'	=> '600x200',
344
			'chco'	=> '822013,F1841D',
345
			'chd'	=> 't:'.$valeurs_y.'|'.$valeurs_r,
346
			'chds'	=> "0,$valeurs_max_y,0,$valeurs_max_r",
347
			'chxt'	=> 'y,y,x,x,r',
348
			'chxl'	=> '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'',
349
			'chxp'	=> '1,50|3,0',
350
			'chxr'	=> "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas",
351
			'chm'	=> 'N ** ,000000,0,2::2,8,1.0,ht',
352
			'chxs'	=> '0,822013|4,F1841D');
353
		return $graph;
354
	}
355
 
356
	private function getEvolObsParAn($param) {
357
		// Récupération des données
358
		$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id', '%Y');
359
 
360
		// Trie des dates pour les étiquettes des axes
361
		$dates = array();
362
		$annees = array();
363
		foreach ($obs_totale as $annee => $nbre) {
364
			if (!isset($dates[$annee])) {
365
				$annees[] = $annee;
366
				$dates[$annee] = 1;
367
			}
368
		}
369
 
370
		// Post traitement des données
371
		$titre = 'Évolution des observations par année';
372
		$valeurs = implode(',', $obs_totale);
373
		$valeurs_max = max($obs_totale);
374
		$valeurs_min = min($obs_totale);
375
		$y_val_deb = preg_replace('/[0-9]{2}$/', '00', $valeurs_min);
376
		$y_val_fin = $valeurs_max;
377
		$y_pas = 1000;
378
		$etiquettes_x = implode('|', $annees);;
379
		$etiquettes_y = 'observations';
380
 
381
		// Construire de l'url de l'image
382
		$graph = array('cht' => 'lc',
383
			'chtt'	=> $titre,
384
			'chs'	=> '600x200',
385
			'chco'	=> '822013',
386
			'chd'	=> 't:'.$valeurs,
387
			'chds'	=> "$valeurs_min,$valeurs_max",
388
			'chxt'	=> 'y,y,x',
389
			'chxl'	=> '1:|'.$etiquettes_y.'|2:|'.$etiquettes_x.'',
390
			'chxp'	=> '0,0|1,50|2,0',
391
			'chxr'	=> "0,$y_val_deb,$y_val_fin,$y_pas",
392
			'chm'	=> 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht');
393
		return $graph;
394
	}
395
 
396
	private function getEvolObsHisto($param) {
397
		// Récupération des données
398
		$obs_totale = $this->executerRequeteEvol('cel_inventory', 'id');
399
		$obs_identifiee = $this->executerRequeteEvol('cel_inventory', 'id', "identifiant LIKE '%@%' ");
400
		$lignes = array('total', 'obs. identifiée');
401
 
402
		// Post traitement des données
403
		$titre = 'Évolution des observations';
404
		$valeurs = implode(',', $obs_totale).'|'.implode(',', $obs_identifiee);
405
		$valeurs_max = max($obs_totale);
406
		$etiquettes = implode('|', array_keys($lignes));
407
 
408
		// Construire de l'url de l'image
409
		$graph = array('cht' => 'lc',
410
			'chtt'	=> $titre,
411
			'chs'	=> '500x300',
412
			'chco'	=> 'FF0000,00FF00',
413
			'chd'	=> 't:'.$valeurs,
414
			'chds'	=> "0,$valeurs_max",
415
			'chxt'	=> 'y',
416
			'chxl'	=> '0:|'.$etiquettes.'',
417
			'chm'	=> 'N,000000,0,-1,10');
418
		return $graph;
419
	}
420
 
421
	private function getNbreObsIdVsTest($param) {
422
		// Récupération des données
423
		$obs_totale = $this->executerRequeteNombre('cel_inventory', 'id');
424
		$obs_identifiee = $this->executerRequeteNombre('cel_inventory', 'id', "identifiant LIKE '%@%' ");
425
		$obs_test = $obs_totale - $obs_identifiee;
426
		$pourcent_identifiee = round(($obs_identifiee / ($obs_totale / 100)), 2).'%';
427
		$pourcent_anonyme = round(($obs_test / ($obs_totale / 100)), 2).'%';
428
 
429
		// Post traitement des données de la base de données
430
		$titre = "Nombre d'observations|tests vs. identifiées";
431
		$etiquette_obs_test = "tests ($obs_test - $pourcent_anonyme)";
432
		$etiquette_obs_id = "identifiées ($obs_identifiee - $pourcent_identifiee)";
433
		$donnees = array($etiquette_obs_test => $obs_test, $etiquette_obs_id => $obs_identifiee);
434
		$valeurs = implode(',', $donnees);
435
		$etiquettes = implode('|', array_keys($donnees));
436
 
437
		// Construire les paramêtres de l'url de l'image
438
		$graph = array('cht' => 'p3',
439
			'chtt'	=> $titre,
440
			'chs'	=> '250x200',
441
			'chco'	=> 'FF0000,00FF00',
442
			'chd'	=> 't:'.$valeurs,
443
			'chds'	=> "0,$obs_totale",
444
			'chdl'	=> $etiquettes,
445
			'chdlp'	=> 'bv|r',
446
			'chts'	=> '000000,12');
447
		return $graph;
448
	}
449
 
450
	private function getNbreObsPublicVsPrivee($param) {
451
		// Récupération des données
452
		$obs_totale = $this->executerRequeteNombre('cel_inventory', 'id');
453
		$obs_public = $this->executerRequeteNombre('cel_inventory', 'id', 'transmission = 1');
454
		$obs_privee = $obs_totale - $obs_public;
455
		$pourcent_privee = round(($obs_privee / ($obs_totale / 100)), 2).'%';
456
		$pourcent_public = round(($obs_public / ($obs_totale / 100)), 2).'%';
457
 
458
		// Post traitement des données de la base de données
459
		$titre = "Nombre d'observations|publiques vs. privées";
460
		$etiquette_obs_public = "publiques ($obs_public - $pourcent_public)";
461
		$etiquette_obs_privee = "privées ($obs_privee - $pourcent_privee)";
462
		$donnees = array($etiquette_obs_privee => $obs_privee, $etiquette_obs_public => $obs_public);
463
		$valeurs = implode(',', $donnees);
464
		$etiquettes = implode('|', array_keys($donnees));
465
 
466
		// Construire les paramêtres du graph
467
		$graph = array('cht' => 'p3',
468
			'chtt'	=> $titre,
469
			'chs'	=> '250x200',
470
			'chco'	=> 'FF0000,00FF00',
471
			'chd'	=> 't:'.$valeurs,
472
			'chds'	=> "0,$obs_totale",
473
			'chdl'	=> $etiquettes,
474
			'chdlp'	=> 'bv|r',
475
			'chts'	=> '000000,12');
476
		return $graph;
477
	}
478
 
479
	private function getNbreObsDetermineeVsInconnue($param) {
480
		// Récupération des données
481
		$obs_totale = $this->executerRequeteNombre('cel_inventory', 'id');
482
		$obs_determinee = $this->executerRequeteNombre('cel_inventory', 'id', 'num_nom_sel != 0');
483
		$obs_inconnue = $obs_totale - $obs_determinee;
484
		$pourcent_determinee = round(($obs_determinee / ($obs_totale / 100)), 2).'%';
485
		$pourcent_inconnue = round(($obs_inconnue / ($obs_totale / 100)), 2).'%';
486
 
487
		// Post traitement des données de la base de données
488
		$titre = "Nombre d'observations|determinées vs. inconnues";
489
		$etiquette_obs_determinee = "determinées ($obs_determinee - $pourcent_determinee)";
490
		$etiquette_obs_inconnue = "non déterminées ($obs_inconnue - $pourcent_inconnue)";
491
		$donnees = array($etiquette_obs_inconnue => $obs_inconnue, $etiquette_obs_determinee => $obs_determinee);
492
		$valeurs = implode(',', $donnees);
493
		$etiquettes = implode('|', array_keys($donnees));
494
 
495
		// Construire les paramêtres du graph
496
		$graph = array('cht' => 'p3',
497
			'chtt'	=> $titre,
498
			'chs'	=> '250x200',
499
			'chco'	=> 'FF0000,00FF00',
500
			'chd'	=> 't:'.$valeurs,
501
			'chds'	=> "0,$obs_totale",
502
			'chdl'	=> $etiquettes,
503
			'chdlp'	=> 'bv|r',
504
			'chts'	=> '000000,12');
505
		return $graph;
506
	}
507
 
508
	private function getNbreObsAvecIndicationGeo($param) {
509
		// Récupération des données
510
		$total = $this->executerRequeteNombre('cel_inventory', 'id');
511
		$obs['commune'] = $this->executerRequeteNombre('cel_inventory', 'id', "location != '000null' AND location != '' AND location IS NOT NULL");
512
		$obs['commune identifiée'] = $this->executerRequeteNombre('cel_inventory', 'id', "id_location != '000null' AND id_location != '' AND id_location IS NOT NULL");
513
		$obs['lieu-dit'] = $this->executerRequeteNombre('cel_inventory', 'id', "lieudit != '000null' AND lieudit != '' AND lieudit IS NOT NULL");
514
		$obs['station'] = $this->executerRequeteNombre('cel_inventory', 'id', "station != '000null' AND station != '' AND station IS NOT NULL");
515
		$obs['milieu'] = $this->executerRequeteNombre('cel_inventory', 'id', "milieu != '000null' AND milieu != '' AND milieu IS NOT NULL");
516
		$obs['coordonnée'] = $this->executerRequeteNombre('cel_inventory', 'id', "coord_x != '000null' AND coord_x != '' AND coord_x IS NOT NULL AND coord_y != '000null' AND coord_y != '' AND coord_y IS NOT NULL");
517
 
518
		$donnees = array();
519
		$num = 1;
520
		foreach ($obs as $etiquette => $nbre) {
521
			$pourcent = round(($obs[$etiquette] / ($total / 100)), 1).'%';
522
			$legende = "$num : $etiquette ($nbre - $pourcent)";
523
			$donnees['valeurs'][] = $nbre;
524
			$donnees['etiquettes'][] = $num++;
525
			$donnees['legendes'][] = $legende;
526
		}
527
 
528
 
529
		// Post traitement des données de la base de données
530
		$titre = "Nombre d'observations|avec indications géographiques";
531
		$valeurs = implode(',', $donnees['valeurs']);
532
		$etiquettes = implode('|', $donnees['etiquettes']);
533
		$legendes = implode('|', $donnees['legendes']);
534
 
535
		// Construire les paramêtres du graph
536
		$graph = array('cht' => 'rs',
537
			'chtt'	=> $titre,
538
			'chs'	=> '600x300',
539
			'chco'	=> 'FFFFFF',
540
			'chd'	=> 't:'.$valeurs,
541
			'chds'	=> "0,$total",
542
			'chdl'	=> $legendes,
543
			'chxt'	=> 'x',
544
			'chxl'	=> "0:|$etiquettes",
545
			//'chxp'	=> '1,0,20,40,60,80,100',// Grille sous forme de cible
546
			'chm'	=> 'B,FF000080,0,1.0,5.0');
547
		return $graph;
548
	}
549
 
550
	private function getUtilisationJournaliere($param) {
551
		// Sur quel jour, voulons nous estimer l'utilisation
552
		$aujourdhui = date('Y-m-d');
553
		if (isset($param[0]) && preg_match('/^[0-9]{4}(?:-[0-9]{2}){2}$/', $param[0])) {
554
			$aujourdhui = $param[0];
555
		}
556
		$aujourdhui_fmt = strftime('%d %b %Y', strtotime($aujourdhui));
557
 
558
		// Récupération des données
559
		$max_obs = array();
560
		$max_obs[] = $this->executerRequeteEvol('cel_inventory', 'id', '%Y%m%d',
561
			"date_creation NOT LIKE '$aujourdhui%' ", 'date_creation');
562
		$max_obs[] = $this->executerRequeteEvol('cel_inventory', 'id', '%Y%m%d',
563
			"date_modification NOT LIKE '$aujourdhui%' ", 'date_modification');
564
		$max_obs[] = $this->executerRequeteEvol('cel_inventory', 'id', '%Y%m%d',
565
			"date_transmission NOT LIKE '$aujourdhui%' ", 'date_transmission');
566
		$obs_aujourdhui = $this->executerRequeteNombre('cel_inventory', 'id',
567
			"date_creation LIKE '$aujourdhui%'
568
				OR date_modification LIKE '$aujourdhui%'
569
				OR date_transmission LIKE '$aujourdhui%' ");
570
 
571
		// Cummul des obs crées, modifiées, transmises par jour
572
		$donnees = array();
573
		foreach ($max_obs as $obs_par_jour) {
574
			foreach ($obs_par_jour as $annee_mois_jour => $nbre) {
575
				if (!isset($donnees[$annee_mois_jour])) {
576
					$donnees[$annee_mois_jour] = $nbre;
577
				} else {
578
					$donnees[$annee_mois_jour] += $nbre;
579
				}
580
			}
581
		}
582
 
583
		// Post traitement des données
584
		$valeur = $obs_aujourdhui;
585
		$valeur_max = 400;max($donnees);
586
		if ($valeur > $valeur_max) {
587
			$pourcentage = 100;
588
		} else {
589
			$pourcentage = round(($valeur / ($valeur_max / 100)), 0);
590
		}
591
		$etiquettes_x = $aujourdhui_fmt;
592
		$etiquettes_y = "faible|moyenne|forte";
593
		$titre = "Intensité d'utilisation pour le $aujourdhui_fmt";
594
		$legende = "$valeur changements";
595
 
596
		// Construire de l'url de l'image
597
		$graph = array('cht' => 'gom',
598
			'chtt'	=> $titre,
599
			'chdl'	=> "$legende",
600
			'chdlp'	=> 'b',
601
			'chs'	=> '350x200',
602
			'chco'	=> 'FFFF00,0A7318',
603
			'chls'	=> '3|10',
604
			'chma'	=> '0,0,0,0|300,40',
605
			'chd'	=> 't:'.$pourcentage,
606
			'chxt'	=> 'x,y',
607
			'chxl'	=> '0:|'.$etiquettes_x.'|1:|'.$etiquettes_y.'',
608
			'chxp'	=> '0,50');
609
		return $graph;
610
	}
611
 
612
	private function getNbreObsParUtilisateur($param) {
613
		// Récupération des données
614
		$requete = 	'SELECT identifiant, COUNT(id) AS nbre '.
615
					'FROM cel_inventory '.
616
					'GROUP BY identifiant ';
617
		$utilisateurs = $this->executerRequete($requete);
618
 
619
		// Création des classes d'utilisateurs
620
		$classes = array('00->10' => 0, '11->50' => 0, '51->100' => 0, '101->500' => 0, '500->∞' => 0);
621
		$donnees['Utilisateurs'] = $classes;
622
		$valeur_max = 0;
623
		foreach ($utilisateurs as $utilisateur) {
624
			$id = $utilisateur['identifiant'];
625
			$nbre = $utilisateur['nbre'];
626
 
627
			// Détermination de la classe
628
			$classe = '';
629
			if (0 < $nbre && $nbre <= 10) {
630
				$classe = '00->10';
631
			} else if (10 < $nbre && $nbre <= 50) {
632
				$classe = '11->50';
633
			} else if (50 < $nbre && $nbre <= 100) {
634
				$classe = '51->100';
635
			} else if (100 < $nbre && $nbre <= 500) {
636
				$classe = '101->500';
637
			} else if (500 < $nbre) {
638
				$classe = '500->∞';
639
			}
640
 
641
			// Détermination du type d'utilisateur
642
			if (strstr($id, '@')) {
643
				$type = 'Utilisateurs';
644
				// Incrémentation du tableau de données et récupration de la valeur max
645
				$donnees[$type][$classe]++;
646
				if ($donnees[$type][$classe] > $valeur_max) {
647
					$valeur_max = $donnees[$type][$classe];
648
				}
649
			}
650
		}
651
 
652
		// Post traitement des données
653
		$titre = "Nombre d'observations par utilisateur";
654
		$y1_val_fin = $valeur_max;
655
		$y1_pas = '100';
656
		$valeurs = implode(',', $donnees['Utilisateurs']);
657
		$etiquettes_x1 = implode('|', array_keys($classes));
658
		$etiquettes_x2 = 'Observations';
659
		$etiquettes_y2 = 'Utilisateurs';
660
		$legendes = implode('|', array_keys($donnees));
661
 
662
		// Construire de l'url de l'image
663
		$graph = array('cht' => 'bvg',
664
			'chtt'	=> $titre,
665
			'chs'	=> '400x200',
666
			'chco'	=> '00FF00,FF0000',
667
			'chbh'	=> 'r,0.3,1',
668
			'chd'	=> 't:'.$valeurs,
669
			'chds'	=> "0,$valeur_max",
670
			'chxt'	=> 'x,x,y,y',
671
			'chxl'	=> '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|3:|'.$etiquettes_y2.'',
672
			'chxp'	=> '1,100|3,100',
673
			'chxr'	=> "2,0,$y1_val_fin,$y1_pas",
674
			'chm'	=> 'h,C3C3C3,0,0.5,1,-1|N,000000,0,0::1,8,1.0,e');
675
		//echo '<pre>'.print_r($graph,true).'</pre>';
676
		return $graph;
677
	}
678
 
679
	private function getNbreObsParUtilisateurEtTest($param) {
680
		// Récupération des données
681
		$requete = 	'SELECT identifiant, COUNT(id) AS nbre '.
682
					'FROM cel_inventory '.
683
					'GROUP BY identifiant ';
684
		$utilisateurs = $this->executerRequete($requete);
685
 
686
		// Création des classes d'utilisateurs
687
		$classes = array('00->10' => 0, '11->50' => 0, '51->100' => 0, '101->500' => 0, '500->∞' => 0);
688
		$donnees['Utilisateurs'] = $classes;
689
		$donnees['Tests'] = $classes;
690
		$valeur_max = 0;
691
		foreach ($utilisateurs as $utilisateur) {
692
			$id = $utilisateur['identifiant'];
693
			$nbre = $utilisateur['nbre'];
694
 
695
			// Détermination de la classe
696
			$classe = '';
697
			if (0 < $nbre && $nbre <= 10) {
698
				$classe = '00->10';
699
			} else if (10 < $nbre && $nbre <= 50) {
700
				$classe = '11->50';
701
			} else if (50 < $nbre && $nbre <= 100) {
702
				$classe = '51->100';
703
			} else if (100 < $nbre && $nbre <= 500) {
704
				$classe = '101->500';
705
			} else if (500 < $nbre) {
706
				$classe = '500->∞';
707
			}
708
 
709
			// Détermination du type d'utilisateur
710
			if (strstr($id, '@')) {
711
				$type = 'Utilisateurs';
712
			} else {
713
				$type = 'Tests';
714
			}
715
 
716
			// Incrémentation du tableau de données et récupration de la valeur max
717
			$donnees[$type][$classe]++;
718
			if ($donnees[$type][$classe] > $valeur_max) {
719
				$valeur_max = $donnees[$type][$classe];
720
			}
721
		}
722
 
723
		// Post traitement des données
724
		$titre = "Nombre d'observations par utilisateur et test";
725
		$y1_val_fin = $valeur_max;
726
		$y1_pas = '100';
727
		$valeurs = implode(',', $donnees['Utilisateurs']).'|'.implode(',', $donnees['Tests']);
728
		$etiquettes_x1 = implode('|', array_keys($classes));
729
		$etiquettes_x2 = 'Observations';
730
		$etiquettes_y2 = 'Utilisateurs';
731
		$legendes = implode('|', array_keys($donnees));
732
 
733
		// Construire de l'url de l'image
734
		$graph = array('cht' => 'bvg',
735
			'chtt'	=> $titre,
736
			'chs'	=> '400x200',
737
			'chco'	=> '00FF00,FF0000',
738
			'chbh'	=> 'r,0.3,1',
739
			'chd'	=> 't:'.$valeurs,
740
			'chds'	=> "0,$valeur_max",
741
			'chxt'	=> 'x,x,y,y',
742
			'chxl'	=> '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|3:|'.$etiquettes_y2.'',
743
			'chxp'	=> '1,100|3,100',
744
			'chxr'	=> "2,0,$y1_val_fin,$y1_pas",
745
			'chm'	=> 'h,C3C3C3,0,0.5,1,-1|N,000000,0,0::1,8,1.0,e|N,000000,1,0::1,8,1.0,e',
746
			'chdl'	=> $legendes,
747
			'chdlp'	=> 'b');
748
		//echo '<pre>'.print_r($graph,true).'</pre>';
749
		return $graph;
750
	}
751
 
752
	private function getNuagePointsObsParHeureEtJourSemaine($param) {
753
		// Récupération des données de la base
754
		$observations = $this->executerRequeteEvol('cel_inventory', 'id', '%w-%H', null, 'date_creation');
755
 
756
		// Postraitement des données
757
		// Jour de la semaine
758
		$donnees['joursSemaine'] = array();
759
		for ($njs = 0; $njs < 7; $njs++) {
760
			$donnees['joursSemaine'][] = strftime('%A', strtotime('2010-05-'.(16+$njs)));
761
		}
762
		// Heure
763
		$donnees['heures'] = array();
764
		for ($h = 0; $h < 24; $h++) {
765
			$heure_fmt = sprintf('%02s', $h);// Format numérique 00
766
			$donnees['heures'][] = strftime('%H', strtotime("0000-00-00 $heure_fmt:00:00"));
767
		}
768
		// Nbre
769
		$valeur_max = max($observations);
770
		for ($njs = 0; $njs < 7; $njs++) {
771
			for ($h = 0; $h < 24; $h++) {
772
				$hfmt = sprintf('%02s', $h);// Format numérique 00
773
				$periode = $njs.'-'.$hfmt;
774
				$donnees['valeurs_x'][] = round(($h + 1) * (100 / 24), 0);
775
				$donnees['valeurs_y'][] = round(($njs + 1) * (100 / 7), 0);
776
				$ps = 0;
777
				if (isset($observations[$periode])) {
778
					$ps = round($observations[$periode] * (100 / $valeur_max), 0);
779
				}
780
				$donnees['valeurs_ps'][] = $ps;
781
			}
782
		}
783
		//echo '<pre>'.print_r($donnees,true).'</pre>';
784
		// Préparation des paramêtres du graph
785
		$titre = "Nombre de création d'observation|par heure et jour de la semaine";
786
		$valeurs = implode(',', $donnees['valeurs_x'])."|".implode(',', $donnees['valeurs_y'])."|".implode(',', $donnees['valeurs_ps']);
787
		$etiquettes_x1 = '|'.implode('|', $donnees['heures']);
788
		$etiquettes_x2 = 'Heures';
789
		$etiquettes_y1 = '|'.implode('|', $donnees['joursSemaine']);
790
		$x_axis_step_size = str_replace(',', '.', (100 / 24));
791
		$y_axis_step_size = str_replace(',', '.', (100 / 7));
792
 
793
		// Construction du tableau des paramêtres du graph
794
		$graph = array('cht' => 's',
795
			'chtt'	=> $titre,
796
			'chs'	=> '400x200',
797
			'chco'	=> '00FF00',
798
			'chd'	=> 't:'.$valeurs,
799
			'chxt'	=> 'x,x,y',
800
			'chxr'	=> "0,-1,23,1|2,-1,6,1",
801
			'chxp'	=> '1,100',
802
			'chxl'	=> '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|2:|'.$etiquettes_y1.'',
803
			'chg'	=> "$x_axis_step_size,$y_axis_step_size,1,5");
804
		//echo '<pre>'.print_r($graph,true).'</pre>';
805
		return $graph;
806
	}
807
 
808
	private function getNuagePointsObsAnciennete($param) {
809
		// Récupération des données de la base
810
		$requete = 	'SELECT  DISTINCT identifiant , '.
811
					'	MIN(date_creation) AS date_min, MAX(date_creation) AS date_max, '.
812
					'	COUNT(id) AS obs_nbre '.
813
					'FROM cel_inventory '.
814
					"WHERE date_creation != '0000-00-00 00:00:00' ".
815
					"	AND identifiant LIKE '%@%' ".
816
					'GROUP BY identifiant '.
817
					'ORDER BY date_min ASC ';
818
		$resultats = $this->executerRequete($requete);
819
 
820
		// Trie des données
821
		$max_obs = 0;
822
		$max_obs_log = 0;
823
		$max_anciennete = 0;
824
		$donnees = array();
825
		foreach ($resultats as $enrg) {
826
			$tps_deb = strtotime($enrg['date_min']);
827
			$tps_fin = strtotime($enrg['date_max']);
828
 
829
			$donnee = array();
830
			if (($tps_fin - $tps_deb) == 0) {
831
				$donnee['anciennete'] = 1;
832
			} else {
833
				$donnee['anciennete'] = round((($tps_fin - $tps_deb) / 86400), 0);
834
			}
835
			$donnee['obs'] = $enrg['obs_nbre'];
836
			$donnee['obs_log'] = log10($enrg['obs_nbre']);
837
			$donnees[] = $donnee;
838
 
839
			$max_obs_log = ($donnee['obs_log'] > $max_obs_log) ? $donnee['obs_log'] : $max_obs_log;
840
			$max_obs = ($donnee['obs'] > $max_obs) ? $donnee['obs'] : $max_obs;
841
			$max_anciennete = ($donnee['anciennete'] > $max_anciennete) ? $donnee['anciennete'] : $max_anciennete;
842
		}
843
 
844
		// Postraitement des données
845
		foreach ($donnees as $donnee) {
846
			$donnees['valeurs_x'][] = round($donnee['anciennete'] * (100 / $max_anciennete), 0);
847
			$donnees['valeurs_y'][] = round($donnee['obs_log'] * (100 / $max_obs_log), 0);
848
			$donnees['valeurs_ps'][] = 20;
849
		}
850
 
851
		// Échelle log des obs
852
		$donnees['echelle_y1'] = array();
853
		$pas = $max_obs_log / 100 ;
854
		for ($i = 0 ; $i < 5 ; $i++) {
855
			$donnees['echelle_y1'][] = round(pow(10, (($i*20) * $pas)), 0);
856
		}
857
		$donnees['echelle_y1'][] = $max_obs;
858
 
859
		//echo '<pre>'.print_r($donnees['valeurs_x'],true).'</pre>';
860
		// Préparation des paramêtres du graph
861
		$titre = "Répartition des utilisateurs en fonction|du nombre d'observations et de l'ancienneté";
862
		$valeurs = implode(',', $donnees['valeurs_x'])."|".implode(',', $donnees['valeurs_y'])."|".implode(',', $donnees['valeurs_ps']);
863
		$etiquettes_x2 = 'Ancienneté en jours';
864
		$etiquettes_y1 = implode('|', $donnees['echelle_y1']);
865
		$etiquettes_y2 = 'Observations';
866
		$x_axis_step_size = $max_anciennete;
867
 
868
		// Construction du tableau des paramêtres du graph
869
		$graph = array('cht' => 's',
870
			'chtt'	=> $titre,
871
			'chs'	=> '400x200',
872
			'chco'	=> '0000FF',
873
			'chxt'	=> 'x,x,y,y',
874
			'chd'	=> 't:'.$valeurs,
875
			'chxr'	=> "0,0,$x_axis_step_size|2,0,$max_obs",//|2,0,$y_axis_step_size,$pas
876
			'chxp'	=> '1,100|3,100',
877
			'chm'	=> 'h,C3C3C3,0,-0.2,0.2,-1',
878
			'chxl'	=> '1:|'.$etiquettes_x2.'|2:|'.$etiquettes_y1.'|3:|'.$etiquettes_y2.'');//
879
		//echo '<pre>'.print_r($graph,true).'</pre>';
880
		return $graph;
881
	}
882
 
883
	private function executerRequeteEvol($table, $champ, $format_date = '%Y%m', $where = null, $champ_date = 'date_creation', $order_by = null, $limit = null) {
884
		$requete = 	"SELECT DATE_FORMAT($champ_date, '$format_date') AS periode, COUNT($champ) AS nbre ".
885
					"FROM $table ".
886
					"WHERE $champ_date != '0000-00-00 00:00:00' ".
887
					((is_null($where)) ? '' : " AND $where ").
888
					'GROUP BY periode '.
889
					((is_null($order_by)) ? '' : "ORDER BY $order_by ");
890
					((is_null($limit)) ? '' : "LIMIT $limit ");
891
		$evolution = $this->executerRequete($requete);
892
 
893
		// Traitement du tableau
894
		$donnees_traitees = array();
895
		foreach ($evolution as $info) {
896
			$donnees_traitees[$info['periode']] = $info['nbre'];
897
		}
898
 
899
		return $donnees_traitees;
900
	}
901
 
902
	private function executerRequeteNombre($table, $champ, $where = null) {
903
		$requete = 	"SELECT COUNT($champ) AS nbre ".
904
					"FROM $table ".
905
					((is_null($where)) ? '' : "WHERE $where ");
906
		$nbre = $this->executerRequete($requete, 'Column');
907
		return $nbre;
908
	}
909
}