Subversion Repositories eFlore/Projets.eflore-projets

Rev

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

Rev 1136 Rev 1137
1
<?php
1
<?php
2
 
2
 
3
/**
3
/**
4
 * Classe qui remplit un fond cartographique SVG a partir des observations en base de donnees
4
 * Classe qui remplit un fond cartographique SVG a partir des observations en base de donnees
5
 * pour un taxon de plante. Elle verifie dans un premier temps la validite des parametres saisis,
5
 * pour un taxon de plante. Elle verifie dans un premier temps la validite des parametres saisis,
6
 * puis charge le fond cartographique depuis le fichier, recupere dans la base de donnees
6
 * puis charge le fond cartographique depuis le fichier, recupere dans la base de donnees
7
 * les observations sur la France metropolitaine pour le taxon donne et remplit la carte
7
 * les observations sur la France metropolitaine pour le taxon donne et remplit la carte
8
 * en changeant le style CSS des mailles en fonction des coordonnees des points d'observation.
8
 * en changeant le style CSS des mailles en fonction des coordonnees des points d'observation.
9
 * Le format et la taille de la carte renvoyee au client est parametrable.
9
 * Le format et la taille de la carte renvoyee au client est parametrable.
10
 * 
10
 * 
11
 * Parametres :
11
 * Parametres :
12
 *   - referentiel : le referentiel taxonomique a interroger pour verifier le taxon. Pour l'instant,
12
 *   - referentiel : le referentiel taxonomique a interroger pour verifier le taxon. Pour l'instant,
13
 *     seul bdtfx (Tracheophytes de France metropolirtaine) est utilise par le web service
13
 *     seul bdtfx (Tracheophytes de France metropolirtaine) est utilise par le web service
14
 *   - num_taxon : le numero taxonomique de la plante dont on veut obtenir la carte de repartition.
14
 *   - num_taxon : le numero taxonomique de la plante dont on veut obtenir la carte de repartition.
15
 *     Le rang des taxons traites par le web service sont la famille, le genre, l'espece et la sous-espece.
15
 *     Le rang des taxons traites par le web service sont la famille, le genre, l'espece et la sous-espece.
16
 *     La recherche des observations s'etend en pus sur les sous taxons et les synonymes.
16
 *     La recherche des observations s'etend en pus sur les sous taxons et les synonymes.
17
 *   - source : une ou plusieurs sources de donnees a interroger. Si le parametre n'est pas indique,
17
 *   - source : une ou plusieurs sources de donnees a interroger. Si le parametre n'est pas indique,
18
 *     le web service ira rechercher les observatipons dans toutes les sources de donnees.
18
 *     le web service ira rechercher les observatipons dans toutes les sources de donnees.
19
 *   - format : la largeur de la carte, exprimee dans une valeur entiere en pixels.
19
 *   - format : la largeur de la carte, exprimee dans une valeur entiere en pixels.
20
 *     Le ratio largeur:hauteur est conserve lors du redimensionnement de la carte pour le retour
20
 *     Le ratio largeur:hauteur est conserve lors du redimensionnement de la carte pour le retour
21
 *   - retour : le type MIME (ou format de fichier) de retour. Sont acceptes par le web service
21
 *   - retour : le type MIME (ou format de fichier) de retour. Sont acceptes par le web service
22
 *     le PNG (image/png) et le XML (text/html) pour renvoyer le web service
22
 *     le PNG (image/png) et le XML (text/html) pour renvoyer le web service
23
 * 
23
 * 
24
 * @package framework-0.4
24
 * @package framework-0.4
25
 * @author Alexandre GALIBERT <alexandre.galibert@tela-botanica.org>
25
 * @author Alexandre GALIBERT <alexandre.galibert@tela-botanica.org>
26
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
26
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
27
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
27
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
28
 * @version $Id$
28
 * @version $Id$
29
 * @copyright 2013 Tela Botanica (accueil@tela-botanica.org)
29
 * @copyright 2013 Tela Botanica (accueil@tela-botanica.org)
30
 *
30
 *
31
 */
31
 */
32
 
32
 
33
class MoissonnageCartes {
33
class MoissonnageCartes {
34
 
34
 
35
	const MIME_MAP = "text/html";
35
	const MIME_MAP = "text/html";
36
	const MIME_PNG = "image/png";
36
	const MIME_PNG = "image/png";
37
	
37
	
38
	const METHODE_TELECHARGEMENT = "telecharger";
38
	const METHODE_TELECHARGEMENT = "telecharger";
39
	const METHODE_AFFICHAGE = "afficher";
39
	const METHODE_AFFICHAGE = "afficher";
40
	
40
	
41
	private $ressources;
41
	private $ressources;
42
	private $parametres;
42
	private $parametres;
43
	
43
	
44
	private $referentiel = '';
44
	private $referentiel = '';
45
	private $taxon   = null;
45
	private $taxon   = null;
46
	private $sources = array();
46
	private $sources = array();
47
	private $format  = 0;
47
	private $format  = 0;
48
	private $retour  = self::MIME_MAP;
48
	private $retour  = self::MIME_MAP;
49
	private $methode_livraison = self::METHODE_AFFICHAGE;
49
	private $methode_livraison = self::METHODE_AFFICHAGE;
50
	private $erreurs = array();
50
	private $erreurs = array();
51
 
51
 
52
	
52
	
53
	public function consulter($ressources, $parametres) {
53
	public function consulter($ressources, $parametres) {
54
		$this->parametres = $parametres;
54
		$this->parametres = $parametres;
55
		$this->ressources = $ressources;
55
		$this->ressources = $ressources;
56
		$resultat = null;
56
		$resultat = null;
57
		$this->chargerClassesSousDossier();
57
		$this->chargerClassesSousDossier();
58
		if ($this->analyserRessources() == true) {
58
		if ($this->analyserRessources() == true) {
59
			$resultat = $this->formerLegende();
59
			$resultat = $this->formerLegende();
60
		} else {
60
		} else {
61
			$this->traiterParametres();
61
			$this->traiterParametres();
62
			$resultat = $this->obtenirCarte();
62
			$resultat = $this->obtenirCarte();
63
			if($this->methode_livraison == self::METHODE_TELECHARGEMENT) {
63
			if($this->methode_livraison == self::METHODE_TELECHARGEMENT) {
64
				$this->telechargerCarte($resultat->corps);
64
				$this->telechargerCarte($resultat->corps);
65
			}
65
			}
66
		}
66
		}
67
		return $resultat;
67
		return $resultat;
68
	}
68
	}
69
	
69
	
70
	private function analyserRessources() {
70
	private function analyserRessources() {
71
		$ok = false;
71
		$ok = false;
72
		if (isset($this->ressources[0]) && $this->ressources[0] == 'legende') {
72
		if (isset($this->ressources[0]) && $this->ressources[0] == 'legende') {
73
			$ok = true;
73
			$ok = true;
74
		}
74
		}
75
		return $ok;
75
		return $ok;
76
	}
76
	}
77
	
77
	
78
	private function formerLegende() {
78
	private function formerLegende() {
79
		$legende = new LegendeCartes();
79
		$legende = new LegendeCartes();
80
		$resultat = $legende->obtenirLegende();
80
		$resultat = $legende->obtenirLegende();
81
		return $resultat;
81
		return $resultat;
82
	}
82
	}
83
	
83
	
84
	private function chargerClassesSousDossier() {
84
	private function chargerClassesSousDossier() {
85
		$this->verifierExistenceDossier("cartes");
85
		$this->verifierExistenceDossier("cartes");
86
		$nomDossier = dirname(__FILE__).DS."cartes";
86
		$nomDossier = dirname(__FILE__).DS."cartes";
87
		$dossier = opendir($nomDossier);
87
		$dossier = opendir($nomDossier);
88
		$fichiersAInclure = array();
88
		$fichiersAInclure = array();
89
		while ($fichier = readdir($dossier)) {
89
		while ($fichier = readdir($dossier)) {
90
			if (filetype($nomDossier.DS.$fichier) == 'file') {
90
			if (filetype($nomDossier.DS.$fichier) == 'file') {
91
				$fichiersAInclure[] = $nomDossier.DS.$fichier;
91
				$fichiersAInclure[] = $nomDossier.DS.$fichier;
92
			}
92
			}
93
		}
93
		}
94
		$fichiersAInclure = array_reverse($fichiersAInclure);
94
		$fichiersAInclure = array_reverse($fichiersAInclure);
95
		foreach ($fichiersAInclure as $fichier) {
95
		foreach ($fichiersAInclure as $fichier) {
96
			include_once($fichier);
96
			include_once($fichier);
97
		}
97
		}
98
	}
98
	}
99
	
99
	
100
	private function verifierExistenceDossier($nomDossier) {
100
	private function verifierExistenceDossier($nomDossier) {
101
		$dossier = dirname(__FILE__).DS.$nomDossier;
101
		$dossier = dirname(__FILE__).DS.$nomDossier;
102
		if (!file_exists($dossier) || !is_dir($dossier)) {
102
		if (!file_exists($dossier) || !is_dir($dossier)) {
103
			$message = "Problème rencontré lors de la génération de la carte : des ressources ".
103
			$message = "Problème rencontré lors de la génération de la carte : des ressources ".
104
				"nécessaires au fonctionnement du service n'ont pas été localisées sur le serveur.\n";
104
				"nécessaires au fonctionnement du service n'ont pas été localisées sur le serveur.\n";
105
			throw new Exception($message);
105
			throw new Exception($message);
106
		}
106
		}
107
	}
107
	}
108
	
108
	
109
	private function verifierExistenceFichier($nomFichier) {
109
	private function verifierExistenceFichier($nomFichier) {
110
		if (!file_exists($nomFichier)) {
110
		if (!file_exists($nomFichier)) {
111
			$message = "Problème rencontré lors de la génération de la carte : des ressources ".
111
			$message = "Problème rencontré lors de la génération de la carte : des ressources ".
112
				"nécessaires au fonctionnement du service n'ont pas été localisées sur le serveur.\n";
112
				"nécessaires au fonctionnement du service n'ont pas été localisées sur le serveur.\n";
113
			throw new Exception($message);
113
			throw new Exception($message);
114
		}
114
		}
115
	}
115
	}
116
	
116
	
117
	private function traiterParametres() {
117
	private function traiterParametres() {
118
		$this->verifierReferentielEtTaxon();
118
		$this->verifierReferentielEtTaxon();
119
		$this->verifierParametreSource();
119
		$this->verifierParametreSource();
120
		$this->verifierParametreFormat();
120
		$this->verifierParametreFormat();
121
		$this->verifierParametreRetour();
121
		$this->verifierParametreRetour();
122
		$this->verifierParametreMethodeLivraison();
122
		$this->verifierParametreMethodeLivraison();
123
		if (count($this->erreurs) > 0) {
123
		if (count($this->erreurs) > 0) {
124
			$this->renvoyerErreurs();
124
			$this->renvoyerErreurs();
125
		}
125
		}
126
	}
126
	}
127
	
127
	
128
	private function verifierParametreFormat() {
128
	private function verifierParametreFormat() {
129
		if (!isset($this->parametres['format'])) {
129
		if (!isset($this->parametres['format'])) {
130
			$this->erreurs[] = "Le paramètre format (dimensions) de l'image n'a pas été indiqué dans l'URL du service.";
130
			$this->erreurs[] = "Le paramètre format (dimensions) de l'image n'a pas été indiqué dans l'URL du service.";
131
		} elseif (preg_match('/^[1-9]\d{2}$/', $this->parametres['format']) != 1) {
131
		} elseif (preg_match('/^[1-9]\d{2}$/', $this->parametres['format']) != 1) {
132
			$this->erreurs[] = "La valeur du paramètre format n'est pas acceptée par le service. ".
132
			$this->erreurs[] = "La valeur du paramètre format n'est pas acceptée par le service. ".
133
				"Une largeur valide doit être un nombre entier compris entre 100 et 999.";
133
				"Une largeur valide doit être un nombre entier compris entre 100 et 999.";
134
		} else {
134
		} else {
135
			$this->format = $this->parametres['format'];
135
			$this->format = $this->parametres['format'];
136
		}
136
		}
137
	}
137
	}
138
	
138
	
139
	private function verifierParametreRetour() {
139
	private function verifierParametreRetour() {
140
		$typesMime = array(self::MIME_MAP, self::MIME_PNG);
140
		$typesMime = array(self::MIME_MAP, self::MIME_PNG);
141
		if (!isset($this->parametres['retour'])) {
141
		if (!isset($this->parametres['retour'])) {
142
			$this->erreurs[] = "Le paramètre type de retour de l'image n'a pas été indiqué dans l'URL du service.";
142
			$this->erreurs[] = "Le paramètre type de retour de l'image n'a pas été indiqué dans l'URL du service.";
143
		} elseif (!in_array($this->parametres['retour'], $typesMime)) {
143
		} elseif (!in_array($this->parametres['retour'], $typesMime)) {
144
			$this->erreurs[] = "Le format de retour ".$this->parametres['retour']." n'est pas acceptée par le service. ".
144
			$this->erreurs[] = "Le format de retour ".$this->parametres['retour']." n'est pas acceptée par le service. ".
145
				" Seuls les types MIME suivants sont gérés : ".implode(',', $typesMime);
145
				" Seuls les types MIME suivants sont gérés : ".implode(',', $typesMime);
146
		} else {
146
		} else {
147
			$this->retour = $this->parametres['retour'];
147
			$this->retour = $this->parametres['retour'];
148
		}
148
		}
149
	}
149
	}
150
	
150
	
151
	private function verifierParametreMethodeLivraison() {
151
	private function verifierParametreMethodeLivraison() {
152
		$typesMethodeLivraison = array(self::METHODE_AFFICHAGE, self::METHODE_TELECHARGEMENT);
152
		$typesMethodeLivraison = array(self::METHODE_AFFICHAGE, self::METHODE_TELECHARGEMENT);
153
		if (isset($this->parametres['methode']) && !in_array($this->parametres['methode'], $typesMethodeLivraison)) {
153
		if (isset($this->parametres['methode']) && !in_array($this->parametres['methode'], $typesMethodeLivraison)) {
154
			$this->erreurs[] = "Le format de methode de livraison ".$this->parametres['methode']." n'est pas acceptée par le service. ".
154
			$this->erreurs[] = "Le format de methode de livraison ".$this->parametres['methode']." n'est pas acceptée par le service. ".
155
						" Seuls les methodes suivantes sont gérés : ".implode(',', $typesMethodeLivraison);
155
						" Seuls les methodes suivantes sont gérés : ".implode(',', $typesMethodeLivraison);
156
		} elseif(isset($this->parametres['methode']) && in_array($this->parametres['methode'], $typesMethodeLivraison)) {
156
		} elseif(isset($this->parametres['methode']) && in_array($this->parametres['methode'], $typesMethodeLivraison)) {
157
			$this->methode_livraison = $this->parametres['methode'];
157
			$this->methode_livraison = $this->parametres['methode'];
158
		}
158
		}
159
	}
159
	}
160
	
160
	
161
	private function verifierParametreSource() {
161
	private function verifierParametreSource() {
162
		$sourcesDisponibles = explode(',', trim(Config::get('sourcesDonnees')));
162
		$sourcesDisponibles = explode(',', trim(Config::get('sourcesDonnees')));
163
		if (isset($this->parametres['source'])) {
163
		if (isset($this->parametres['source'])) {
164
			$sourcesParametre = explode(',', trim($this->parametres['source']));
164
			$sourcesParametre = explode(',', trim($this->parametres['source']));
165
			foreach ($sourcesParametre as $source) {
165
			foreach ($sourcesParametre as $source) {
166
				if (!in_array($source, $sourcesDisponibles)) {
166
				if (!in_array($source, $sourcesDisponibles)) {
167
					$this->erreurs[] = "La source de données $source n'est pas disponible pour ce service. ".
167
					$this->erreurs[] = "La source de données $source n'est pas disponible pour ce service. ".
168
						"Les sources suivantes sont utilisables : ".implode(',', $sourcesDisponibles).".";
168
						"Les sources suivantes sont utilisables : ".implode(',', $sourcesDisponibles).".";
169
				} else {
169
				} else {
170
					$this->sources[] = $source;
170
					$this->sources[] = $source;
171
				}
171
				}
172
			}
172
			}
173
		} else {
173
		} else {
174
			$this->sources = $sourcesDisponibles;
174
			$this->sources = $sourcesDisponibles;
175
		}
175
		}
176
	}
176
	}
177
	
177
	
178
	private function verifierReferentielEtTaxon() {
178
	private function verifierReferentielEtTaxon() {
179
		if (!$this->estReferentielDisponible()) {
179
		if (!$this->estReferentielDisponible()) {
180
			$this->erreurs[] = "Le référentiel ".$this->parametres['referentiel']." n'a pas été trouvé. ".
180
			$this->erreurs[] = "Le référentiel ".$this->parametres['referentiel']." n'a pas été trouvé. ".
181
				"La liste des référentiels disponibles pour ce service sont : ".Config::get('referentielsDispo');
181
				"La liste des référentiels disponibles pour ce service sont : ".Config::get('referentielsDispo');
182
		} else {
182
		} else {
183
			$this->referentiel = $this->parametres['referentiel'];
183
			$this->referentiel = $this->parametres['referentiel'];
184
			$taxon = $this->recupererInformationsTaxon();
184
			$taxon = $this->recupererInformationsTaxon();
185
			if (is_null($taxon)) {
185
			if (is_null($taxon)) {
186
				$this->erreurs[] = "Le taxon d'espèce que vous avez demandé n'a pas été trouvé dans le référentiel.";
186
				$this->erreurs[] = "Le taxon d'espèce que vous avez demandé n'a pas été trouvé dans le référentiel.";
187
			} else {
187
			} else {
188
				$this->taxon = $taxon;
188
				$this->taxon = $taxon;
189
			}
189
			}
190
		}
190
		}
191
	}
191
	}
192
	
192
	
193
	private function renvoyerErreurs() {
193
	private function renvoyerErreurs() {
194
		$message = "Les erreurs suivantes ont été rencontrées : \n".implode('\n', $this->erreurs);
194
		$message = "Les erreurs suivantes ont été rencontrées : \n".implode('\n', $this->erreurs);
195
		throw new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
195
		throw new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
196
	}
196
	}
197
	
197
	
198
	private function estReferentielDisponible() {
198
	private function estReferentielDisponible() {
199
		$referentielsDispo = explode(',', Config::get('referentielsDispo'));
199
		$referentielsDispo = explode(',', Config::get('referentielsDispo'));
200
		$estDisponible = (isset($this->parametres['referentiel'])
200
		$estDisponible = (isset($this->parametres['referentiel'])
201
			&& in_array($this->parametres['referentiel'], $referentielsDispo));
201
			&& in_array($this->parametres['referentiel'], $referentielsDispo));
202
		return $estDisponible;
202
		return $estDisponible;
203
	}
203
	}
204
	
204
	
205
	private function recupererInformationsTaxon() {
205
	private function recupererInformationsTaxon() {
206
		$taxon = null;
206
		$taxon = null;
207
		if (isset($this->parametres['num_taxon'])) {
207
		if (isset($this->parametres['num_taxon'])) {
208
			$numTaxon = $this->parametres['num_taxon'];
208
			$numTaxon = $this->parametres['num_taxon'];
209
			$nomTable = $this->recupererNomTableReferentiel();
209
			$nomTable = $this->recupererNomTableReferentiel();
210
			$bdd = new Bdd();
210
			$bdd = new Bdd();
211
			$requete = "SELECT num_nom, num_nom_retenu, nom_sci, nom_complet, rang, num_taxonomique FROM {$nomTable} ".
211
			$requete = "SELECT num_nom, num_nom_retenu, nom_sci, nom_complet, rang, num_taxonomique FROM {$nomTable} ".
212
				"WHERE num_taxonomique={$numTaxon} ORDER BY If(num_nom=num_nom_retenu,0,1) LIMIT 0,1";
212
				"WHERE num_taxonomique={$numTaxon} ORDER BY If(num_nom=num_nom_retenu,0,1) LIMIT 0,1";
213
			$taxon = $bdd->recuperer($requete);
213
			$taxon = $bdd->recuperer($requete);
214
			if ($taxon === false) {
214
			if ($taxon === false) {
215
				$taxon = null;
215
				$taxon = null;
216
			}
216
			}
217
		}
217
		}
218
		return $taxon;
218
		return $taxon;
219
	}
219
	}
220
	
220
	
221
	private function recupererNomTableReferentiel() {
221
	private function recupererNomTableReferentiel() {
222
		$tablesReferentiel = explode(',', Config::get('bdd_table_referentiel'));
222
		$tablesReferentiel = explode(',', Config::get('bdd_table_referentiel'));
223
		$nomTable = '';
223
		$nomTable = '';
224
		foreach ($tablesReferentiel as $table) {
224
		foreach ($tablesReferentiel as $table) {
225
			if (strstr($table, $this->referentiel) !== false) {
225
			if (strstr($table, $this->referentiel) !== false) {
226
				$nomTable = $table;
226
				$nomTable = $table;
227
			}
227
			}
228
		}
228
		}
229
		return $nomTable;
229
		return $nomTable;
230
	}
230
	}
231
 
231
 
232
	/**
232
	/**
233
	 * Va chercher la carte dans le cache si elle existe et n'a pas dépassé la durée
233
	 * Va chercher la carte dans le cache si elle existe et n'a pas dépassé la durée
234
	 * de vie $this->dureeCache; sinon, crée la carte et la met en cache.
234
	 * de vie $this->dureeCache; sinon, crée la carte et la met en cache.
235
	 * Avec le paramètre "recalculer=1", on force le vidage du cache et on recrée la carte
235
	 * Avec le paramètre "recalculer=1", on force le vidage du cache et on recrée la carte
236
	 */
236
	 */
237
	protected function obtenirCarte() {
237
	protected function obtenirCarte() {
238
		$carte = null;
238
		$carte = null;
239
		$cacheActif = Config::get('cache_miseEnCache');
239
		$cacheActif = Config::get('cache_miseEnCache');
240
		$cheminCache = Config::get('cache_stockageChemin');
240
		$cheminCache = Config::get('cache_stockageChemin');
241
		$extension = "cache"; // par défaut; indique un problème de mimetype demandé par "retour="
241
		$extension = "cache"; // par défaut; indique un problème de mimetype demandé par "retour="
242
		if ($this->retour == self::MIME_PNG) {
242
		if ($this->retour == self::MIME_PNG) {
243
			$extension = "png";
243
			$extension = "png";
244
		} elseif ($this->retour == self::MIME_MAP) {
244
		} elseif ($this->retour == self::MIME_MAP) {
245
			$extension = "svg";
245
			$extension = "svg";
246
		}
246
		}
247
		$cheminCarteEnCache = $cheminCache . $this->referentiel . "-nt-" . $this->taxon['num_taxonomique'] . "." . $extension;
247
		$cheminCarteEnCacheSansExtension = $cheminCache . $this->referentiel . "-nt-" . $this->taxon['num_taxonomique'] . "-" . $this->format . ".";
-
 
248
		$cheminCarteEnCache = $cheminCarteEnCacheSansExtension . $extension;
248
 
249
 
249
		// a-t-on demandé à régénérer la carte de force ?
250
		// a-t-on demandé à régénérer la carte de force ?
250
		$recalculer = false;
251
		$recalculer = false;
251
		if (isset($this->parametres['recalculer'])) {
252
		if (isset($this->parametres['recalculer'])) {
252
			$recalculer = ($this->parametres['recalculer'] === '1');
253
			$recalculer = ($this->parametres['recalculer'] === '1');
253
		}
254
		}
254
		// le cache est-il actif ?
255
		// le cache est-il actif ?
255
		if ($cacheActif) {
256
		if ($cacheActif) {
256
			// le fichier existe-t-il en cache ?
257
			// le fichier existe-t-il en cache ?
257
			//echo "Chemin fichier: $cheminCarteEnCache<br/>";
258
			//echo "Chemin fichier: $cheminCarteEnCache<br/>";
258
			if (file_exists($cheminCarteEnCache)) {
259
			if (file_exists($cheminCarteEnCache)) {
259
				$limiteDuree = Config::get('cache_dureeDeVie'); // pour ne pas trop faire pipi
260
				$limiteDuree = Config::get('cache_dureeDeVie'); // pour ne pas trop faire pipi
260
				$dateFichier = filectime($cheminCarteEnCache);
261
				$dateFichier = filectime($cheminCarteEnCache);
261
				$age = time() - $dateFichier;
262
				$age = time() - $dateFichier;
262
				// si le cache est trop vieux ou qu'on a demandé à recalculer
263
				// si le cache est trop vieux ou qu'on a demandé à recalculer
263
				if (($age > $limiteDuree) || $recalculer) {
264
				if (($age > $limiteDuree) || $recalculer) {
264
					// détruire le fichier obsolète
265
					// détruire le fichier obsolète
265
					unlink($cheminCarteEnCache);
266
					unlink($cheminCarteEnCache);
-
 
267
					// en cas de rechargement forcé, détruire les fichiers cache de même dimension
-
 
268
					// et de formats différents, afin ne pas provoquer d'incohérences
-
 
269
					// @ACHTUNG système minimaliste - si on modifie les dimensions, ça va foirer
-
 
270
					if ($recalculer) {
-
 
271
						foreach (glob($cheminCarteEnCacheSansExtension . "*") as $fichierCacheDeMemeDimension) {
-
 
272
							unlink($fichierCacheDeMemeDimension);
-
 
273
						}
-
 
274
					}
266
				} else {
275
				} else {
267
					// récupérer le fichier en cache
276
					// récupérer le fichier en cache
268
					$carte = file_get_contents($cheminCarteEnCache);
277
					$carte = file_get_contents($cheminCarteEnCache);
269
				}
278
				}
270
			}
279
			}
271
		}
280
		}
272
		// si la carte n'a pas été trouvée en cache
281
		// si la carte n'a pas été trouvée en cache
273
		if ($carte === null) {
282
		if ($carte === null) {
274
			// calculer la nouvelle carte
283
			// calculer la nouvelle carte
275
			$carte = $this->formerCarte();
284
			$carte = $this->formerCarte();
276
			// mettre la nouvelle carte en cache
285
			// mettre la nouvelle carte en cache
277
			if ($cacheActif) {
286
			if ($cacheActif) {
278
				file_put_contents($cheminCarteEnCache, $carte);
287
				file_put_contents($cheminCarteEnCache, $carte);
279
			}
288
			}
280
		}
289
		}
281
 
290
 
282
		// retour du service
291
		// retour du service
283
		$resultat = new ResultatService();
292
		$resultat = new ResultatService();
284
		$resultat->mime = $this->retour;
293
		$resultat->mime = $this->retour;
285
		$resultat->corps = $carte;
294
		$resultat->corps = $carte;
286
 
295
 
287
		return $resultat;
296
		return $resultat;
288
	}
297
	}
289
 
298
 
290
	/**
299
	/**
291
	 * Crée la carte - prend beaucoup de temps
300
	 * Crée la carte - prend beaucoup de temps
292
	 * @return ResultatService
301
	 * @return ResultatService
293
	 */
302
	 */
294
	protected function formerCarte() {
303
	protected function formerCarte() {
295
		$suffixe = 'france_moissonnage';
304
		$suffixe = 'france_moissonnage';
296
		
305
		
297
		// le fichier png avec les départements est illisible en petit format
306
		// le fichier png avec les départements est illisible en petit format
298
		// dans ce cas là un template plus simple est utilisé (sans les départements)
307
		// dans ce cas là un template plus simple est utilisé (sans les départements)
299
		if($this->format < 300 && $this->retour == self::MIME_PNG) {
308
		if($this->format < 300 && $this->retour == self::MIME_PNG) {
300
			$suffixe = $suffixe."_sans_departements";
309
			$suffixe = $suffixe."_sans_departements";
301
		}
310
		}
302
		
311
		
303
		$nomFichierSVG = Config::get('chemin')."{$suffixe}.svg";
312
		$nomFichierSVG = Config::get('chemin')."{$suffixe}.svg";
304
		$this->verifierExistenceFichier($nomFichierSVG);
313
		$this->verifierExistenceFichier($nomFichierSVG);
305
		
314
		
306
		$formateur = new FormateurSVG($nomFichierSVG, $this->sources, $this->retour, $this->format);
315
		$formateur = new FormateurSVG($nomFichierSVG, $this->sources, $this->retour, $this->format);
307
		$formateur->formaterCarte($this->taxon);
316
		$formateur->formaterCarte($this->taxon);
308
 
317
 
309
		$resultat = $formateur->renvoyerCarte();
318
		$resultat = $formateur->renvoyerCarte();
310
		return $resultat;
319
		return $resultat;
311
	}
320
	}
312
	
321
	
313
	private function telechargerCarte($fichier) {		
322
	private function telechargerCarte($fichier) {		
314
		if (function_exists('mb_strlen')) {
323
		if (function_exists('mb_strlen')) {
315
			$taille = mb_strlen($fichier, '8bit');
324
			$taille = mb_strlen($fichier, '8bit');
316
		} else {
325
		} else {
317
			$taille = strlen($fichier);
326
			$taille = strlen($fichier);
318
		}
327
		}
319
		
328
		
320
		$extension = ($this->retour == "text/html") ? 'html' : 'png';
329
		$extension = ($this->retour == "text/html") ? 'html' : 'png';
321
		
330
		
322
		header('Content-Description: File Transfer');
331
		header('Content-Description: File Transfer');
323
		header('Content-Type: application/octet-stream');
332
		header('Content-Type: application/octet-stream');
324
		header('Content-Disposition: attachment; filename="carte.'.$extension.'"');
333
		header('Content-Disposition: attachment; filename="carte.'.$extension.'"');
325
		header('Content-Transfer-Encoding: binary');
334
		header('Content-Transfer-Encoding: binary');
326
		header('Connection: Keep-Alive');
335
		header('Connection: Keep-Alive');
327
		header('Expires: 0');
336
		header('Expires: 0');
328
		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
337
		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
329
		header('Pragma: public');
338
		header('Pragma: public');
330
		header('Content-Length: '.$taille);
339
		header('Content-Length: '.$taille);
331
		
340
		
332
	}
341
	}
333
	
342
	
334
}
343
}
335
 
344
 
336
?>
345
?>