| 84,25 → 84,37 |
| * @var string nom du dossier contenant les cartes créées. |
| */ |
| private $carte_stockage_dossier; |
| |
| /** |
| * L'url correspondant au dossier où sont stockées les cartes crées via la classe Cartographie. |
| * L'url est passé à la fonction sprintf est doit donc contennir %s afin d'indiquer l'endroite où ajouter le nom du |
| * fichier de la carte. |
| * @var string url des cartes créées. |
| */ |
| private $carte_stockage_url; |
| |
| /** |
| * Format du tableau : |
| * carte_zone_info est un tableau de tableaux associatifs. |
| * Chaque zone de la carte doit avoir son entrée dans ce tableau. Chaque zone est représentée par : |
| * carte_zone est un tableau de tableaux associatifs. |
| * Chaque zone de la carte doit avoir son entrée dans ce tableau. Le code de la zone sert de clé. |
| * Chaque zone est représentée par : |
| * - nom : (string) |
| * le nom de la zone. |
| * - index : (int) |
| * l'index de la couleur dans la palette si on a à faire à une image indexée (moins de 255 zones sur la carte) |
| * - rvb_fond : (string) Exemple : 255-255-255. |
| * le nom de la zone qui sera affiché dans l'attribut title de la balise map html. |
| * - rvb_fond : (string) Exemple : 255-255-255. |
| * les valeurs entre 0 et 255 séparées par des tirets (-) de la couleur de la zone sur la carte de fond |
| * Ne pas utiliser le blanc (255-255-255) et utiliser le noir pour les contours(0-0-0). |
| * Ne pas utiliser le blanc (255-255-255) et utiliser le noir pour les contours (0-0-0). |
| * - poly : (string) |
| * les coordonnées pour la balise map html. Si une même zone à plusieurs polygones, les séparer par le |
| * caractère pipe "|". |
| * - info_nombre : (int) Exemple : nombre de personnes présentent dans un département. |
| * nombre d'occurence dans cette zone. |
| * - url : (string) l'url qui doit être appelée sur un clic dans la zone. |
| * - rvb_carte : (string) Exemple : 255-255-255. |
| * les valeurs entre 0 et 255 séparées par des tirets (-) de la couleur de remplacement |
| * - nombre : (int) Exemple : nombre de personnes présentent dans un département. |
| * nombre d'occurence dans cette zone. |
| * les valeurs entre 0 et 255 séparées par des tirets (-) de la couleur de remplacement dans le cas de la formule |
| * de coloriage de type "légende". |
| * @var array les informations sur les zones de la carte. |
| */ |
| private $carte_zone_info = array(); |
| private $carte_zones = null; |
| |
| /** |
| * Tableau contenant la valeur RVB de la zone du fond de carte en clé et la valeur RVB venant la remplacer en valeur. |
| 149,6 → 161,12 |
| */ |
| private $coloriage_tableau_frequence = array(); |
| |
| /** |
| * Permet de savoir si la cartographie est en mode déboguage ou pas. |
| * @var bool true si on est en mode débug, sinon false. |
| */ |
| private $mode_debug; |
| |
| //+----------------------------------------------------------------------------------------------------------------+ |
| /*** Constructeur : ***/ |
| public function __construct($options = array()) { |
| 155,11 → 173,15 |
| // Initialisation de l'objet Cartographie |
| $this->setCarteNom(isset($options['carte_nom']) ? $options['carte_nom'] : ''); |
| $this->setFormuleColoriage(isset($options['formule']) ? $options['formule'] : ''); |
| $this->setColoriageCouleurClaire(isset($options['couleur_claire']) ? $options['couleur_claire'] : ''); |
| $this->setColoriageCouleurFoncee(isset($options['couleur_foncee']) ? $options['couleur_foncee'] : ''); |
| $this->setCarteFondFichier(isset($options['fond_fichier']) ? $options['fond_fichier'] : ''); |
| $this->setCarteFondDossier(isset($options['fond_dossier']) ? $options['fond_dossier'] : ''); |
| $this->setCarteStockageDossier(isset($options['stock_dossier']) ? $options['stock_dossier'] : ''); |
| $this->setCarteZoneInfo(isset($options['infos']) ? $options['infos'] : array()); |
| $this->setCarteStockageUrl(isset($options['stock_url']) ? $options['stock_url'] : ''); |
| $this->setCarteZones(isset($options['zones']) ? $options['zones'] : null); |
| $this->setZoneMarker(isset($options['zone_marker']) ? $options['zone_marker'] : ''); |
| $this->setModeDebug(isset($options['debug']) ? $options['debug'] : false); |
| } |
| |
| //+----------------------------------------------------------------------------------------------------------------+ |
| 248,13 → 270,23 |
| $this->carte_stockage_dossier = $csd; |
| } |
| |
| public function getCarteZoneInfo() { |
| return $this->carte_zone_info; |
| public function getCarteStockageUrl() { |
| return $this->carte_stockage_url; |
| } |
| public function setCarteZoneInfo($czi) { |
| $this->carte_zone_info = $czi; |
| public function setCarteStockageUrl($csu) { |
| $this->carte_stockage_url = $csu; |
| } |
| |
| public function getCarteZones() { |
| if (is_null($this->carte_zones)) { |
| $this->chargerZones(); |
| } |
| return $this->carte_zones; |
| } |
| public function setCarteZones($cz) { |
| $this->carte_zones = $cz; |
| } |
| |
| public function getZoneMarker() { |
| return $this->zone_marker; |
| } |
| 261,6 → 293,13 |
| public function setZoneMarker($zm) { |
| $this->zone_marker = $zm; |
| } |
| |
| public function getModeDebug() { |
| return $this->mode_debug; |
| } |
| public function setModeDebug($md) { |
| $this->mode_debug = $md; |
| } |
| |
| //+----------------------------------------------------------------------------------------------------------------+ |
| /*** Méthodes PUBLIQUES : ***/ |
| 314,12 → 353,18 |
| $carte_map = ''; |
| |
| // Gestion de l'image map |
| $chemin_carte_map_fond = $this->getCarteFondDossier().$this->getCarteNom().'.tpl.html'; |
| $chemin_carte_map_fond = $this->getCarteFondDossier().$this->getCarteFondFichier().'.tpl.html'; |
| $chemin_carte_map = $this->getCarteStockageDossier().$this->getCarteNom().'.html'; |
| |
| if (file_exists($chemin_carte_map)) { |
| $carte_map = file_get_contents($chemin_carte_map); |
| } else { |
| $donnees['zones'] = $this->getCarteInfo(); |
| $nom_carte_png = $this->getCarteNom().'.png'; |
| $chemin_carte_png = $this->getCarteStockageDossier().$nom_carte_png; |
| $donnees['carte_url'] = sprintf($this->getCarteStockageUrl(), $nom_carte_png); |
| $donnees['carte_alt'] = 'info'; |
| $donnees['zones'] = $this->getCarteZones(); |
| //Debug::printr($donnees); |
| $carte_map = SquelettePhp::analyser($chemin_carte_map_fond, $donnees); |
| if (!file_put_contents($chemin_carte_map, $carte_map)) { |
| $e = "Écriture du fichier contenant le html de la carte impossible : $chemin_carte_map"; |
| 330,7 → 375,35 |
| return $carte_map; |
| } |
| |
| //+----------------------------------------------------------------------------------------------------------------+ |
| /*** Méthodes PRIVÉES : ***/ |
| |
| /** |
| * Charge en mémoire les données du fichier csv des zones géographique de la carte |
| */ |
| private function chargerZones() { |
| $fichier_csv = $this->getCarteFondDossier().$this->getCarteFondFichier().'.csv'; |
| $zones = array(); |
| if (($handle = fopen($fichier_csv, 'r')) !== false) { |
| $ligne = 1; |
| $cles = array(); |
| while (($donnees = fgetcsv($handle, 1000, ',')) !== false) { |
| $cle = array_shift($donnees); |
| if ($ligne == 1) { |
| // Ligne 1 : les noms des champs |
| $cles = $donnees; |
| |
| } else { |
| // Ligne > 1 : traitements des données |
| $zones[$cle] = array_combine($cles, $donnees); |
| } |
| $ligne++; |
| } |
| fclose($handle); |
| } |
| $this->setCarteZones($zones); |
| } |
| |
| private function construireCorrespondanceCouleur() { |
| switch ($this->formule_coloriage) { |
| case self::FORMULE_LEGENDE : |
| 350,7 → 423,7 |
| private function construireCorrespondanceCouleurProportionnel() { |
| // Création d'un tableau contenant seulement les nombres d'information pour chaque zone. |
| $tab_valeurs = array(); |
| foreach ($this->carte_zone_info as $cle => $valeur) { |
| foreach ($this->getCarteZones() as $cle => $valeur) { |
| //Nous recherchons le minimum, le maximum et le la valeur médium juste au dessous du maximum. |
| if (isset($valeur['info_nombre'])) { |
| $tab_valeurs[] = $valeur['info_nombre']; |
| 418,14 → 491,16 |
| //trigger_error('<pre>'.print_r($this->coloriage_couleurs, true).'</pre>', E_USER_ERROR); |
| |
| // Nous attribuons les couleurs à chaque zone géographique |
| foreach ($this->carte_zone_info as $cle => $zg) { |
| foreach ($this->getCarteZones() as $cle => $zg) { |
| if (isset($this->coloriage_tableau_frequence[$zg['info_nombre']])) { |
| $this->carte_correspondance_couleurs[$zg['rvb_fond']] = $this->coloriage_tableau_frequence[$zg['info_nombre']]; |
| } else { |
| $e = "La zone ".$zg['nom']." (".$zg['rvb_fond'].") ne possède pas de couleur RVB pour la remplir. ". |
| $this->carte_correspondance_couleurs[$zg['rvb_fond']] = '128-128-128'; |
| if ($this->getModeDebug()) { |
| $e = "La zone ".$zg['nom']." (".$zg['rvb_fond'].") ne possède pas de couleur RVB pour la remplir. ". |
| "La valeur 128-128-128 lui a été attribué."; |
| trigger_error($e, E_USER_WARNING); |
| $this->carte_correspondance_couleurs[$zg['rvb_fond']] = '128-128-128'; |
| trigger_error($e, E_USER_WARNING); |
| } |
| } |
| } |
| } |
| 432,14 → 507,16 |
| |
| private function construireCorrespondanceCouleurLegende() { |
| $tab_couleurs = array(); |
| foreach ($this->carte_zone_info as $cle => $zg) { |
| foreach ($this->getCarteZones() as $cle => $zg) { |
| if ($zg['rvb_carte'] != '') { |
| $this->carte_correspondance_couleurs[$zg['rvb_fond']] = $zg['rvb_carte']; |
| } else { |
| $e = "La zone ".$zg['nom']." (".$zg['rvb_fond'].") ne possède pas d'information pour la légende dans le champ". |
| $this->carte_correspondance_couleurs[$zg['rvb_fond']] = '128-128-128'; |
| if ($this->getModeDebug()) { |
| $e = "La zone ".$zg['nom']." (".$zg['rvb_fond'].") ne possède pas d'information pour la légende dans le champ". |
| " rvb_carte. La valeur 128-128-128 lui a été attribué."; |
| trigger_error($e, E_USER_WARNING); |
| $this->carte_correspondance_couleurs[$zg['rvb_fond']] = '128-128-128'; |
| trigger_error($e, E_USER_WARNING); |
| } |
| } |
| if (!isset($tab_couleurs[$this->carte_correspondance_couleurs[$zg['rvb_fond']]])) { |
| $tab_couleurs[$this->carte_correspondance_couleurs[$zg['rvb_fond']]] = 1; |
| 453,64 → 530,75 |
| if (imageistruecolor(&$this->carte)) { |
| //+--------------------------------------------------------------------------------------------------------+ |
| // Remplacement des couleurs sur la carte en mode vraies couleurs (RGB) |
| |
| // Nous commençons le rempalcement des couleurs sur la carte de fond. |
| $hauteur = imagesy(&$this->carte); |
| $largeur = imagesx(&$this->carte); |
| |
| // Tableau contenant les couleurs traitées, pour éviter de traiter plusieurs fois la même couleur |
| $tab_rvb_ok = array(); |
| for ($x = 0; $x < $largeur; $x++) { |
| for ($y = 0; $y < $hauteur; $y++) { |
| $rvb = ImageColorAt(&$this->carte, $x, $y); |
| if (!isset($tab_rvb_ok[$rvb])) { |
| // Récupération de la couleur rvb au format xxx-xxx-xxx |
| $cle = (($rvb >> 16) & 0xFF).'-'.(($rvb >> 8) & 0xFF).'-'.($rvb & 0xFF); |
| // Si nous n'avons pas à faire à la couleur noire (utilisé pour délimité les zones), nous continuons |
| if ($cle != '255-255-255') { |
| $rvb_final = null; |
| if (isset($this->carte_correspondance_couleurs[$cle])) { |
| if ($this->zone_marker != '' && $cle == $this->zone_marker) { |
| $rvb_final = '255'<<16 | '0'<<8 | '0'; |
| } else { |
| list($rouge, $vert, $bleu) = explode('-', $this->carte_correspondance_couleurs[$cle]); |
| $rvb_final = $rouge<<16 | $vert<<8 | $bleu; |
| } |
| // Si le nombre de couleurs sur la carte finale est infèrieur à 255 nous créons une image indexée |
| imagefill(&$this->carte, $x, $y, $rvb_final); |
| } else { |
| $rvb_final = '128'<<16 | '128'<<8 | '128'; |
| imagefill(&$this->carte, $x, $y, $rvb_final); |
| } |
| // Nous ajoutons la couleur ajoutée à la carte dans le tableau des couleurs traitées |
| $tab_rvb_ok[$rvb_final] = true; |
| $this->colorierCarteModeVraiCouleur(); |
| } else { |
| //+--------------------------------------------------------------------------------------------------------+ |
| // Remplacement des couleurs sur la carte en mode couleurs indexées (palette de couleurs) |
| $this->colorierCarteModeIndexe(); |
| } |
| } |
| |
| private function colorierCarteModeVraiCouleur() { |
| // Nous commençons le rempalcement des couleurs sur la carte de fond. |
| $hauteur = imagesy(&$this->carte); |
| $largeur = imagesx(&$this->carte); |
| |
| // Tableau contenant les couleurs traitées, pour éviter de traiter plusieurs fois la même couleur |
| $tab_rvb_ok = array(); |
| for ($x = 0; $x < $largeur; $x++) { |
| for ($y = 0; $y < $hauteur; $y++) { |
| $rvb = ImageColorAt(&$this->carte, $x, $y); |
| if (!isset($tab_rvb_ok[$rvb])) { |
| // Récupération de la couleur rvb au format xxx-xxx-xxx |
| $cle = (($rvb >> 16) & 0xFF).'-'.(($rvb >> 8) & 0xFF).'-'.($rvb & 0xFF); |
| // Si nous n'avons pas à faire à la couleur noire (utilisé pour délimité les zones), nous continuons |
| if ($cle != '255-255-255') { |
| $rvb_final = null; |
| if (isset($this->carte_correspondance_couleurs[$cle])) { |
| if ($this->zone_marker != '' && $cle == $this->zone_marker) { |
| $rvb_final = '255'<<16 | '0'<<8 | '0'; |
| } else { |
| list($rouge, $vert, $bleu) = explode('-', $this->carte_correspondance_couleurs[$cle]); |
| $rvb_final = $rouge<<16 | $vert<<8 | $bleu; |
| } |
| // Si le nombre de couleurs sur la carte finale est infèrieur à 255 nous créons une image indexée |
| imagefill(&$this->carte, $x, $y, $rvb_final); |
| } else { |
| $rvb_final = '128'<<16 | '128'<<8 | '128'; |
| imagefill(&$this->carte, $x, $y, $rvb_final); |
| } |
| // Nous ajoutons la couleur trouvées sur la carte de fond dans le tableau des couleurs traitées |
| $tab_rvb_ok[$rvb] = true; |
| } |
| // Nous ajoutons la couleur ajoutée à la carte dans le tableau des couleurs traitées |
| $tab_rvb_ok[$rvb_final] = true; |
| } |
| // Nous ajoutons la couleur trouvées sur la carte de fond dans le tableau des couleurs traitées |
| $tab_rvb_ok[$rvb] = true; |
| } |
| } |
| } else { |
| //+--------------------------------------------------------------------------------------------------------+ |
| // Remplacement des couleurs sur la carte en mode couleurs indexées (palette de couleurs) |
| } |
| } |
| |
| private function colorierCarteModeIndexe() { |
| // Nous attribuons à chaque zone présente dans le tableau $this->getCarteZones() la valeur de l'index |
| // de la couleur RVB représentant cette zone sur la carte de fond. |
| $this->construireAssociationIndexZone(); |
| |
| // Nous attribuons à chaque zone présente dans le tableau $this->carte_zone_info la valeur de l'index |
| // de la couleur RVB représentant cette zone sur la carte de fond. |
| $this->construireAssociationIndexZone(); |
| |
| foreach ($this->carte_zone_info as $zg) { |
| if (isset($this->carte_correspondance_couleurs[$zg['rvb_fond']])) { |
| //Dans le cas où nous voulons repérer une zone sur la carte : |
| if ($this->zone_marker != '' && $zg['rvb_fond'] == $this->zone_marker) { |
| $rouge = 255; |
| $vert = 0; |
| $bleu = 0; |
| } else { |
| list($rouge, $vert, $bleu) = explode('-', $this->carte_correspondance_couleurs[$zg['rvb_fond']]); |
| } |
| foreach ($this->getCarteZones() as $zg) { |
| if (isset($this->carte_correspondance_couleurs[$zg['rvb_fond']])) { |
| //Dans le cas où nous voulons repérer une zone sur la carte : |
| if ($this->getZoneMarker() != '' && $zg['rvb_fond'] == $this->getZoneMarker()) { |
| $rouge = 255; |
| $vert = 0; |
| $bleu = 0; |
| } else { |
| list($rouge, $vert, $bleu) = explode('-', $this->carte_correspondance_couleurs[$zg['rvb_fond']]); |
| } |
| if (isset($zg['index'])) { |
| imagecolorset(&$this->carte, $zg['index'], $rouge, $vert, $bleu); |
| } |
| } |
| } else if ($this->getModeDebug()) { |
| $e = "La zone '{$zg['nom']}' n'est pas présente sur la carte."; |
| trigger_error($e, E_USER_WARNING); |
| } |
| } |
| } |
| } |
| |
| 517,9 → 605,8 |
| private function construireAssociationIndexZone() { |
| // Nous récupérons le nombre de couleur différentes contenues dans l'image. |
| $taille_palette = imagecolorstotal($this->carte); |
| //print_r($this->carte_zone_info); |
| // Pour chaque couleur contenue dans l'image, nous cherchons l'objet correspondant |
| // dans le tableau $this->carte_zone_info, qui contient des informations sur chaque zone de l'image, |
| // dans le tableau $this->getCarteZones(), qui contient des informations sur chaque zone de l'image, |
| // et nous attribuons la valeur de l'index de sa couleur sur la carte de fond. |
| for ($i = 0; $i < $taille_palette; $i++) { |
| $rvb = array(); |
| 528,18 → 615,17 |
| // La couleur ne doit pas correspondre au noir ou au blanc car ces couleurs ne sont pas traitées |
| if ($rvb_cle != '255-255-255' && $rvb_cle != '0-0-0') { |
| $index_ok = false; |
| foreach($this->carte_zone_info as $cle => $zg) { |
| foreach($this->getCarteZones() as $cle => $zg) { |
| if (isset($zg['rvb_fond']) && $zg['rvb_fond'] == $rvb_cle) { |
| $this->carte_zone_info[$cle]['index'] = $i; |
| $this->carte_zones[$cle]['index'] = $i; |
| $index_ok = true; |
| //print_r($this->carte_zone_info[$cle]); |
| break; |
| } |
| } |
| if (!$index_ok && $rvb_cle != '0-0-0') { |
| $e = "Aucune zone trouvée pour l'index $i : $rvb_cle"; |
| if (!$index_ok && $rvb_cle != '0-0-0' && $this->getModeDebug()) { |
| $e = "Aucune information n'est fournie pour la zone sur la carte d'index $i : $rvb_cle"; |
| trigger_error($e, E_USER_WARNING); |
| $this->carte_zone_info[] = array('rvb_fond' => $rvb_cle, 'rvb_carte' => '128-128-128', 'index' => $i); |
| //$this->carte_zones[] = array('rvb_fond' => $rvb_cle, 'rvb_carte' => '128-128-128', 'index' => $i); |
| } |
| } |
| } |