*@author Jean-Pascal MILCENT *@copyright Tela-Botanica 2000-2003 *@version 01 juillet 2002 // +-----------------------------------------------------------------------------------------------+ // // $Id: lib.carto.php,v 1.2 2005/03/11 15:18:45 alex Exp $ // FICHIER : $RCSfile: lib.carto.php,v $ // AUTEUR : $Author: alex $ // VERSION : $Revision: 1.2 $ // DATE : $Date: 2005/03/11 15:18:45 $ // // +-----------------------------------------------------------------------------------------------+ // A FAIRE : // 1.-Rendre cette classe indépendante de l'arborescence du site. // On trouve encore des urls ou des chemins d'accé au fichier codé en dur dans l'appli // Il faudrait pouvoir les paramétrés dans la classe. // 2.- Supprimer l'attribut $this->historiques qui doit être devenu complétement obscoléte et le // remplacer par $this->historique_cartes // 3.- Renomer $this->liste_zone_carte en quelque chose de plus parlant... */ //Inclusion d'un autre fichier de librairie include_once 'lib.couleur.php'; //Sert seulement en interne pour le débogage des requetes SQL $NOM_FICHIER = 'lib.carto.php'; //================================================================================================== // La classe Carto_HistoriqueCarte sert à pouvoir afficher les liens avec les carte précédentes // On accède à cette fonctionnalité grâce à la méthode afficherHistoriqueCarte() // L'objet Carto_HistoriqueCarte recoit en parametres : // -la généalogie du niveau ou on en est (du type monde*europe*france ) // -l'url du document // -en option : *le caractere de separation (par defaut c'est >) // *la classe css des liens //=================================================================================================== class Carto_HistoriqueCarte { var $historique; var $url; var $caractere_separation; var $class_css; var $nom; function Carto_HistoriqueCarte ($objet_carte, $caractere = '>', $class = '') { global $GS_GLOBAL; $this->historique = $objet_carte->historique; $this->url = $objet_carte->url; $this->nom = $objet_carte->nom; unset ($objet_carte); $this->caractere_separation = $caractere; $this->class_css = $class; }//Fin du constructeur Carto_HistoriqueCarte(). function afficherHistoriqueCarte () { $res=''; $tabonglet = explode ('*', $this->historique); $tabnom = explode ('*', $this->nom); foreach ($tabonglet as $key=>$value) { if ($key == 0) { $chemin = $value; } else { $chemin .= '*'.$value; } $res.= 'class_css)) { $res.='class="'.$this->class_css.'" '; } $res.='href="'.$this->url.'&historique_cartes='.$chemin.'"> '.$this->caractere_separation.' '.$tabnom[$key].''; } return $res; }//Fin de la méthode afficherHistoriqueCarte(). }//Fin de la classe Carto_HistoriqueCarte. //================================================================================================ //La classe Action sert a definir les paramètres nécessaires pour recueillir l'action a réaliser en // fonction des coordonnées du point, du masque et du niveau. //Elle remplace la fonction get_cartoAction() que l'on peut trouver dans le fichier carto_commun.php //des différentes application utilisant la carto. // Les champs a renseigner sont les suivants : // -le nom de la table ($nom_table_carto_action) où sont stokée les actions à réalisées // en fonction des couleurs // -les 5 champs principaux de la table : // -l'identifiant de la zone géographique (un nom, un numéro ou une abréviation) -> $nom_champ_cle // -les couleurs -> $nom_champ_rouge, $nom_champ_vert, $nom_champ_bleu // -l'action -> $nom_champ_action // Elle possède une seule méthode : get_cartoAction(). //================================================================================================ class Carto_Action { var $_table_zone_geo; var $_id_zone_geo_zone; var $_rouge; var $_vert; var $_bleu; var $_table_action; var $_id_carte_action; var $_id_zone_geo_action; var $_type_zone_geo_action; var $_action; var $_id_carte_destination; function Carto_Action ($table_zone_geo, $zone_chp_id_zone, $chp_rouge, $chp_vert, $chp_bleu, $table_carto_action, $action_chp_id_carte, $action_chp_id_zone, $action_chp_type_zone, $chp_action, $chp_destination) { $this->_table_zone_geo = $table_zone_geo; $this->_id_zone_geo_zone = $zone_chp_id_zone; $this->_rouge = $chp_rouge; $this->_vert = $chp_vert; $this->_bleu = $chp_bleu; $this->_table_action = $table_carto_action; $this->_id_carte_action = $action_chp_id_carte; $this->_id_zone_geo_action = $action_chp_id_zone; $this->_type_zone_geo_action = $action_chp_type_zone; $this->_action = $chp_action; $this->_id_carte_destination = $chp_destination; } //********************************************************************************************************** // Méthode get_cartoAction($imageX, $imageY, $masque, $id_carte) // Elle renvoit l'action a réaliser. // Nous passons les paramètres suivant : // -les coordonnees du point ($imageX et $imageY) // -le masque pour recuperer la couleur ($masque) // -l'identifiant de la carte où nous nous trouvons ($id_carte) //********************************************************************************************************** function _consulterActionImage($imageX, $imageY, $masque, $id_carte) { // Nous récuperons les valeurs RVB de la couleur sur laquelle l'utilisateur a cliqué. // Les valeurs RVB sont stockées dans le tableau associatif $valeurs_RVB. $masque_courant = imagecreatefrompng($masque); $index_couleur = imagecolorat($masque_courant,$imageX,$imageY); $valeurs_RVB = imagecolorsforindex($masque_courant, $index_couleur); // Nous effectuons une requete dans la table carto_ACTION pour récupérer la valeur // du champ "action", afin de savoir quoi faire. $requete = 'SELECT '.$this->_action.', '.$this->_id_carte_destination.', '.$this->_id_zone_geo_action. ' FROM '.$this->_table_action.', '.$this->_table_zone_geo. ' WHERE '.$this->_table_zone_geo.'.'.$this->_rouge.' = '.$valeurs_RVB['red']. ' AND '.$this->_table_zone_geo.'.'.$this->_vert.' = '.$valeurs_RVB['green']. ' AND '.$this->_table_zone_geo.'.'.$this->_bleu.' = '.$valeurs_RVB['blue']. ' AND '.$this->_table_action.'.'.$this->_id_zone_geo_action.' = '.$this->_table_zone_geo.'.'.$this->_id_zone_geo_zone. ' AND '.$this->_table_action.'.'.$this->_id_carte_action.' = "'.$id_carte.'"'; $resultat=mysql_query($requete) or die('

Erreur de requête

'. 'Requete : '.$requete. '

Erreur : '.mysql_error()); $ligne = mysql_fetch_object ($resultat); if (mysql_num_rows ($resultat) != 0) { $chp_id_zone_geo = $this->_id_zone_geo_action; $chp_action = $this->_action; $chp_id_carte_destination = $this->_id_carte_destination; $action['id_zone_geo'] = $ligne->$chp_id_zone_geo; $action['type_action'] = $ligne->$chp_action; $action['id_carte_destination'] = $ligne->$chp_id_carte_destination; return $action; } }//Fin de la méthode _consulterActionImage(). //********************************************************************************************************** // Méthode _consulterActionListe($id_zone_carte, $id_carte) // Elle renvoit l'action a réaliser. // Nous passons les paramètres suivant : // -l'identifiant de la zone que l'on veut afficher // -l'identifiant de la carte où nous nous trouvons ($id_carte) //********************************************************************************************************** function _consulterActionListe($id_zone_carte, $id_carte) { // Nous effectuons une requete dans la table carto_ACTION pour récupérer la valeur // du champ "action", afin de savoir quoi faire. $requete = 'SELECT '.$this->_action.', '.$this->_id_carte_destination.', '.$this->_id_zone_geo_action. ' FROM '.$this->_table_action.', '.$this->_table_zone_geo. ' WHERE '.$this->_table_action.'.'.$this->_id_zone_geo_action.' = '.$this->_table_zone_geo.'.'.$this->_id_zone_geo_zone. ' AND '.$this->_table_zone_geo.'.'.$this->_id_zone_geo_zone.' = "'.$id_zone_carte.'"'. ' AND '.$this->_table_action.'.'.$this->_id_carte_action.' = "'.$id_carte.'"'; $resultat=mysql_query($requete) or die('

Erreur de requête

'. 'Requete : '.$requete. '

Erreur : '.mysql_error()); $ligne = mysql_fetch_object ($resultat); if (mysql_num_rows ($resultat) != 0) { $chp_id_zone_geo = $this->_id_zone_geo_action; $chp_action = $this->_action; $chp_id_carte_destination = $this->_id_carte_destination; $action['id_zone_geo'] = $ligne->$chp_id_zone_geo; $action['type_action'] = $ligne->$chp_action; $action['id_carte_destination'] = $ligne->$chp_id_carte_destination; return $action; } }//Fin de la méthode get_cartoAction(). }//Fin de la classe Carto_Action. //================================================================================================ // L'objet carte est l'objet principal de la carto. C'est lui possede qui possède les methodes //pour colorier les cartes. // Il faut lui donner les parametres suivants : // -le nom de la premier carte ($id). // -le nom du masque ($masque). // -le nom du fond de carte a colorier ($fond). // -le tableau $info_table_couleur : il contient les renseignements concernant la table des couleurs ainsi // qu'un autre tableau dans lequel figure le nombre d'elements par zone. // L'objet comporte deux methodes principales : // -'ajouterFils()' qui permet d'ajouter les cartes de niveau inferieur. // -'donnerFormulaireImage()' qui lance l'action a faire en fonction de l'action de l'utilisateur. // Il faut aussi penser a donner directement le champs url. //================================================================================================ class Carto_Carte { /*|=============================================================================================|*/ /*| LES ATTRIBUTS DE LA CLASSE |*/ /*|---------------------------------------------------------------------------------------------|*/ var $id; var $_id_zone_geo_carte; var $nom; var $masque; var $fond; var $chemin; var $image; var $fils; var $url; var $_info_table_zg; var $filiation; var $image_x; var $image_y; var $historique_cartes; var $liste_zone_carte; var $historique; // La couleur dominante ( $maxiRVB ), la couleur la plus claire ($miniRVB) et la couleur // intermédiaire précédant le maximum ( $mediumRVB ) au cas ou il y aurait un trop grand //ecart entre les deux plus grandes valeurs. var $_zeroR; var $_zeroV; var $_zeroB; var $_miniR; var $_miniV; var $_miniB; var $_mediumR; var $_mediumV; var $_mediumB; var $_maxiR; var $_maxiV; var $_maxiB; //Le type de formule mathématique permettant de colorier la carte var $_formule_coloriage; //L'action à réaliser var $_action; /*|=============================================================================================|*/ /*| LE CONSTRUCTEUR DE LA CLASSE |*/ /*|---------------------------------------------------------------------------------------------|*/ function Carto_Carte ($id, $id_zone_geo_carte, $nom, $masque, $fond, $chemin, $info_table) { $this->id = $id; $this->_id_zone_geo_carte = $id_zone_geo_carte; $this->nom = $nom; $this->masque = $chemin.$masque; $this->fond = $chemin.$fond; $this->chemin = $chemin; $this->_info_table_zg = $info_table; $this->_action = new Carto_Action($info_table['nom_table_zone'],$info_table['nom_chp_id_zone'], $info_table['nom_chp_rouge'], $info_table['nom_chp_vert'], $info_table['nom_chp_bleu'], 'carto_ACTION', 'CA_ID_Carte', 'CA_ID_Zone_geo', 'CA_Type_zone', 'CA_Action', 'CA_ID_Carte_destination'); $this->fils = array(); $this->filiation = $id; $this->historique_cartes = ''; $this->liste_zone_carte = ''; $this->definirCouleurs(); $this->definirFormuleColoriage(); } /*|=============================================================================================|*/ /*| LES METHODES PUBLIQUES |*/ /*|---------------------------------------------------------------------------------------------|*/ function definirCouleurs ( $couleur_zero_R = '255', $couleur_zero_V = '255', $couleur_zero_B = '255', $couleur_mini_R = '210', $couleur_mini_V = '230', $couleur_mini_B = '210', $couleur_medium_R = '92', $couleur_medium_V = '181', $couleur_medium_B = '92', $couleur_maxi_R = '0', $couleur_maxi_V = '127', $couleur_maxi_B = '0') { $this->_zeroR = $couleur_zero_R; $this->_zeroV = $couleur_zero_V; $this->_zeroB = $couleur_zero_B; $this->_miniR = $couleur_mini_R; $this->_miniV = $couleur_mini_V; $this->_miniB = $couleur_mini_B; $this->_mediumR = $couleur_medium_R; $this->_mediumV = $couleur_medium_V; $this->_mediumB = $couleur_medium_B; $this->_maxiR = $couleur_maxi_R; $this->_maxiV = $couleur_maxi_V; $this->_maxiB = $couleur_maxi_B; } function definirFormuleColoriage ($nomFormuleColoriage = 'defaut') { $this->_formule_coloriage = $nomFormuleColoriage; } //******************************************************************************************************** // La méthode donnerImageSimple ($objet) permet de récupérer une image non cliquable. //********************************************************************************************************* function donnerImageSimple ($objet) { $nom_fichier_image = $this->_donnerIdUnique(); $objet->_lancerColoriage('', $nom_fichier_image); $res = 'image.png'; return $res; } //******************************************************************************************************** // La methode ajouterFils() est essentielle. Elle permet d'ajouter toutes les sous cartes voulues. // Il faut lui indiquer, comme a la carte du niveau du dessus, son nom, le masque, le fond et info_table_couleur. // On a ainsi une inclusion d'objets les uns dans les autres. //********************************************************************************************************* function ajouterFils ($id, $id_zone_geo_carte, $nom, $masque, $fond, $info_table) { $this->fils[$id] = new Carto_Carte ($id, $id_zone_geo_carte, $nom, $masque, $fond, $this->chemin, $info_table); //Si on ajoute à la carte du monde comme fils celle de l'europe, alors //on aura comme valeur pour $this->filiation de la carte d'europe : monde*europe $this->fils[$id]->filiation = $this->filiation.'*'.$id; $this->fils[$id]->url = $this->url; //Si on ajoute à la carte du monde dont le nom est 'Monde' comme fils celle de l'europe, //dont le nom est 'Europe', alors on aura comme valeur pour $this->nom de la carte d'europe : Monde*Europe $this->fils[$id]->nom = $this->nom.'*'.$nom; $this->fils[$id]->historique_cartes = $this->historique_cartes; } //********************************************************************************************************* // La methode donnerFormulaireImage() est la methode principale de la carto. C'est elle qui gere ce qu'il y a faire en // fonction de l'action de l'utilisateur. // Trois cas se distinguent : // -soit l'utilisateur a clique sur un point de la carte. // -soit il a clique sur un des liens que l'on a afficher avec la méthode afficherHistoriqueCarte de l'objet Carto_HistoriqueCarte. // -soit il a sélectionné une zone géographique dans la liste déroulante. // Elle renvoit a la fin: // -soit une nouvelle carte coloriée // -soit false. //********************************************************************************************************** function donnerFormulaireImage () { global $GS_GLOBAL; $res = ''; // Nous commençons par tester tout d'abords si nous venons d'une autre carte. Pour cela nous vérifions, // si les attributs $this->image_x et $this->image_y de la classe Carte existe ou ne sont pas null. // La carte est une image appelée par une balise et non par une balise classique . // Ansi, lorsqu'on clique sur la carte le formulaire appelle (via l'url du formulaire) l'application // utilisant la classe carte et lui renvoit deux variables contenant les coordonnées x et y du clic. // L'application instancie à nouveau les objets cartes mais cette fois ci la carte affichée dépendra des // informations founit par une table de la base de données. // La classe carto_action instanciée dans l'application utilisant la classe carte fournit les noms // des champs et celui de la table contenant les valeur RVB de chaque zone des cartes, l'identifiant // de la zone et l'action à entreprendre pour la zone conssidérée. // La méthode imgform() utilise la méthode get_cartoAction() de l'objet Carto_Action pour connaître // en fonction des coordonnées du clic l'action à entreprendre. // Quoi qu'il arrive, on ouvre la balise formulaire $res = '
'."\n"; $res .= '

'.CAR_CLIQUER_ACCEDER.'

' ; if (isset ($this->image_x) && ($this->image_x != '') && isset ($this->image_y) && ($this->image_y != '')) { // on regarde ici si l'on a pas un objet de plus bas niveau présent dans la variable de session carte //a charger a la place de l'objet de plus haut niveau $var_session_retour = $_SESSION['carte'] ; if ($var_session_retour) { $image_x = $this->image_x; $image_y = $this->image_y; $liste_zone_carte = $this->liste_zone_carte; // Nous chargons alors l'ojet approprié en descendant grâce a la généalogie $historique_cartes = explode('*',$this->historique_cartes); foreach ($historique_cartes as $key => $value) { if ($key != 0) { // $this_tmp = $this->fils[$value]; foreach (get_object_vars($this->fils[$value]) as $key => $value) $this->$key = $value; } } $this->image_x = $image_x; $this->image_y = $image_y; $this->liste_zone_carte = $liste_zone_carte; unset ($_SESSION['carte']) ; } // on regarde qu'est-ce qu'on doit faire grace a la methode _consulterAction() de l'objet Carto_Action $action = $this->_action->_consulterActionImage($this->image_x, $this->image_y, $this->masque, $this->id); // Nous distinguons 2 cas : //le cas ou il faut afficher une nouvelle carte ... : if ($action['type_action'] == 'Aller_a') { $id_carte_destination = $action['id_carte_destination'] ; $this->fils[$id_carte_destination]->liste_zone_carte = $this->liste_zone_carte; $res .= '
'.$this->fils[$id_carte_destination]->_donnerListeZoneCarte()."
\n"; $res .= '
'.$this->_donnerListeZoneCarte()."
\n"; $res .= '
'.$this->_donnerListeZoneCarte($this->liste_zone_carte)."
\n"; $res .= '
historique_cartes) { // Nous chargons alors l'ojet approprié en descendant grâce a la généalogie $historique_cartes = explode('*',$this->historique_cartes); foreach ($historique_cartes as $key => $value) { if ($key != 0) { // $this = $this->fils[$value]; foreach (get_object_vars($this->fils[$value]) as $key => $value) $this->$key = $value; } } // une foit que l'on a charge le bon objet nous le colorions $res .= '
'.$this->_donnerListeZoneCarte()."
\n"; $res .= '
'.$this->_donnerListeZoneCarte()."
\n"; $res .= '
historique.'" />'; $res .= '
'."\n"; return $res; } /*|=============================================================================================|*/ /*| LES METHODES PRIVEES |*/ /*|---------------------------------------------------------------------------------------------|*/ function _donnerListeZoneCarte($zone_par_defaut = '') { $retour = ''; $requete = 'SELECT '.$this->_info_table_zg['nom_chp_id_zone'].', '.$this->_info_table_zg['nom_chp_nom_zone']. ' FROM '.$this->_info_table_zg['nom_table_zone']; if ($this->_info_table_zg['nom_chp_zone_sup'] != ''){ if(ereg("[a-z]+",$this->_id_zone_geo_carte)){ $requete .= ' WHERE '.$this->_info_table_zg['nom_chp_zone_sup'].' = "'.$this->_id_zone_geo_carte.'"'; } else{ $requete .= ' WHERE '.$this->_info_table_zg['nom_chp_zone_sup'].' = '.$this->_id_zone_geo_carte; } } $requete .= ' ORDER BY '.$this->_info_table_zg['nom_chp_nom_zone'].' ASC'; $resultat = mysql_query ($requete) or die('

Erreur de requête

'. 'Requete : '.$requete. '

Erreur : '.mysql_error()); $i=0; $retour = ''."\n"; return $retour; } //============================================================================== // METHODE _lancerColoriage() // // Elle lance le coloriage de l'image. // Elle est lancée toute seule par la méthode donnerFormulaireImage(). // Les informations qui lui sont necessaires sont déjà données à l'objet carte (fond, info_table_couleur). //============================================================================== function _lancerColoriage ($id_image = '_00', $nom_fichier = '', $id_zone_a_reperer = '') { $this->image = imagecreatefrompng($this->fond); $this->_colorierImage ($this->image, $this->_info_table_zg['nom_table_zone'], $this->_info_table_zg['nom_chp_id_zone'], $this->_info_table_zg['nom_chp_rouge'], $this->_info_table_zg['nom_chp_vert'], $this->_info_table_zg['nom_chp_bleu'], $this->_info_table_zg['nom_chp_zone_sup'], $this->_info_table_zg['tableau_valeurs_zone'], $id_zone_a_reperer) ; if ($nom_fichier != '') { if (!imagepng(&$this->image,'tmp/carto/'.$nom_fichier.'.png')) { echo 'erreur'; } //$this->image = imagepng(&$this->image); } else { imagepng(&$this->image,'tmp/carto/'.$this->id.$id_image.'.png'); //imagepng(&$this->image); } } //============================================================================== // METHODE _colorierImage() // // Elle réalise le coloriage de l'image. //============================================================================== function _colorierImage (&$image_fond, $table_zone_geo, $chp_id_zone_couleur, $chp_rouge, $chp_vert, $chp_bleu, $chp_zone_sup, $tableau_valeurs_zone, $id_zone_a_reperer) { //---------------------------------------------------------------------------- // Cherche les valeurs RVB de la couleur de chaque zone géographique et les rentre dans //un tableau d'objets Carto_InformationCouleur (voir la description de la classe ci-dessus. $requete_01 = 'SELECT *'. ' FROM '.$table_zone_geo; if ($chp_zone_sup != ''){ if(ereg("[a-z]+",$this->_id_zone_geo_carte)){ $requete_01 .= ' WHERE '.$chp_zone_sup.' = "'.$this->_id_zone_geo_carte.'"'; } else{ $requete_01 .= ' WHERE '.$chp_zone_sup.' = '.$this->_id_zone_geo_carte; } } $resultat_01 = mysql_query ($requete_01) or die('

Erreur de requête

'. 'Requete : '.$requete_01. '

Erreur : '.mysql_error()); $i=0; $attachments = array(); while ($ligne_01 = mysql_fetch_object ($resultat_01)) { $attachments[$i] = new Carto_InformationCouleur ($ligne_01->$chp_id_zone_couleur, $ligne_01->$chp_rouge, $ligne_01->$chp_vert, $ligne_01->$chp_bleu); $i++; } //Nous libérons toute la mémoire associée à l'identifiant de résultat. mysql_free_result ($resultat_01); //---------------------------------------------------------------------------- // On realide l'association entre l'index des couleurs et la zone de meme couleur $attachments = $this->_construireAssociationIndexZone ($image_fond, $attachments); //---------------------------------------------------------------------------- //Dans l'application qui utilise la classe carte, nous avons instancié un tableau //associatif qui contient en clé l'identifiant d'une zone géographique et en valeur //un nombre (qui peut-être un nombre d'inscrit, d'institutions, de taxons...). // Nous récupérons ci-dessous la valeur minimum autre que 0 présente dans ce tableau //puis une valeur conscidérée comme maximum if (!is_array($tableau_valeurs_zone)) { $mini = 0; $medium = 0; $maxi = 0; $nbre_valeurs = 0; } else { if (count($tableau_valeurs_zone) == 0) { $mini=0; $medium = 0; $maxi=0; } else { $i=0; foreach ($tableau_valeurs_zone as $cle => $valeur) { //Nous recherchons le minimum, le maximum et le la valeur médium juste au dessous du maximum. if ($valeur != 0) { $tablo_valeurs[$i] = $valeur; $i++; } } //Nombre d'entrées dans le tableau de valeurs non nulles : $nbre_valeurs = count($tablo_valeurs); $somme_valeurs = array_sum($tablo_valeurs); $tablo_frequences = array_count_values($tablo_valeurs); $nbre_frequences = count($tablo_frequences); if ($nbre_valeurs > 0){ //Nous trions le tableau dans l'ordre croissant : sort($tablo_valeurs); //Nous récupérons la valeur la plus petite : $mini = $tablo_valeurs[0]; $maxi = $tablo_valeurs[$nbre_valeurs-1]; isset($tablo_valeurs[$nbre_valeurs-2]) ? $medium = $tablo_valeurs[$nbre_valeurs-2] : $medium = 0; $moyenne = $somme_valeurs/$nbre_valeurs; $ecart_au_carre_moyen = 0; for ($i = 0; $i < $nbre_valeurs; $i++) { $ecart_au_carre_moyen += pow(($tablo_valeurs[$i] - $moyenne), 2); } $variance = $ecart_au_carre_moyen/$nbre_valeurs; $ecart_type = sqrt($variance); $moyenne = round($moyenne, 0); $variance = round($variance, 0); $ecart_type = round($ecart_type, 0); /*echo 'Nombre de valeurs : '.$nbre_valeurs.'
'; echo 'Nombre de frequences : '.$nbre_frequences.'
'; echo 'Moyenne : '.$moyenne.'
'; echo 'Variance : '.$variance.'
'; echo 'Ecart-type : '.$ecart_type.'
'; echo 'Formule de coloriage : '.$this->_formule_coloriage.'
'; echo "mini : $mini medium : $medium maxi : $maxi
"; */ } } } //---------------------------------------------------------------------------- // Nous réalisons le coloriage de toutes les zones : $requete_03 = "SELECT $chp_id_zone_couleur ". "FROM $table_zone_geo"; $resultat_03 = mysql_query ($requete_03) or die('

Erreur de requête

'. 'Requete : '.$requete_03. '

Erreur : '.mysql_error()); while ($ligne_03 = mysql_fetch_object ($resultat_03)) { $id_zone_geo = $ligne_03->$chp_id_zone_couleur; if (!isset ($tableau_valeurs_zone[$id_zone_geo])) { $tableau_valeurs_zone[$id_zone_geo] = 0; } //Nous cherchons la couleur a afficher pour chaque zone. if ($tableau_valeurs_zone[$id_zone_geo] != 0) { //echo 'ZONE:'.$id_zone_geo."
"; //echo $tableau_valeurs_zone[$id_zone_geo]."
"; $theColor = $this->_donnerCouleur ( $this->_miniR, $this->_miniV, $this->_miniB, $this->_mediumR , $this->_mediumV , $this->_mediumB , $this->_maxiR , $this->_maxiV , $this->_maxiB , $mini, $medium, $maxi, $nbre_valeurs, $ecart_type, $moyenne, $tablo_valeurs, $tablo_frequences, $nbre_frequences, $tableau_valeurs_zone[$id_zone_geo], $this->_formule_coloriage); //echo $theColor['R'].'
'; //echo $theColor['V'].'
'; //echo $theColor['B'].'
'; } else { $theColor['R'] = $this->_zeroR; $theColor['V'] = $this->_zeroV; $theColor['B'] = $this->_zeroB; } //Nous réalisons le coloriage de toutes les zones de l'image avec la couleur obtenue. $this->_remplacerCouleur ($image_fond, $attachments, $id_zone_geo, $theColor['R'], $theColor['V'], $theColor['B'], $id_zone_a_reperer); } //Nous libérons toute la mémoire associée à l'identifiant de résultat de la requête. mysql_free_result ($resultat_03); } //============================================================================== // METHODE _construireAssociationIndexZone ($image, &$att) // // Le tableau $att est passé par référence. La méthode modifie donc directement // le tableau et ne renvoit donc rien. // Attache dans un tableau $att, contenant sous forme d'objet (Carto_ColorInfo) // les valeurs RVB des zones d'une image, la valeur de l'index correspondant // à la couleur de la zone. // Note : les images en question sont constituées de zones distincte possédant // chacune une couleur unique et unie. //============================================================================== function _construireAssociationIndexZone (&$image_fond, &$att) { // Nous récupérons le nombre de couleur différentes contenues dans l'image. //echo $this->fond.'
'; $image_fond = imagecreatefrompng($this->fond); $taille_palette = imagecolorstotal ($image_fond); //echo $taille_palette.'
'; // Pour chaque couleur contenue dans l'image, nous cherchons l'objet correspondant // dans le tableau $att, qui contient des informations sur chaque zone de l'image, // et nous attribuons à l'objet la valeur de l'index de sa couleur dans l'image. for ($i = 0; $i < $taille_palette; $i++) { $valeurs_RVB = array(); $valeurs_RVB = imagecolorsforindex ($image_fond, $i); for ($j = 0; $j < count ($att); $j++) { if (($att[$j]->rouge == $valeurs_RVB['red']) && ($att[$j]->vert == $valeurs_RVB['green']) && ($att[$j]->bleu == $valeurs_RVB['blue'])) { $att[$j]->index = $i; //echo 'ICI'.$att[$j]->id_zone.$att[$j]->index.'
'; break; } } } return $att; }//Fin méthode _construireAssociationIndexZone() //============================================================================== // METHODE _donnerCouleur() //------------------------------------------------------------------------------ // Renvoie pour une valeur donnee la couleur a mettre //------------------------------------------------------------------------------ // ENTREE // $miniR : valeur rouge du minimum // $miniV : valeur vert du minimum // $miniB : valeur blue du minimum // $maxiR : valeur rouge du maximum // $maxiV : valeur vert du maximum // $maxiB : valeur bleu du maximum // $mediumR : valeur rouge du deuxieme maximum // $mediumV : valeur vert du deuxieme maximum // $mediumB : valeur bleu du deuxieme maximum // $mini : valeur mini sur l'echelle // $medium : valeur juste au dessous du maximum sur l'echelle // $maxi : valeur maxi sur l'echelle // $val : valeur dont on cherche la couleur //------------------------------------------------------------------------------ // SORTIE // $couleur array donne la couleur pour la valeur demande ($val) //------------------------------------------------------------------------------ function _donnerCouleur ($miniR, $miniV, $miniB, $mediumR, $mediumV, $mediumB, $maxiR, $maxiV, $maxiB, $mini, $medium, $maxi, $nbre_valeurs, $ecart_type, $moyenne, $tablo_valeurs, $tablo_frequences, $nbre_frequences, $val, $formuleColoriage) { //Le tableau est trié de la plus petite à la plus grande clé. ksort($tablo_frequences); $i = 0; foreach ($tablo_frequences as $cle => $valeur){ //Nous cherchons la correspondance entre la valeur et la clé. if ($cle == $val) { //Pour faire le Rouge, Vert, Bleu $couleur['R'] = $miniR - round(($i * abs(($miniR - $maxiR)/$nbre_frequences)), 0); $couleur['V'] = $miniV - round(($i * abs(($miniV - $maxiV)/$nbre_frequences)), 0); $couleur['B'] = $miniB - round(($i * abs(($miniB - $maxiB)/$nbre_frequences)), 0); } $i++; } return $couleur; }//Fin méthode _donnerCouleur() //============================================================================== // METHODE _remplacerCouleur ($img, $att, $id_zone_geo, $r, $g, $b) // // $img is the image, $att an array of carto_colorinfo objects, $id_zone_geo the name // of an object of $att, ($r, $g, $b) the new color. // // In the palette of $img, the color matching with $id_zone_geo is modified. //============================================================================== function _remplacerCouleur (&$image, &$atta, $id_zone_geo, $rouge, $vert, $bleu, $id_zone_a_reperer) { // Nous recherchons la valeur de l'index. $index = -1; for ($i = 0; $i < count ($atta); $i++) { if ($atta[$i]->id_zone == $id_zone_geo) { $index = $atta[$i]->index; //Dans le cas où nous voulons repérer une zone sur la carte : if($id_zone_geo == $id_zone_a_reperer) { $rouge = 255; $vert = 0; $bleu = 0; } break; } } // Nous mettons à jour l'image de la carte avec la valeur de l'index. if ($index >= 0) { imagecolorset (&$image, $index, $rouge, $vert, $bleu); } }//Fin de la méthode _remplacerCouleur //============================================================================== // METHODE _donnerIdUnique () // // Cette méthode privée retourne un identifiant de 32 caractères unique. // //============================================================================== function _donnerIdUnique () { $id = ''; $id = md5 (uniqid (rand())); return $id; }//Fin de la méthode _donnerIdUnique() }//Fin de la classe Carto_Carte() //============================================================================== // La classe Carto_InformationCouleur n'est utilisée que par la classe carte. // C'est une classe privée. // Elle sert à stocker les informations (RVB et index) sur la couleur d'une // zone d'une image. //============================================================================== class Carto_InformationCouleur { /*|=============================================================================================|*/ /*| LES ATTRIBUTS DE LA CLASSE |*/ /*|---------------------------------------------------------------------------------------------|*/ var $id_zone; var $rouge; var $vert; var $bleu; var $index; /*|=============================================================================================|*/ /*| LE CONSTRUCTEUR DE LA CLASSE |*/ /*|---------------------------------------------------------------------------------------------|*/ function Carto_InformationCouleur ($id_zone, $rouge, $vert, $bleu) { $this->id_zone = $id_zone; $this->rouge = $rouge; $this->vert = $vert; $this->bleu = $bleu; $this->index = -1; } }//Fin de la classe Carto_InformationCouleur //============================================================================== // FUNCTION carto_errorMsg () // // Return an error message about carto management. //============================================================================== function carto_errorMsg () { global $PRIVATE_CARTO_ERROR; return $PRIVATE_CARTO_ERROR; } //============================================================================== // FUNCTION carto_putErrorImage () // // Dump a default error image. //============================================================================== function carto_putErrorImage () { $img = '47494638396120002000800100ff000000006621f90401000001002c000000002000'. '200040026d848fa99be11f009c53524373b41ae2da65dcf345e1693aa536aae77ab1'. 'e1d7a2a22ad5f60deb6fe54bc958418f0b05bb9190bee2f1327276a2c91db16a855a'. 'a4489c31bb24d5b8614fb32b2a9ea7d228738785dab673e7f81554b395682008dc52'. '4236b4210416c390a8a85000003b'; header ('Content-Type: image/gif'); echo gs_hex2bin ($img); } //============================================================================== //============================================================================== // Les fonctions qui suivent permettent de recuperer des infos (nom de l'image, // du masque, du niveau ou du titre) d'une carte. //============================================================================== //============================================================================== function carto_consulterTitreCarte ($id_carte) { global $NOM_FICHIER; $requete = 'SELECT * '. ' FROM carto_DESCRIPTION_CARTE'. ' WHERE CDC_ID_Carte = "'.$id_carte.'"'; $resultat = mysql_query ($requete) or die('

Erreur de requête

'. 'Nom du fichier : '.$NOM_FICHIER.'
'. 'Nom fonction : carto_consulterTitreCarte
'. 'Requete : '.$requete. '

Erreur : '.mysql_error()); $ligne = mysql_fetch_object ($resultat); $titre_carte = $ligne->CDC_Titre_carte; return $titre_carte; } function carto_consulterFichierFond ($id_carte) { global $NOM_FICHIER; $requete = 'SELECT * '. ' FROM carto_DESCRIPTION_CARTE'. ' WHERE CDC_ID_Carte = "'.$id_carte.'"'; $resultat = mysql_query ($requete) or die('

Erreur de requête

'. 'Nom du fichier : '.$NOM_FICHIER.'
'. 'Nom fonction : carto_consulterFichierFond
'. 'Requete : '.$requete. '

Erreur : '.mysql_error()); $ligne = mysql_fetch_object ($resultat); $nom_fichier_carte_fond = $ligne->CDC_Carte_fond; return $nom_fichier_carte_fond; } function carto_consulterFichierMasque ($id_carte) { global $NOM_FICHIER; $requete = 'SELECT * '. ' FROM carto_DESCRIPTION_CARTE'. ' WHERE CDC_ID_Carte = "'.$id_carte.'"'; $resultat = mysql_query ($requete) or die('

Erreur de requête

'. 'Nom du fichier : '.$NOM_FICHIER.'
'. 'Nom fonction : carto_consulterFichierMasque
'. 'Requete : '.$requete. '

Erreur : '.mysql_error()); $ligne = mysql_fetch_object ($resultat); $nom_fichier_carte_masque = $ligne->CDC_Carte_masque; return $nom_fichier_carte_masque; } function carto_consulterTypeZoneCarte ($id_carte) { global $NOM_FICHIER; $requete = 'SELECT * '. ' FROM carto_DESCRIPTION_CARTE'. ' WHERE CDC_ID_Carte = "'.$id_carte.'"'; $resultat = mysql_query ($requete) or die('

Erreur de requête

'. 'Nom du fichier : '.$NOM_FICHIER.'
'. 'Nom fonction : carto_consulterTypeZoneCarte
'. 'Requete : '.$requete. '

Erreur : '.mysql_error()); $ligne = mysql_fetch_object ($resultat); $type_zone_carte = $ligne->CDC_Type_zone_carte; return $type_zone_carte; } function carto_consulterIdZoneGeoCarte ($id_carte) { global $NOM_FICHIER; $requete = 'SELECT * '. ' FROM carto_DESCRIPTION_CARTE'. ' WHERE CDC_ID_Carte = "'.$id_carte.'"'; $resultat = mysql_query ($requete) or die('

Erreur de requête

'. 'Nom du fichier : '.$NOM_FICHIER.'
'. 'Nom fonction : carto_consulterIdZoneGeoCarte
'. 'Requete : '.$requete. '

Erreur : '.mysql_error()); $ligne = mysql_fetch_object ($resultat); $id_zone_carte = $ligne->CDC_ID_Zone_geo_carte; return $id_zone_carte; } //-- Fin du code source ------------------------------------------------------------ /* * $Log: lib.carto.php,v $ * Revision 1.2 2005/03/11 15:18:45 alex * migration version 4 * * Revision 1.1 2004/12/15 13:30:20 alex * version initiale * * Revision 1.17 2003/05/16 13:17:40 jpm * Correction d'une erreur (des guillemets en trop). * * Revision 1.16 2003/03/14 14:12:14 jpm * Correction bug : le nom de la zone ne restait pas dans la liste déroulante. * * Revision 1.15 2003/03/11 14:49:47 jpm * Simplification de l'interface. * * Revision 1.14 2003/03/07 15:10:24 jpm * Ajout de commentaires : "à faire" * * Revision 1.13 2003/03/04 16:14:06 alex * Utilisation de la fonction cxt_clearVariable à la place de cxt_clear * * Revision 1.12 2003/03/04 08:09:39 jpm * Ajout suppression des fichiers carto du dossier carto temporaire. * * Revision 1.11 2003/02/26 12:12:38 jpm * Ajout de la gestion des listes déroulantes représentant la zone géographique * à éditer. * * Revision 1.10 2003/02/21 13:50:57 jpm * Mise à jour nouvel objet Carto_Carte. * * Revision 1.8 2003/02/14 08:01:14 jpm * Changement des noms de méthode selon les recommandations de PEAR. * Ajout d'attributs à la classe. * Ajout de la possibilité de redéfinir les couleurs de coloriage d'une carte. * Ajout de la possibilité de désigner une formule mathématique de coloriage. * * Revision 1.7 2003/02/12 18:15:56 jpm * Meilleure gestion de l'obtentions des valeurs minimum, medium et maximum * pour l'ensemble des zones géographiques d'une carte. * Ajout de commentaires. * Meilleure gestion des erreurs de requêtes. * * */ ?>