Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 727 | Rev 811 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 727 Rev 747
1
<?php
1
<?php
-
 
2
 
-
 
3
/**
-
 
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,
-
 
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
-
 
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.
-
 
10
 * 
-
 
11
 * Parametres :
-
 
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
-
 
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.
-
 
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,
-
 
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.
-
 
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
-
 
22
 *     le PNG (image/png) et le XML (text/html) pour renvoyer le web service
-
 
23
 * 
-
 
24
 * @package framework-0.4
-
 
25
 * @author Alexandre GALIBERT <alexandre.galibert@tela-botanica.org>
-
 
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>
-
 
28
 * @version $Id$
-
 
29
 * @copyright 2013 Tela Botanica (accueil@tela-botanica.org)
-
 
30
 *
-
 
31
 */
2
 
32
 
3
class Cartes {
33
class Cartes {
4
 
34
 
5
	const MIME_MAP = "text/html";
35
	const MIME_MAP = "text/html";
6
	const MIME_PNG = "image/png";
36
	const MIME_PNG = "image/png";
7
	
37
	
8
	private $ressources;
38
	private $ressources;
9
	private $parametres;
39
	private $parametres;
10
	
40
	
11
	private $referentiel = '';
41
	private $referentiel = '';
12
	private $taxon   = null;
42
	private $taxon   = null;
13
	private $sources = array();
43
	private $sources = array();
14
	private $format  = 'max';
44
	private $format  = 0;
15
	private $retour  = self::MIME_MAP;
45
	private $retour  = self::MIME_MAP;
16
	private $erreurs = array();
46
	private $erreurs = array();
17
	
47
	
18
	
48
	
19
	public function consulter($ressources, $parametres) {
49
	public function consulter($ressources, $parametres) {
20
		$this->parametres = $parametres;
50
		$this->parametres = $parametres;
21
		$this->ressources = $ressources;
51
		$this->ressources = $ressources;
22
		$resultat = null;
52
		$resultat = null;
23
		$this->chargerClassesSousDossier();
53
		$this->chargerClassesSousDossier();
24
		if ($this->analyserRessources() == true) {
54
		if ($this->analyserRessources() == true) {
25
			$resultat = $this->formerLegende();
55
			$resultat = $this->formerLegende();
26
		} else {
56
		} else {
27
			$this->traiterParametres();
57
			$this->traiterParametres();
28
			$resultat = $this->formerCarte();
58
			$resultat = $this->formerCarte();
29
		}
59
		}
30
		return $resultat;
60
		return $resultat;
31
	}
61
	}
32
	
62
	
33
	private function analyserRessources() {
63
	private function analyserRessources() {
34
		$ok = false;
64
		$ok = false;
35
		if (isset($this->ressources[0]) && $this->ressources[0] == 'legende') {
65
		if (isset($this->ressources[0]) && $this->ressources[0] == 'legende') {
36
			$ok = true;
66
			$ok = true;
37
		}
67
		}
38
		return $ok;
68
		return $ok;
39
	}
69
	}
40
	
70
	
41
	private function formerLegende() {
71
	private function formerLegende() {
42
		$legende = new LegendeCartes();
72
		$legende = new LegendeCartes();
43
		$resultat = $legende->obtenirLegende();
73
		$resultat = $legende->obtenirLegende();
44
		return $resultat;
74
		return $resultat;
45
	}
75
	}
46
	
76
	
47
	private function chargerClassesSousDossier() {
77
	private function chargerClassesSousDossier() {
48
		$this->verifierExistenceDossier("cartes");
78
		$this->verifierExistenceDossier("cartes");
49
		$nomDossier = dirname(__FILE__).DS."cartes";
79
		$nomDossier = dirname(__FILE__).DS."cartes";
50
		$dossier = opendir($nomDossier);
80
		$dossier = opendir($nomDossier);
51
		$fichiersAInclure = array();
81
		$fichiersAInclure = array();
52
		while ($fichier = readdir($dossier)) {
82
		while ($fichier = readdir($dossier)) {
53
			if (filetype($nomDossier.DS.$fichier) == 'file') {
83
			if (filetype($nomDossier.DS.$fichier) == 'file') {
54
				$fichiersAInclure[] = $nomDossier.DS.$fichier;
84
				$fichiersAInclure[] = $nomDossier.DS.$fichier;
55
			}
85
			}
56
		}
86
		}
57
		$fichiersAInclure = array_reverse($fichiersAInclure);
87
		$fichiersAInclure = array_reverse($fichiersAInclure);
58
		foreach ($fichiersAInclure as $fichier) {
88
		foreach ($fichiersAInclure as $fichier) {
59
			include_once($fichier);
89
			include_once($fichier);
60
		}
90
		}
61
	}
91
	}
62
	
92
	
63
	private function verifierExistenceDossier($nomDossier) {
93
	private function verifierExistenceDossier($nomDossier) {
64
		$dossier = dirname(__FILE__).DS.$nomDossier;
94
		$dossier = dirname(__FILE__).DS.$nomDossier;
65
		if (!file_exists($dossier) || !is_dir($dossier)) {
95
		if (!file_exists($dossier) || !is_dir($dossier)) {
66
			$message = "Problème rencontré lors de la génération de la carte : des ressources ".
96
			$message = "Problème rencontré lors de la génération de la carte : des ressources ".
67
				"nécessaires au fonctionnement du service n'ont pas été localisées sur le serveur.\n";
97
				"nécessaires au fonctionnement du service n'ont pas été localisées sur le serveur.\n";
68
			throw new Exception($message);
98
			throw new Exception($message);
69
		}
99
		}
70
	}
100
	}
71
	
101
	
72
	private function verifierExistenceFichier($nomFichier) {
102
	private function verifierExistenceFichier($nomFichier) {
73
		if (!file_exists($nomFichier)) {
103
		if (!file_exists($nomFichier)) {
74
			$message = "Problème rencontré lors de la génération de la carte : des ressources ".
104
			$message = "Problème rencontré lors de la génération de la carte : des ressources ".
75
				"nécessaires au fonctionnement du service n'ont pas été localisées sur le serveur.\n";
105
				"nécessaires au fonctionnement du service n'ont pas été localisées sur le serveur.\n";
76
			throw new Exception($message);
106
			throw new Exception($message);
77
		}
107
		}
78
	}
108
	}
79
	
109
	
80
	private function traiterParametres() {
110
	private function traiterParametres() {
81
		$this->verifierReferentielEtTaxon();
111
		$this->verifierReferentielEtTaxon();
82
		$this->verifierParametreSource();
112
		$this->verifierParametreSource();
83
		$this->verifierParametreFormat();
113
		$this->verifierParametreFormat();
84
		$this->verifierParametreRetour();
114
		$this->verifierParametreRetour();
85
		if (count($this->erreurs) > 0) {
115
		if (count($this->erreurs) > 0) {
86
			$this->renvoyerErreurs();
116
			$this->renvoyerErreurs();
87
		}
117
		}
88
	}
118
	}
89
	
119
	
90
	private function verifierParametreFormat() {
120
	private function verifierParametreFormat() {
91
		if (!isset($this->parametres['format'])) {
121
		if (!isset($this->parametres['format'])) {
92
			$this->erreurs[] = "Le paramètre format (dimensions) de l'image n'a pas été indiqué dans l'URL du service.";
122
			$this->erreurs[] = "Le paramètre format (dimensions) de l'image n'a pas été indiqué dans l'URL du service.";
93
		} elseif (preg_match('/^[1-9]\d{2}$/', $this->parametres['format']) != 1) {
123
		} elseif (preg_match('/^[1-9]\d{2}$/', $this->parametres['format']) != 1) {
94
			$this->erreurs[] = "La valeur du paramètre format n'est pas acceptée par le service. ".
124
			$this->erreurs[] = "La valeur du paramètre format n'est pas acceptée par le service. ".
95
				"Une largeur valide doit être un nombre entier compris entre 100 et 999.";
125
				"Une largeur valide doit être un nombre entier compris entre 100 et 999.";
96
		} else {
126
		} else {
97
			$this->format = $this->parametres['format'];
127
			$this->format = $this->parametres['format'];
98
		}
128
		}
99
	}
129
	}
100
	
130
	
101
	private function verifierParametreRetour() {
131
	private function verifierParametreRetour() {
102
		$typesMime = array(self::MIME_MAP, self::MIME_PNG);
132
		$typesMime = array(self::MIME_MAP, self::MIME_PNG);
103
		if (!isset($this->parametres['retour'])) {
133
		if (!isset($this->parametres['retour'])) {
104
			$this->erreurs[] = "Le paramètre type de retour de l'image n'a pas été indiqué dans l'URL du service.";
134
			$this->erreurs[] = "Le paramètre type de retour de l'image n'a pas été indiqué dans l'URL du service.";
105
		} elseif (!in_array($this->parametres['retour'], $typesMime)) {
135
		} elseif (!in_array($this->parametres['retour'], $typesMime)) {
106
			$this->erreurs[] = "Le format de retour ".$this->parametres['retour']." n'est pas acceptée par le service. ".
136
			$this->erreurs[] = "Le format de retour ".$this->parametres['retour']." n'est pas acceptée par le service. ".
107
				" Seuls les types MIME suivants sont gérés : ".implode(',', $typesMime);
137
				" Seuls les types MIME suivants sont gérés : ".implode(',', $typesMime);
108
		} else {
138
		} else {
109
			$this->retour = $this->parametres['retour'];
139
			$this->retour = $this->parametres['retour'];
110
		}
140
		}
111
	}
141
	}
112
	
142
	
113
	private function verifierParametreSource() {
143
	private function verifierParametreSource() {
114
		$sourcesDisponibles = explode(',', trim(Config::get('sourcesDonnees')));
144
		$sourcesDisponibles = explode(',', trim(Config::get('sourcesDonnees')));
115
		if (isset($this->parametres['source'])) {
145
		if (isset($this->parametres['source'])) {
116
			$sourcesParametre = explode(',', trim($this->parametres['source']));
146
			$sourcesParametre = explode(',', trim($this->parametres['source']));
117
			foreach ($sourcesParametre as $source) {
147
			foreach ($sourcesParametre as $source) {
118
				if (!in_array($source, $sourcesDisponibles)) {
148
				if (!in_array($source, $sourcesDisponibles)) {
119
					$this->erreurs[] = "La source de données $source n'est pas disponible pour ce service. ".
149
					$this->erreurs[] = "La source de données $source n'est pas disponible pour ce service. ".
120
						"Les sources suivantes sont utilisables : ".implode(',', $sourcesDisponibles).".";
150
						"Les sources suivantes sont utilisables : ".implode(',', $sourcesDisponibles).".";
121
				} else {
151
				} else {
122
					$this->sources[] = $source;
152
					$this->sources[] = $source;
123
				}
153
				}
124
			}
154
			}
125
		} else {
155
		} else {
126
			$this->sources = $sourcesDisponibles;
156
			$this->sources = $sourcesDisponibles;
127
		}
157
		}
128
	}
158
	}
129
	
159
	
130
	private function verifierReferentielEtTaxon() {
160
	private function verifierReferentielEtTaxon() {
131
		if (!$this->estReferentielDisponible()) {
161
		if (!$this->estReferentielDisponible()) {
132
			$this->erreurs[] = "Le référentiel ".$this->parametres['referentiel']." n'a pas été trouvé. ".
162
			$this->erreurs[] = "Le référentiel ".$this->parametres['referentiel']." n'a pas été trouvé. ".
133
				"La liste des référentiels disponibles pour ce service sont : ".Config::get('referentielsDispo');
163
				"La liste des référentiels disponibles pour ce service sont : ".Config::get('referentielsDispo');
134
		} else {
164
		} else {
135
			$this->referentiel = $this->parametres['referentiel'];
165
			$this->referentiel = $this->parametres['referentiel'];
136
			$taxon = $this->recupererInformationsTaxon();
166
			$taxon = $this->recupererInformationsTaxon();
137
			if (is_null($taxon)) {
167
			if (is_null($taxon)) {
138
				$this->erreurs[] = "Le taxon d'espèce que vous avez demandé n'a pas été trouvé dans le référentiel.";
168
				$this->erreurs[] = "Le taxon d'espèce que vous avez demandé n'a pas été trouvé dans le référentiel.";
139
			} else {
169
			} else {
140
				$this->taxon = $taxon;
170
				$this->taxon = $taxon;
141
			}
171
			}
142
		}
172
		}
143
	}
173
	}
144
	
174
	
145
	private function renvoyerErreurs() {
175
	private function renvoyerErreurs() {
146
		$message = "Les erreurs suivantes ont été rencontrées : \n".implode('\n', $this->erreurs);
176
		$message = "Les erreurs suivantes ont été rencontrées : \n".implode('\n', $this->erreurs);
147
		throw new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
177
		throw new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
148
	}
178
	}
149
	
179
	
150
	private function estReferentielDisponible() {
180
	private function estReferentielDisponible() {
151
		$referentielsDispo = explode(',', Config::get('referentielsDispo'));
181
		$referentielsDispo = explode(',', Config::get('referentielsDispo'));
152
		$estDisponible = (isset($this->parametres['referentiel'])
182
		$estDisponible = (isset($this->parametres['referentiel'])
153
			&& in_array($this->parametres['referentiel'], $referentielsDispo));
183
			&& in_array($this->parametres['referentiel'], $referentielsDispo));
154
		return $estDisponible;
184
		return $estDisponible;
155
	}
185
	}
156
	
186
	
157
	private function recupererInformationsTaxon() {
187
	private function recupererInformationsTaxon() {
158
		$taxon = null;
188
		$taxon = null;
159
		if (isset($this->parametres['num_taxon'])) {
189
		if (isset($this->parametres['num_taxon'])) {
160
			$numTaxon = $this->parametres['num_taxon'];
190
			$numTaxon = $this->parametres['num_taxon'];
161
			$nomTable = $this->recupererNomTableReferentiel();
191
			$nomTable = $this->recupererNomTableReferentiel();
162
			$bdd = new Bdd();
192
			$bdd = new Bdd();
163
			$requete = "SELECT num_nom, num_nom_retenu, nom_sci, rang, num_taxonomique FROM {$nomTable} ".
193
			$requete = "SELECT num_nom, num_nom_retenu, nom_sci, rang, num_taxonomique FROM {$nomTable} ".
164
				"WHERE num_taxonomique={$numTaxon} ORDER BY If(num_nom=num_nom_retenu,0,1) LIMIT 0,1";
194
				"WHERE num_taxonomique={$numTaxon} ORDER BY If(num_nom=num_nom_retenu,0,1) LIMIT 0,1";
165
			$taxon = $bdd->recuperer($requete);
195
			$taxon = $bdd->recuperer($requete);
166
			if ($taxon === false) {
196
			if ($taxon === false) {
167
				$taxon = null;
197
				$taxon = null;
168
			}
198
			}
169
		}
199
		}
170
		return $taxon;
200
		return $taxon;
171
	}
201
	}
172
	
202
	
173
	private function recupererNomTableReferentiel() {
203
	private function recupererNomTableReferentiel() {
174
		$tablesReferentiel = explode(',', Config::get('bdd_table_referentiel'));
204
		$tablesReferentiel = explode(',', Config::get('bdd_table_referentiel'));
175
		$nomTable = '';
205
		$nomTable = '';
176
		foreach ($tablesReferentiel as $table) {
206
		foreach ($tablesReferentiel as $table) {
177
			if (strstr($table, $this->referentiel) !== false) {
207
			if (strstr($table, $this->referentiel) !== false) {
178
				$nomTable = $table;
208
				$nomTable = $table;
179
			}
209
			}
180
		}
210
		}
181
		return $nomTable;
211
		return $nomTable;
182
	}
212
	}
183
	
213
	
184
	private function formerCarte() {
214
	private function formerCarte() {
185
		$suffixe = 'france_moissonnage';
215
		$suffixe = 'france_moissonnage';
186
		$nomFichierSVG = Config::get('chemin')."{$suffixe}.svg";
216
		$nomFichierSVG = Config::get('chemin')."{$suffixe}.svg";
187
		$this->verifierExistenceFichier($nomFichierSVG);
217
		$this->verifierExistenceFichier($nomFichierSVG);
188
		
218
		
189
		$formateur = new FormateurSVG($nomFichierSVG, $this->sources, $this->retour, $this->format);
219
		$formateur = new FormateurSVG($nomFichierSVG, $this->sources, $this->retour, $this->format);
190
		$formateur->formaterCarte($this->taxon);
220
		$formateur->formaterCarte($this->taxon);
191
		$resultat = new ResultatService();
221
		$resultat = new ResultatService();
192
		$resultat->corps = $formateur->renvoyerCarte();
222
		$resultat->corps = $formateur->renvoyerCarte();
193
		$resultat->mime = $this->retour;
223
		$resultat->mime = $this->retour;
194
 
224
 
195
		return $resultat;
225
		return $resultat;
196
	}
226
	}
197
	
227
	
198
}
228
}
199
 
229
 
200
?>
230
?>