Subversion Repositories eFlore/Applications.cel

Rev

Rev 2446 | Rev 3002 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Service fournissant des urls vers des images de graphiques sur les statistiques de l'application CEL.
 * Encodage en entrée : utf8
 * Encodage en sortie : utf8
 *
 * Cas d'utilisation :
 * /CelStatistique/TypeDeGraph : retourne le graphique demandé
 * Paramêtres :
 * serveur=[0-9] : retourne le graphique demandé sur le serveur numéro 0 à 9 (voir http://code.google.com/intl/fr/apis/chart/docs/making_charts.html#enhancements )
 *
 * @internal   Mininum PHP version : 5.2
 * @category   CEL
 * @package    Services
 * @subpackage Statistiques
 * @version    0.1
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
 */
class CelStatistique extends Cel {

        /**
         * Méthode appelée avec une requête de type GET.
         */
        public function getElement($param) {
                $graph = null;
                $serveur = '';

                if (isset($param[0])) {
                        $graph_demande = array_shift($param);
                        $methode = 'get'.$graph_demande;
                        if (method_exists($this, $methode)) {
                                $graph = $this->$methode($param);
                        } else {
                                $this->messages[] = "Ce type de graphique '$graph_demande' n'est pas disponible.";
                        }
                } else {
                        $this->messages[] = "Le premier paramêtre du service CEL Statistique doit correspondre au type de graphique.";
                }

                if (!is_null($graph)) {
                        $serveur = (isset($_GET['serveur']) && preg_match('/^[0-9]$/', $_GET['serveur'])) ? $_GET['serveur'].'.' : '';
                        $url = "http://{$serveur}chart.apis.google.com/chart";
                        $contexte = stream_context_create(
                                array('http' => array(
                                'method' => 'POST',
                                'content' => http_build_query($graph),
                                        'header' => 'Content-Type: application/x-www-form-urlencoded')));
                        $image = file_get_contents($url, false, $contexte);
                        $this->envoyer($image, 'image/png', null, false);
                } else {
                        $info = 'Un problème est survenu : '.print_r($this->messages, true);
                        $this->envoyer($info);
                }
        }

        private function getEvolImgLieesParMois($param) {
                $utilisateur = isset($_GET['utilisateur']) ? Cel::db()->quote($_GET['utilisateur']) : null;

                // Récupération des données
                $requete = "SELECT DATE_FORMAT(date_creation, '%Y%m') AS periode, COUNT(id_image) AS nbre ".
                        "FROM cel_images ".
                        "WHERE date_creation != '0000-00-00 00:00:00' ".
                        '       AND ce_observation IS NOT NULL AND ce_observation != 0 '.
                        ((isset($utilisateur)) ? " AND courriel_utilisateur = $utilisateur " : '').
                        'GROUP BY periode '.
                        'ORDER BY periode ';

                $resulats = Cel::db()->requeter($requete);

                $img_totale = array();
                foreach ($resulats as $info) {
                        $img_totale[$info['periode']] = $info['nbre'];
                }

                // Trie des dates pour les étiquettes des axes
                $dates = array();
                $annees = array();
                $les_mois = array();
                $pas = 1; // intervalle de mois entre deux étiquettes
                $periode = 0;
                $cumul = 0;
                $img_totale_cumul = array();
                foreach ($img_totale as $annee_mois => $nbre) {
                        $annee = substr($annee_mois, 0, 4);
                        $mois = substr($annee_mois, 4, 2);
                        $mois_fmt_B = strftime('%b', strtotime("0000-$mois-01"));
                        $cumul += $nbre;
                        $img_totale_cumul[$annee_mois] = $cumul;

                        if (!isset($dates[$annee][$mois])) {
                                $annees[] = (!isset($dates[$annee]) ? $annee : '');
                                $les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
                                // Ajouter au tableau dates tjrs à la fin
                                $dates[$annee][$mois] = 1;
                        }
                }

                // Post traitement des données
                $titre = "Évolution des images liées aux observations par mois";
                $valeurs_y = implode(',', $img_totale);
                $valeurs_r = implode(',', $img_totale_cumul);
                $valeurs_max_y = max($img_totale);
                $valeurs_max_r = max($img_totale_cumul);
                $y_val_fin = $valeurs_max_y;
                $y_pas = 200;
                $r_val_fin = $valeurs_max_r;
                $r_pas = 1000;
                $etiquettes_x1 = implode('|', $les_mois);
                $etiquettes_x2 = implode('|', $annees);
                $etiquettes_y = 'Images';

                // Construire de l'url de l'image
                $graph = array('cht' => 'lc',
                        'chtt'  => $titre,
                        'chs'   => '600x200',
                        'chco'  => '007F00,99CC00',
                        'chd'   => 't:'.$valeurs_y.'|'.$valeurs_r,
                        'chds'  => "0,$valeurs_max_y,0,$valeurs_max_r",
                        'chxt'  => 'y,y,x,x,r',
                        'chxl'  => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'',
                        'chxp'  => '1,50|3,0',
                        'chxr'  => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas",
                        'chm'   => 'N ** ,000000,0,-1,8,1.0,ht',
                        'chxs'  => '0,007F00|4,99CC00');
                return $graph;
        }

        private function getEvolImgParMois($param) {
                $utilisateur = isset($_GET['utilisateur']) ? Cel::db()->quote($_GET['utilisateur']) : null;

                // Récupération des données
                $requete =      "SELECT DATE_FORMAT(date_creation, '%Y%m') AS periode, COUNT(id_image) AS nbre ".
                        "FROM cel_images ".
                        "WHERE date_creation != '0000-00-00 00:00:00' ".
                        ((isset($utilisateur)) ? " AND courriel_utilisateur = $utilisateur " : '').
                        'GROUP BY periode '.
                        'ORDER BY periode ';

                $resulats = Cel::db()->requeter($requete);

                $img_totale = array();
                foreach ($resulats as $info) {
                        $img_totale[$info['periode']] = $info['nbre'];
                }

                // Trie des dates pour les étiquettes des axes
                $dates = array();
                $annees = array();
                $les_mois = array();
                $pas = 1; // intervalle de mois entre deux étiquettes
                $periode = 0;
                $cumul = 0;
                $img_totale_cumul = array();
                foreach ($img_totale as $annee_mois => $nbre) {
                        $annee = substr($annee_mois, 0, 4);
                        $mois = substr($annee_mois, 4, 2);
                        $mois_fmt_B = strftime('%b', strtotime("0000-$mois-01"));
                        $cumul += $nbre;
                        $img_totale_cumul[$annee_mois] = $cumul;

                        if (!isset($dates[$annee][$mois])) {
                                $annees[] = (!isset($dates[$annee]) ? $annee : '');
                                $les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
                                // Ajouter au tableau dates tjrs à la fin
                                $dates[$annee][$mois] = 1;
                        }
                }

                // Post traitement des données
                $titre = "Évolution du dépôt d'images par mois";
                $valeurs_y = implode(',', $img_totale);
                $valeurs_r = implode(',', $img_totale_cumul);
                $valeurs_max_y = max($img_totale);
                $valeurs_max_r = max($img_totale_cumul);
                $y_val_fin = $valeurs_max_y;
                $y_pas = 500;
                $r_val_fin = $valeurs_max_r;
                $r_pas = 1000;
                $etiquettes_x1 = implode('|', $les_mois);
                $etiquettes_x2 = implode('|', $annees);
                $etiquettes_y = 'Images';

                // Construire de l'url de l'image
                $graph = array('cht' => 'lc',
                        'chtt'  => $titre,
                        'chs'   => '600x200',
                        'chco'  => '007F00,99CC00',
                        'chd'   => 't:'.$valeurs_y.'|'.$valeurs_r,
                        'chds'  => "0,$valeurs_max_y,0,$valeurs_max_r",
                        'chxt'  => 'y,y,x,x,r',
                        'chxl'  => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'',
                        'chxp'  => '1,50|3,0',
                        'chxr'  => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas",
                        'chm'   => 'h,C3C3C3,0,0.5,1,-1|N ** ,000000,0,-1,8,1.0,ht',
                        'chxs'  => '0,007F00|4,99CC00');
                return $graph;
        }

        private function getEvolUtilisateurParMois($param) {
                // Récupération des données
                $requete =      'SELECT  DISTINCT courriel_utilisateur , '.
                                        '       MIN(date_creation) AS date_min, MAX(date_creation) AS date_max, '.
                                        '       COUNT(id_observation) AS obs_nbre '.
                                        'FROM cel_obs '.
                                        "WHERE date_creation != '0000-00-00 00:00:00' ".
                                        "       AND courriel_utilisateur LIKE '%@%' ".
                                        'GROUP BY courriel_utilisateur '.
                                        'ORDER BY date_min ASC ';
                $resultats = Cel::db()->requeter($requete);

                // Trie des données et des dates pour les étiquettes des axes
                $dates = array();
                $annees = array();
                $utilisateurs = array();
                $les_mois = array();
                $pas = 2; // intervalle de mois entre deux étiquettes
                $periode = 0;
                foreach ($resultats as $enrg) {
                        $annee = substr($enrg['date_min'], 0, 4);
                        $mois = substr($enrg['date_min'], 5, 2);
                        $mois_fmt_B = strftime('%b', strtotime("0000-$mois-01"));

                        if (!isset($dates[$annee][$mois])) {
                                $annees[] = (!isset($dates[$annee]) ? $annee : '');
                                $les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
                                $utilisateurs["$annee-$mois"] = 1;
                                // Ajouter au tableau dates tjrs à la fin
                                $dates[$annee][$mois] = 1;
                        } else {
                                $utilisateurs["$annee-$mois"]++;
                        }
                }

                // Post traitement des données
                $titre = 'Évolution des utilisateurs par mois';
                $valeurs = implode(',', $utilisateurs);
                $valeurs_max = max($utilisateurs);
                $y_val_fin = $valeurs_max;
                $y_pas = 5;
                $etiquettes_x1 = implode('|', $les_mois);
                $etiquettes_x2 = implode('|', $annees);
                $etiquettes_y = 'Utilisateurs';

                // Construire de l'url de l'image
                $graph = array('cht' => 'lc',
                        'chtt'  => $titre,
                        'chs'   => '600x200',
                        'chco'  => '0000FF',//4D89F9
                        'chd'   => 't:'.$valeurs,
                        'chds'  => '0,'.$valeurs_max,
                        'chxt'  => 'y,y,x,x',
                        'chxl'  => '1:|'.$etiquettes_y.'|3:|'.$etiquettes_x2.'|2:|'.$etiquettes_x1.'',
                        'chxp'  => '1,50|3,0',
                        'chxr'  => "0,0,$y_val_fin,$y_pas",
                        'chm'   => 'h,C3C3C3,0,0.5,1,-1|N ** ,000000,0,2::2,8,1.0,ht',
                        'chxs'  => '0,0000FF|1,0000FF');
                return $graph;
        }

        private function getEvolObsParMoisGlissant($param) {
                // Récupération des données
                $format_date = '%Y%m%d';
                $where = 'date_creation > DATE_SUB(NOW(), INTERVAL 31 DAY)';
                $obs_totale = $this->executerRequeteEvol('cel_obs', 'id_observation', $format_date, $where);

                // Tri des dates pour les étiquettes des axes
                $dates = array();
                $annees = array();
                $annees_mois = array();
                $jours = array();
                foreach ($obs_totale as $annee_mois_jours => $nbre) {
                        $annee = substr($annee_mois_jours, 0, 4);
                        $mois = substr($annee_mois_jours, 4, 2);
                        $jour = substr($annee_mois_jours, 6, 2);
                        $annee_mois_fmt_B = strftime('%B %Y', mktime(0, 0, 0, $mois, 1, $annee));

                        if (!isset($dates[$annee][$mois][$jour])) {
                                $annees_mois[] = (!isset($dates[$annee][$mois]) ? $annee_mois_fmt_B : '');
                                $jours[] = $jour;
                                // Ajouter au tableau dates tjrs à la fin
                                $dates[$annee][$mois][$jour] = 1;
                        }
                }

                // Post traitement des données
                $titre = 'Évolution des observations sur un mois glissant';
                $valeurs_max = max($obs_totale);
                $valeurs = implode(',', $obs_totale);
                $y_val_fin = $valeurs_max;
                $y_pas = round($valeurs_max / 6);
                $etiquettes_x1 = implode('|', $jours);
                $etiquettes_x2 = implode('|', $annees_mois);
                $etiquettes_y2 = 'Observations';

                // Construire de l'url de l'image
                $graph = array('cht' => 'lc',
                        'chtt'  =>      $titre,
                        'chs'   =>      '600x200',
                        'chco'  =>      '822013',
                        'chd'   =>      't:'.$valeurs,
                        'chds'  =>      '0,'.$valeurs_max,
                        'chxt'  =>      'y,y,x,x',
                        'chxl'  =>      '1:|'.$etiquettes_y2.'|2:|'.$etiquettes_x1.'|3:|'.$etiquettes_x2,
                        'chxp'  =>      '0,0|1,50',
                        'chxr'  =>      "0,0,$y_val_fin,$y_pas",
                        'chm'   => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht',
                        'chxs'  => '0,822013|1,822013');

                return $graph;
        }

        private function getEvolObsParMois($param) {
                // Récupération des données
                $obs_totale = $this->executerRequeteEvol('cel_obs', 'id_observation');

                // Trie des dates pour les étiquettes des axes
                $dates = array();
                $annees = array();
                $les_mois = array();
                $pas = 3; // intervalle de mois entre deux étiquettes
                $periode = 0;
                $cumul = 0;
                $obs_totale_cumul = array();
                foreach ($obs_totale as $annee_mois => $nbre) {
                        $annee = substr($annee_mois, 0, 4);
                        $mois = substr($annee_mois, 4, 2);
                        $mois_fmt_B = strftime('%b', strtotime("0000-$mois-01"));
                        $cumul += $nbre;
                        $obs_totale_cumul[$annee_mois] = $cumul;

                        if (!isset($dates[$annee][$mois])) {
                                $annees[] = (!isset($dates[$annee]) ? $annee : '');
                                $les_mois[] = is_int($periode++ / $pas) ? $mois_fmt_B : '';
                                // Ajouter au tableau dates tjrs à la fin
                                $dates[$annee][$mois] = 1;
                        }
                }

                // Post traitement des données
                $titre = 'Évolution des observations par mois';
                $valeurs_y = implode(',', $obs_totale);
                $valeurs_r = implode(',', $obs_totale_cumul);
                $valeurs_max_y = max($obs_totale);
                $valeurs_max_r = max($obs_totale_cumul);
                $y_val_fin = $valeurs_max_y;
                $y_pas = round(($valeurs_max_y / 6), 0);
                $r_val_fin = $valeurs_max_r;
                $r_pas = round(($valeurs_max_r / 6), 0);
                $etiquettes_x1 = implode('|', $les_mois);
                $etiquettes_x2 = implode('|', $annees);
                $etiquettes_y2 = 'Observations';
                $etiquettes_r2 = 'Cumul obs.';

                // Construire de l'url de l'image
                $graph = array('cht' => 'lc',
                        'chtt'  => $titre,
                        'chs'   => '600x200',
                        'chco'  => '822013,F1841D',
                        'chd'   => 't:'.$valeurs_y.'|'.$valeurs_r,
                        'chds'  => "0,$valeurs_max_y,0,$valeurs_max_r",
                        'chxt'  => 'y,y,x,x,r,r',
                        'chxl'  => '1:|'.$etiquettes_y2.'|2:|'.$etiquettes_x1.'|3:|'.$etiquettes_x2.'|5:|'.$etiquettes_r2.'',
                        'chxp'  => '1,50|3,0|5,50',
                        'chxr'  => "0,0,$y_val_fin,$y_pas|4,0,$r_val_fin,$r_pas",
                        'chm'   => 'N ** ,000000,0,2::2,8,1.0,ht',
                        'chxs'  => '0,822013|1,822013|4,F1841D|5,F1841D');
                return $graph;
        }

        private function getEvolObsParAn($param) {
                // Récupération des données
                $obs_totale = $this->executerRequeteEvol('cel_obs', 'id_observation', '%Y');

                // Trie des dates pour les étiquettes des axes
                $dates = array();
                $annees = array();
                foreach ($obs_totale as $annee => $nbre) {
                        if (!isset($dates[$annee])) {
                                $annees[] = $annee;
                                $dates[$annee] = 1;
                        }
                }

                // Post traitement des données
                $titre = 'Évolution des observations par année';
                $valeurs = implode(',', $obs_totale);
                $valeurs_max = max($obs_totale);
                $valeurs_min = min($obs_totale);
                $y_val_deb = preg_replace('/[0-9]{2}$/', '00', $valeurs_min);
                $y_val_fin = $valeurs_max;
                $y_pas = round(($valeurs_max / 6), 0);
                $etiquettes_x = implode('|', $annees);;
                $etiquettes_y = 'Observations';

                // Construire de l'url de l'image
                $graph = array('cht' => 'lc',
                        'chtt'  => $titre,
                        'chs'   => '600x200',
                        'chco'  => '822013',
                        'chd'   => 't:'.$valeurs,
                        'chds'  => "$valeurs_min,$valeurs_max",
                        'chxt'  => 'y,y,x',
                        'chxl'  => '1:|'.$etiquettes_y.'|2:|'.$etiquettes_x.'',
                        'chxp'  => '0,0|1,50|2,0',
                        'chxr'  => "0,$y_val_deb,$y_val_fin,$y_pas",
                        'chm'   => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,1::1,8,1.0,ht',
                        'chxs'  => '0,822013|1,822013');
                return $graph;
        }

        private function getEvolObsHisto($param) {
                // Récupération des données
                $obs_totale = $this->executerRequeteEvol('cel_obs', 'id_observation');
                $obs_identifiee = $this->executerRequeteEvol('cel_obs', 'id_observation', "courriel_utilisateur LIKE '%@%' ");
                $lignes = array('total', 'obs. identifiée');

                // Post traitement des données
                $titre = 'Évolution des observations';
                $valeurs = implode(',', $obs_totale).'|'.implode(',', $obs_identifiee);
                $valeurs_max = max($obs_totale);
                $etiquettes = implode('|', array_keys($lignes));

                // Construire de l'url de l'image
                $graph = array('cht' => 'lc',
                        'chtt'  => $titre,
                        'chs'   => '500x300',
                        'chco'  => 'FF0000,00FF00',
                        'chd'   => 't:'.$valeurs,
                        'chds'  => "0,$valeurs_max",
                        'chxt'  => 'y',
                        'chxl'  => '0:|'.$etiquettes.'',
                        'chm'   => 'N,000000,0,-1,10');
                return $graph;
        }

        private function getNbreObsIdVsTest($param) {
                // Récupération des données
                $obs_totale = $this->executerRequeteNombre('cel_obs', 'id_observation');
                $obs_identifiee = $this->executerRequeteNombre('cel_obs', 'id_observation', "courriel_utilisateur LIKE '%@%' ");
                $obs_test = $obs_totale - $obs_identifiee;
                $pourcent_identifiee = round(($obs_identifiee / ($obs_totale / 100)), 2).'%';
                $pourcent_anonyme = round(($obs_test / ($obs_totale / 100)), 2).'%';

                // Post traitement des données de la base de données
                $titre = "Nombre d'observations|tests vs. identifiées";
                $etiquette_obs_test = "tests ($obs_test - $pourcent_anonyme)";
                $etiquette_obs_id = "identifiées ($obs_identifiee - $pourcent_identifiee)";
                $donnees = array($etiquette_obs_test => $obs_test, $etiquette_obs_id => $obs_identifiee);
                $valeurs = implode(',', $donnees);
                $etiquettes = implode('|', array_keys($donnees));

                // Construire les paramêtres de l'url de l'image
                $graph = array('cht' => 'p3',
                        'chtt'  => $titre,
                        'chs'   => '250x200',
                        'chco'  => 'FF0000,00FF00',
                        'chd'   => 't:'.$valeurs,
                        'chds'  => "0,$obs_totale",
                        'chdl'  => $etiquettes,
                        'chdlp' => 'bv|r',
                        'chts'  => '000000,12');
                return $graph;
        }

        private function getNbreObsPublicVsPrivee($param) {
                // Récupération des données
                $obs_totale = $this->executerRequeteNombre('cel_obs', 'id_observation');
                $obs_public = $this->executerRequeteNombre('cel_obs', 'id_observation', 'transmission = 1');
                $obs_privee = $obs_totale - $obs_public;
                $pourcent_privee = round(($obs_privee / ($obs_totale / 100)), 2).'%';
                $pourcent_public = round(($obs_public / ($obs_totale / 100)), 2).'%';

                // Post traitement des données de la base de données
                $titre = "Nombre d'observations|publiques vs. privées";
                $etiquette_obs_public = "publiques ($obs_public - $pourcent_public)";
                $etiquette_obs_privee = "privées ($obs_privee - $pourcent_privee)";
                $donnees = array($etiquette_obs_privee => $obs_privee, $etiquette_obs_public => $obs_public);
                $valeurs = implode(',', $donnees);
                $etiquettes = implode('|', array_keys($donnees));

                // Construire les paramêtres du graph
                $graph = array('cht' => 'p3',
                        'chtt'  => $titre,
                        'chs'   => '250x200',
                        'chco'  => 'FF0000,00FF00',
                        'chd'   => 't:'.$valeurs,
                        'chds'  => "0,$obs_totale",
                        'chdl'  => $etiquettes,
                        'chdlp' => 'bv|r',
                        'chts'  => '000000,12');
                return $graph;
        }

        private function getNbreObsDetermineeVsInconnue($param) {
                // Récupération des données
                $obs_totale = $this->executerRequeteNombre('cel_obs', 'id_observation');
                $obs_determinee = $this->executerRequeteNombre('cel_obs', 'id_observation', 'nom_sel_nn != 0');
                $obs_inconnue = $obs_totale - $obs_determinee;
                $pourcent_determinee = round(($obs_determinee / ($obs_totale / 100)), 2).'%';
                $pourcent_inconnue = round(($obs_inconnue / ($obs_totale / 100)), 2).'%';

                // Post traitement des données de la base de données
                $titre = "Nombre d'observations|determinées vs. inconnues";
                $etiquette_obs_determinee = "determinées ($obs_determinee - $pourcent_determinee)";
                $etiquette_obs_inconnue = "non déterminées ($obs_inconnue - $pourcent_inconnue)";
                $donnees = array($etiquette_obs_inconnue => $obs_inconnue, $etiquette_obs_determinee => $obs_determinee);
                $valeurs = implode(',', $donnees);
                $etiquettes = implode('|', array_keys($donnees));

                // Construire les paramêtres du graph
                $graph = array('cht' => 'p3',
                        'chtt'  => $titre,
                        'chs'   => '250x200',
                        'chco'  => 'FF0000,00FF00',
                        'chd'   => 't:'.$valeurs,
                        'chds'  => "0,$obs_totale",
                        'chdl'  => $etiquettes,
                        'chdlp' => 'bv|r',
                        'chts'  => '000000,12');
                return $graph;
        }

        private function getNbreObsAvecIndicationGeo($param) {
                // Récupération des données
                $total = $this->executerRequeteNombre('cel_obs', 'id_observation');
                $where_commune = $this->creerWhereIndicationGeo('zone_geo');
                $obs['commune'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_commune);
                $where_commune_id = $this->creerWhereIndicationGeo('ce_zone_geo');
                $obs['commune identifiée'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_commune_id);
                $where_lieudit = $this->creerWhereIndicationGeo('lieudit');
                $obs['lieu-dit'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_lieudit);
                $where_station = $this->creerWhereIndicationGeo('station');
                $obs['station'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_station);
                $where_milieu = $this->creerWhereIndicationGeo('milieu');
                $obs['milieu'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_milieu);
                $where_xy = $this->creerWhereIndicationGeo('latitude').' AND '.$this->creerWhereIndicationGeo('longitude');
                $obs['coordonnée'] = $this->executerRequeteNombre('cel_obs', 'id_observation', $where_xy);

                $donnees = array();
                $num = 1;
                foreach ($obs as $etiquette => $nbre) {
                        $pourcent = round(($obs[$etiquette] / ($total / 100)), 1).'%';
                        $legende = "$num : $etiquette ($nbre - $pourcent)";
                        $donnees['valeurs'][] = $nbre;
                        $donnees['etiquettes'][] = $num++;
                        $donnees['legendes'][] = $legende;
                }


                // Post traitement des données de la base de données
                $titre = "Nombre d'observations|avec indications géographiques";
                $valeurs = implode(',', $donnees['valeurs']);
                $etiquettes = implode('|', $donnees['etiquettes']);
                $legendes = implode('|', $donnees['legendes']);

                // Construire les paramêtres du graph
                $graph = array('cht' => 'rs',
                        'chtt'  => $titre,
                        'chs'   => '600x300',
                        'chco'  => 'FFFFFF',
                        'chd'   => 't:'.$valeurs,
                        'chds'  => "0,$total",
                        'chdl'  => $legendes,
                        'chxt'  => 'x',
                        'chxl'  => "0:|$etiquettes",
                        //'chxp'        => '1,0,20,40,60,80,100',// Grille sous forme de cible
                        'chm'   => 'B,FF000080,0,1.0,5.0');
                return $graph;
        }

        private function creerWhereIndicationGeo($champ) {
                $where = null;
                if (isset($champ)) {
                        $where = "$champ != '000null' ".
                                "AND $champ != '' ".
                                "AND $champ IS NOT NULL ";
                }
                return $where;
        }

        private function getUtilisationJournaliere($param) {
                // Sur quel jour, voulons nous estimer l'utilisation
                $aujourdhui = date('Y-m-d');
                if (isset($param[0]) && preg_match('/^[0-9]{4}(?:-[0-9]{2}){2}$/', $param[0])) {
                        $aujourdhui = $param[0];
                }
                $aujourdhui_fmt = strftime('%d %b %Y', strtotime($aujourdhui));

                // Récupération des données
                $max_obs = array();
                $max_obs[] = $this->executerRequeteEvol('cel_obs', 'id_observation', '%Y%m%d',
                        "date_creation NOT LIKE '$aujourdhui%' ", 'date_creation');
                $max_obs[] = $this->executerRequeteEvol('cel_obs', 'id_observation', '%Y%m%d',
                        "date_modification NOT LIKE '$aujourdhui%' ", 'date_modification');
                $max_obs[] = $this->executerRequeteEvol('cel_obs', 'id_observation', '%Y%m%d',
                        "date_transmission NOT LIKE '$aujourdhui%' ", 'date_transmission');
                $obs_aujourdhui = $this->executerRequeteNombre('cel_obs', 'id_observation',
                        "(date_creation LIKE '$aujourdhui%'
                                OR date_modification LIKE '$aujourdhui%'
                                OR date_transmission LIKE '$aujourdhui%') ");

                // Cummul des obs crées, modifiées, transmises par jour
                $donnees = array();
                foreach ($max_obs as $obs_par_jour) {
                        foreach ($obs_par_jour as $annee_mois_jour => $nbre) {
                                if (!isset($donnees[$annee_mois_jour])) {
                                        $donnees[$annee_mois_jour] = $nbre;
                                } else {
                                        $donnees[$annee_mois_jour] += $nbre;
                                }
                        }
                }

                // Post traitement des données
                $valeur = $obs_aujourdhui;
                $valeur_max = 400;
                if ($valeur > $valeur_max) {
                        $pourcentage = 100;
                } else {
                        $pourcentage = round(($valeur / ($valeur_max / 100)), 0);
                }
                $etiquettes_x = $aujourdhui_fmt;
                $etiquettes_y = "faible|moyenne|forte";
                $titre = "Intensité d'utilisation pour le $aujourdhui_fmt";
                $legende = "$valeur changements";

                // Construire de l'url de l'image
                $graph = array('cht' => 'gom',
                        'chtt'  => $titre,
                        'chdl'  => "$legende",
                        'chdlp' => 'b',
                        'chs'   => '350x200',
                        'chco'  => 'FFFF00,0A7318',
                        'chls'  => '3|10',
                        'chma'  => '0,0,0,0|300,40',
                        'chd'   => 't:'.$pourcentage,
                        'chxt'  => 'x,y',
                        'chxl'  => '0:|'.$etiquettes_x.'|1:|'.$etiquettes_y.'',
                        'chxp'  => '0,50');
                return $graph;
        }

        private function getNbreObsParUtilisateur($param) {
                // Récupération des données
                $requete =      'SELECT courriel_utilisateur, COUNT(id_observation) AS nbre '.
                                        'FROM cel_obs '.
                                        'GROUP BY courriel_utilisateur ';
                $utilisateurs = Cel::db()->requeter($requete);

                // Création des classes d'utilisateurs
                $classes = array('00->10' => 0, '11->50' => 0, '51->100' => 0, '101->500' => 0, '500->∞' => 0);
                $donnees['Utilisateurs'] = $classes;
                $valeur_max = 0;
                foreach ($utilisateurs as $utilisateur) {
                        $id = $utilisateur['courriel_utilisateur'];
                        $nbre = $utilisateur['nbre'];

                        // Détermination de la classe
                        $classe = '';
                        if (0 < $nbre && $nbre <= 10) {
                                $classe = '00->10';
                        } else if (10 < $nbre && $nbre <= 50) {
                                $classe = '11->50';
                        } else if (50 < $nbre && $nbre <= 100) {
                                $classe = '51->100';
                        } else if (100 < $nbre && $nbre <= 500) {
                                $classe = '101->500';
                        } else if (500 < $nbre) {
                                $classe = '500->∞';
                        }

                        // Détermination du type d'utilisateur
                        if (strstr($id, '@')) {
                                $type = 'Utilisateurs';
                                // Incrémentation du tableau de données et récupration de la valeur max
                                $donnees[$type][$classe]++;
                                if ($donnees[$type][$classe] > $valeur_max) {
                                        $valeur_max = $donnees[$type][$classe];
                                }
                        }
                }

                // Post traitement des données
                $titre = "Nombre d'observations par utilisateur";
                $y1_val_fin = $valeur_max;
                $y1_pas = '100';
                $valeurs = implode(',', $donnees['Utilisateurs']);
                $etiquettes_x1 = implode('|', array_keys($classes));
                $etiquettes_x2 = 'Observations';
                $etiquettes_y2 = 'Utilisateurs';
                $legendes = implode('|', array_keys($donnees));

                // Construire de l'url de l'image
                $graph = array('cht' => 'bvg',
                        'chtt'  => $titre,
                        'chs'   => '400x200',
                        'chco'  => '00FF00,FF0000',
                        'chbh'  => 'r,0.3,1',
                        'chd'   => 't:'.$valeurs,
                        'chds'  => "0,$valeur_max",
                        'chxt'  => 'x,x,y,y',
                        'chxl'  => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|3:|'.$etiquettes_y2.'',
                        'chxp'  => '1,100|3,100',
                        'chxr'  => "2,0,$y1_val_fin,$y1_pas",
                        'chm'   => 'h,C3C3C3,0,0.5,1,-1|N,000000,0,0::1,8,1.0,e');
                //echo '<pre>'.print_r($graph,true).'</pre>';
                return $graph;
        }

        private function getNbreObsParUtilisateurEtTest($param) {
                // Récupération des données
                $requete =      'SELECT courriel_utilisateur, COUNT(id_observation) AS nbre '.
                                        'FROM cel_obs '.
                                        'GROUP BY courriel_utilisateur ';
                $utilisateurs = Cel::db()->requeter($requete);

                // Création des classes d'utilisateurs
                $classes = array('00->10' => 0, '11->50' => 0, '51->100' => 0, '101->500' => 0, '500->∞' => 0);
                $donnees['Utilisateurs'] = $classes;
                $donnees['Tests'] = $classes;
                $valeur_max = 0;
                foreach ($utilisateurs as $utilisateur) {
                        $id = $utilisateur['courriel_utilisateur'];
                        $nbre = $utilisateur['nbre'];

                        // Détermination de la classe
                        $classe = '';
                        if (0 < $nbre && $nbre <= 10) {
                                $classe = '00->10';
                        } else if (10 < $nbre && $nbre <= 50) {
                                $classe = '11->50';
                        } else if (50 < $nbre && $nbre <= 100) {
                                $classe = '51->100';
                        } else if (100 < $nbre && $nbre <= 500) {
                                $classe = '101->500';
                        } else if (500 < $nbre) {
                                $classe = '500->∞';
                        }

                        // Détermination du type d'utilisateur
                        if (strstr($id, '@')) {
                                $type = 'Utilisateurs';
                        } else {
                                $type = 'Tests';
                        }

                        // Incrémentation du tableau de données et récupration de la valeur max
                        $donnees[$type][$classe]++;
                        if ($donnees[$type][$classe] > $valeur_max) {
                                $valeur_max = $donnees[$type][$classe];
                        }
                }

                // Post traitement des données
                $titre = "Nombre d'observations par utilisateur et test";
                $y1_val_fin = $valeur_max;
                $y1_pas = '100';
                $valeurs = implode(',', $donnees['Utilisateurs']).'|'.implode(',', $donnees['Tests']);
                $etiquettes_x1 = implode('|', array_keys($classes));
                $etiquettes_x2 = 'Observations';
                $etiquettes_y2 = 'Utilisateurs';
                $legendes = implode('|', array_keys($donnees));

                // Construire de l'url de l'image
                $graph = array('cht' => 'bvg',
                        'chtt'  => $titre,
                        'chs'   => '400x200',
                        'chco'  => '00FF00,FF0000',
                        'chbh'  => 'r,0.3,1',
                        'chd'   => 't:'.$valeurs,
                        'chds'  => "0,$valeur_max",
                        'chxt'  => 'x,x,y,y',
                        'chxl'  => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|3:|'.$etiquettes_y2.'',
                        'chxp'  => '1,100|3,100',
                        'chxr'  => "2,0,$y1_val_fin,$y1_pas",
                        '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',
                        'chdl'  => $legendes,
                        'chdlp' => 'b');
                //echo '<pre>'.print_r($graph,true).'</pre>';
                return $graph;
        }

        private function getNuagePointsObsParHeureEtJourSemaine($param) {
                $utilisateur = isset($_GET['utilisateur']) ? Cel::db()->quote($_GET['utilisateur']) : false;

                // Récupération des données de la base
                $requete =      'SELECT courriel_utilisateur, DATE_FORMAT(date_creation, "%w-%H") AS periode, (ROUND(LOG10(COUNT(id_observation))) + 1) AS nbre '.
                                        'FROM cel_obs '.
                                        'WHERE date_creation != "0000-00-00 00:00:00" '.
                                        '       AND courriel_utilisateur '.($utilisateur ? "= $utilisateur " : 'LIKE "%@%" ').
                                        'GROUP BY periode, courriel_utilisateur ';
                $infos = Cel::db()->requeter($requete);

                // Traitement résulat requête
                $observations = array();
                foreach ($infos as $info) {
                        if (isset($observations[$info['periode']])) {
                                $observations[$info['periode']] += $info['nbre'];
                        } else {
                                $observations[$info['periode']] = $info['nbre'];
                        }
                }

                // Postraitement des données
                // Jour de la semaine
                $donnees['joursSemaine'] = array();
                for ($njs = 0; $njs < 7; $njs++) {
                        $donnees['joursSemaine'][] = strftime('%A', strtotime('2010-05-'.(16+$njs)));
                }
                // Heure
                $donnees['heures'] = array();
                for ($h = 0; $h < 24; $h++) {
                        $heure_fmt = sprintf('%02s', $h);// Format numérique 00
                        $donnees['heures'][] = strftime('%H', strtotime("0000-00-00 $heure_fmt:00:00"));
                }
                // Nbre
                $valeur_max = max($observations);
                for ($njs = 0; $njs < 7; $njs++) {
                        for ($h = 0; $h < 24; $h++) {
                                $hfmt = sprintf('%02s', $h);// Format numérique 00
                                $periode = $njs.'-'.$hfmt;
                                $donnees['valeurs_x'][] = round(($h + 1) * (100 / 24), 0);
                                $donnees['valeurs_y'][] = round(($njs + 1) * (100 / 7), 0);
                                $ps = 0;
                                if (isset($observations[$periode])) {
                                        $ps = round($observations[$periode] * (100 / $valeur_max), 0);
                                }
                                $donnees['valeurs_ps'][] = $ps;
                        }
                }
                //echo '<pre>'.print_r($donnees,true).'</pre>';
                // Préparation des paramêtres du graph
                $titre = "Nombre de création d'observation|par heure et jour de la semaine";
                $valeurs = implode(',', $donnees['valeurs_x'])."|".implode(',', $donnees['valeurs_y'])."|".implode(',', $donnees['valeurs_ps']);
                $etiquettes_x1 = '|'.implode('|', $donnees['heures']);
                $etiquettes_x2 = 'Heures';
                $etiquettes_y1 = '|'.implode('|', $donnees['joursSemaine']);
                $x_axis_step_size = str_replace(',', '.', (100 / 24));
                $y_axis_step_size = str_replace(',', '.', (100 / 7));

                // Construction du tableau des paramêtres du graph
                $graph = array('cht' => 's',
                        'chtt'  => $titre,
                        'chs'   => '400x200',
                        'chco'  => '00FF00',
                        'chd'   => 't:'.$valeurs,
                        'chxt'  => 'x,x,y',
                        'chxr'  => "0,-1,23,1|2,-1,6,1",
                        'chxp'  => '1,100',
                        'chxl'  => '0:|'.$etiquettes_x1.'|1:|'.$etiquettes_x2.'|2:|'.$etiquettes_y1.'',
                        'chg'   => "$x_axis_step_size,$y_axis_step_size,1,5");
                //echo '<pre>'.print_r($graph,true).'</pre>';
                return $graph;
        }

        private function getNuagePointsObsAnciennete($param) {
                // Récupération des données de la base
                $requete =      'SELECT  DISTINCT courriel_utilisateur , '.
                                        '       MIN(date_creation) AS date_min, MAX(date_creation) AS date_max, '.
                                        '       COUNT(id_observation) AS obs_nbre '.
                                        'FROM cel_obs '.
                                        "WHERE date_creation != '0000-00-00 00:00:00' ".
                                        "       AND courriel_utilisateur LIKE '%@%' ".
                                        'GROUP BY courriel_utilisateur '.
                                        'ORDER BY date_min ASC ';
                $resultats = Cel::db()->requeter($requete);

                // Trie des données
                $max_obs = 0;
                $max_obs_log = 0;
                $max_anciennete = 0;
                $donnees = array();
                foreach ($resultats as $enrg) {
                        $tps_deb = strtotime($enrg['date_min']);
                        $tps_fin = strtotime($enrg['date_max']);

                        $donnee = array();
                        if (($tps_fin - $tps_deb) == 0) {
                                $donnee['anciennete'] = 1;
                        } else {
                                $donnee['anciennete'] = round((($tps_fin - $tps_deb) / 86400), 0);
                        }
                        $donnee['obs'] = $enrg['obs_nbre'];
                        $donnee['obs_log'] = log10($enrg['obs_nbre']);
                        $donnees[] = $donnee;

                        $max_obs_log = ($donnee['obs_log'] > $max_obs_log) ? $donnee['obs_log'] : $max_obs_log;
                        $max_obs = ($donnee['obs'] > $max_obs) ? $donnee['obs'] : $max_obs;
                        $max_anciennete = ($donnee['anciennete'] > $max_anciennete) ? $donnee['anciennete'] : $max_anciennete;
                }

                // Postraitement des données
                foreach ($donnees as $donnee) {
                        $donnees['valeurs_x'][] = round($donnee['anciennete'] * (100 / $max_anciennete), 0);
                        $donnees['valeurs_y'][] = round($donnee['obs_log'] * (100 / $max_obs_log), 0);
                        $donnees['valeurs_ps'][] = 20;
                }

                // Échelle log des obs
                $donnees['echelle_y1'] = array();
                $pas = $max_obs_log / 100 ;
                for ($i = 0 ; $i < 5 ; $i++) {
                        $donnees['echelle_y1'][] = round(pow(10, (($i*20) * $pas)), 0);
                }
                $donnees['echelle_y1'][] = $max_obs;

                //echo '<pre>'.print_r($donnees['valeurs_x'],true).'</pre>';
                // Préparation des paramêtres du graph
                $titre = "Répartition des utilisateurs en fonction|du nombre d'observations et de l'ancienneté";
                $valeurs = implode(',', $donnees['valeurs_x'])."|".implode(',', $donnees['valeurs_y'])."|".implode(',', $donnees['valeurs_ps']);
                $etiquettes_x2 = 'Ancienneté en jours';
                $etiquettes_y1 = implode('|', $donnees['echelle_y1']);
                $etiquettes_y2 = 'Observations';
                $x_axis_step_size = $max_anciennete;

                // Construction du tableau des paramêtres du graph
                $graph = array('cht' => 's',
                        'chtt'  => $titre,
                        'chs'   => '400x200',
                        'chco'  => '0000FF',
                        'chxt'  => 'x,x,y,y',
                        'chd'   => 't:'.$valeurs,
                        'chxr'  => "0,0,$x_axis_step_size|2,0,$max_obs",//|2,0,$y_axis_step_size,$pas
                        'chxp'  => '1,100|3,100',
                        'chm'   => 'h,C3C3C3,0,-0.2,0.2,-1',
                        'chxl'  => '1:|'.$etiquettes_x2.'|2:|'.$etiquettes_y1.'|3:|'.$etiquettes_y2.'');//
                //echo '<pre>'.print_r($graph,true).'</pre>';
                return $graph;
        }

        private function executerRequeteEvol($table, $champ, $format_date = '%Y%m', $where = null, $champ_date = 'date_creation', $order_by = null, $limit = null) {
                $utilisateur = isset($_GET['utilisateur']) ? Cel::db()->quote($_GET['utilisateur']) : false;

                $requete =      "SELECT DATE_FORMAT($champ_date, '$format_date') AS periode, COUNT($champ) AS nbre ".
                                        "FROM $table ".
                                        "WHERE $champ_date != '0000-00-00 00:00:00' ".
                                        (($utilisateur != false) ? " AND courriel_utilisateur = $utilisateur " : '').
                                        ((is_null($where)) ? '' : " AND $where ").
                                        'GROUP BY periode '.
                                        ((is_null($order_by)) ? '' : "ORDER BY $order_by ");
                                        ((is_null($limit)) ? '' : "LIMIT $limit ");

                $evolution = Cel::db()->requeter($requete);

                // Traitement du tableau
                $donnees_traitees = array();
                foreach ($evolution as $info) {
                        $donnees_traitees[$info['periode']] = $info['nbre'];
                }

                return $donnees_traitees;
        }

        private function executerRequeteNombre($table, $champ, $where = null) {
                $utilisateur = null;
                if (isset($_GET['utilisateur'])) {
                        $utilisateur = Cel::db()->quote($_GET['utilisateur']);
                        $where = isset($where) ? $where.' AND ' : '';
                        $where .= "courriel_utilisateur = $utilisateur ";
                }

                $requete =      "SELECT COUNT($champ) AS nbre ".
                                        "FROM $table ".
                                        ((isset($where)) ? "WHERE $where " : '');

                $nbre = Cel::db()->requeterValeurUnique($requete);
                return $nbre;
        }
}
?>