Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 248 | Rev 253 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 248 Rev 252
Line 23... Line 23...
23
	const TYPE_ID_DEFAUT = 'nn';
23
	const TYPE_ID_DEFAUT = 'nn';
24
	const CARTE_DEFAUT = 'france_02';
24
	const CARTE_DEFAUT = 'france_02';
25
	const FORMAT_DEFAUT = '550';
25
	const FORMAT_DEFAUT = '550';
26
	const MIME_SVG = 'image/svg+xml';
26
	const MIME_SVG = 'image/svg+xml';
27
	const MIME_PNG = 'image/png';
27
	const MIME_PNG = 'image/png';
-
 
28
	const PRESENCE_CHOROLOGIE = '1';
Line 28... Line 29...
28
 
29
 
29
	private $config = array();
30
	private $config = array();
30
	private $cheminCartesBase = '';
31
	private $cheminCartesBase = '';
31
	private $formats_supportes = array(self::MIME_SVG, self::MIME_PNG);
32
	private $formats_supportes = array(self::MIME_SVG, self::MIME_PNG);
32
	private $UrlNavigation = null;
33
	private $UrlNavigation = null;
33
	private $taxonsDemandes = array();
34
	private $taxonsDemandes = array();
34
	private $imgLargeur = 0;
35
	private $imgLargeur = 0;
-
 
36
	private $imgHauteur = 0;
-
 
37
	private $tableMeta = '';
-
 
38
	private $tableOntologie = '';
-
 
39
	private $tableChorodep = '';
-
 
40
	private $metadonnees = '';
-
 
41
	private $ontologies = '';
-
 
42
	private $priorites = '';
35
	private $imgHauteur = 0;
43
	private $version = '';
36
	private $legende = array();
44
	private $legende = array();
Line 37... Line 45...
37
	private $donnees = array();
45
	private $donnees = array();
38
 
46
 
39
	public function __construct(Bdd $bdd = null, Array $config = null, CacheSimple $cache = null) {
47
	public function __construct(Bdd $bdd = null, Array $config = null, CacheSimple $cache = null) {
40
		$this->Bdd = is_null($bdd) ? new Bdd() : $bdd;
-
 
-
 
48
		$this->Bdd = is_null($bdd) ? new Bdd() : $bdd;
-
 
49
		$this->config = is_null($config) ? Config::get('Cartes') : $config['Cartes'];
-
 
50
		$this->tableMeta = is_null($config) ? Config::get('bdd_table_meta') : $config['bdd_table_meta'];
-
 
51
		$this->tableOntologie = is_null($config) ? Config::get('bdd_table_ontologies') : $config['bdd_table_ontologies'];
-
 
52
		$this->chargerMetadonneesDerniereVersion();
-
 
53
		$this->version = $this->metadonnees['version'];
41
		$this->config = is_null($config) ? Config::get('Cartes') : $config;
54
		$this->tableChorodep = 'chorodep_v'.str_replace('.', '_', $this->version);
42
 
-
 
-
 
55
		$this->chargerOntologies();
43
		$this->chargerLegende();
56
		$this->chargerLegende();
44
 
-
 
45
		$this->cheminCartesBase = $this->config['chemin'];
57
		$this->chargerPrioritesLegende();
46
 
58
		$this->cheminCartesBase = $this->config['chemin'];
47
		$cacheOptions = array('mise_en_cache' => $this->config['cache']['miseEnCache'],
59
		$cacheOptions = array('mise_en_cache' => $this->config['cache']['miseEnCache'],
48
			'stockage_chemin' => $this->config['cache']['stockageChemin'],
-
 
49
			'duree_de_vie' => $this->config['cache']['dureeDeVie']);
60
			'stockage_chemin' => $this->config['cache']['stockageChemin'],
50
		//die(print_r($this->config, true));
61
			'duree_de_vie' => $this->config['cache']['dureeDeVie']);
Line 51... Line 62...
51
		$this->cache = is_null($cache) ? new CacheSimple($cacheOptions) : $cache;
62
		$this->cache = is_null($cache) ? new CacheSimple($cacheOptions) : $cache;
52
	}
63
	}
53
 
64
 
54
	private function chargerLegende() {
65
	private function chargerMetadonneesDerniereVersion() {
-
 
66
		$requete = 'SELECT * '.
-
 
67
			"FROM {$this->tableMeta} ".
-
 
68
			"ORDER BY date_creation DESC ".
-
 
69
			"LIMIT 0,1 ";
-
 
70
		$resultats = $this->Bdd->recuperer($requete);
-
 
71
 
-
 
72
		if (!is_array($resultats) || count($resultats) <= 0) {
-
 
73
			$message = "Les données de version n'a pu être chargée pour la ressource demandée";
-
 
74
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
-
 
75
			throw new Exception($message, $code);
-
 
76
		}
-
 
77
 
-
 
78
		$this->metadonnees = $resultats;
-
 
79
 
-
 
80
	}
-
 
81
 
55
		$requete = 'SELECT * '.
82
	private function chargerOntologies() {
Line 56... Line 83...
56
				'FROM chorodep_ontologies '.
83
		$requete = 'SELECT * '.
57
				"WHERE classe_id = 1 ";
84
					"FROM {$this->tableOntologie} ";
58
		$resultats = $this->Bdd->recupererTous($requete);
85
		$resultats = $this->Bdd->recupererTous($requete);
59
 
86
 
60
		if (!is_array($resultats) || count($resultats) <= 0) {
87
		if (!is_array($resultats) || count($resultats) <= 0) {
Line 61... Line 88...
61
			$message = "La légende n'a pu être chargée pour la ressource demandée";
88
			$message = "Les données de légende n'ont pu être chargées pour la ressource demandée";
62
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
89
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
63
			throw new Exception($message, $code);
-
 
64
		}
90
			throw new Exception($message, $code);
65
 
91
		}
Line -... Line 92...
-
 
92
 
66
		foreach ($resultats as $ontologie) {
93
		foreach ($resultats as $ontologie) {
-
 
94
			$this->ontologies[$ontologie['id']] = $this->extraireComplementsOntologies($ontologie);
67
			$ontologie = $this->extraireComplementsOntologies($ontologie);
95
		}
68
			$this->legende[$ontologie['code']] = $ontologie['legende'];
96
	}
69
		}
97
 
70
	}
98
 
-
 
99
	private function extraireComplementsOntologies($ontologie) {
71
 
100
		if ($ontologie['complements'] != '') {
72
	private function extraireComplementsOntologies($ontologie) {
101
			$complements = explode(',', trim($ontologie['complements']));
73
		$complements = explode(',', trim($ontologie['complements']));
102
			foreach ($complements as $complement) {
Line -... Line 103...
-
 
103
				list($cle, $val) = explode('=', trim($complement));
-
 
104
				$ontologie[trim($cle)] = trim($val);
-
 
105
			}
-
 
106
		}
-
 
107
		return $ontologie;
-
 
108
	}
-
 
109
 
-
 
110
	private function chargerLegende() {
-
 
111
		foreach ($this->ontologies as $ontologie) {
-
 
112
			if ($ontologie['classe_id'] == self::PRESENCE_CHOROLOGIE) {
-
 
113
				$this->legende[$ontologie['code']] = $ontologie['legende'];
-
 
114
			}
-
 
115
		}
-
 
116
	}
-
 
117
 
-
 
118
	private function chargerPrioritesLegende() {
74
		foreach ($complements as $complement) {
119
		foreach ($this->ontologies as $ontologie) {
75
			list($cle, $val) = explode('=', trim($complement));
120
			if ($ontologie['classe_id'] == self::PRESENCE_CHOROLOGIE && isset($ontologie['priorite'])) {
76
			$ontologie[trim($cle)] = trim($val);
121
				$this->priorites[$ontologie['code']] = $ontologie['priorite'];
77
		}
122
			}
Line 78... Line 123...
78
		return $ontologie;
123
		}
79
	}
124
	}
80
 
125
 
Line 81... Line 126...
81
	public function consulter($ressources, $parametres) {
126
	public function consulter($ressources, $parametres) {
82
		//$tpsDebut = microtime(true);
127
		//$tpsDebut = microtime(true);
83
		$this->parametres = $parametres;
128
		$this->parametres = $parametres;
84
		$this->ressources = $ressources;
129
		$this->ressources = $ressources;
Line 112... Line 157...
112
	}
157
	}
Line 113... Line 158...
113
 
158
 
114
	private function verifierParametres() {
159
	private function verifierParametres() {
Line 115... Line -...
115
		$erreurs = array();
-
 
116
 
-
 
117
		if ($this->verifierIdentifiants() == false) {
-
 
118
			$erreurs[] = "L'identifiant de ressource indiqué ne respecte pas le format attendu.";
160
		$erreurs = array();
119
		}
161
 
120
		if (isset($this->parametres['retour']) == false) {
162
		if (isset($this->parametres['retour']) == false) {
121
			$erreurs[] = "Le paramètre type de retour 'retour' est obligatoire.";
163
			$erreurs[] = "Le paramètre type de retour 'retour' est obligatoire.";
122
		}
164
		}
Line 136... Line 178...
136
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
178
			$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;
137
			throw new Exception($message, $code);
179
			throw new Exception($message, $code);
138
		}
180
		}
139
	}
181
	}
Line 140... Line -...
140
 
-
 
141
	private function verifierIdentifiants() {
-
 
142
		$ok = true;
-
 
143
		if (isset($this->ressources[0])) {
-
 
144
			$ids = $this->ressources[0];
-
 
145
			$projetPattern = '(?:(?:[A-Z0-9]+(\.(?:nn|nt)?):)?(?:[0-9]+,)*[0-9]+)';
-
 
146
			$patternComplet = "/^$projetPattern(?:;$projetPattern)*$/i";
-
 
147
			$ok = preg_match($patternComplet, $ids) ? true : false;
-
 
148
		}
-
 
149
		return $ok;
-
 
150
	}
-
 
151
 
182
 
152
	private function verifierValeurParametreRetour() {
183
	private function verifierValeurParametreRetour() {
153
		return in_array($this->parametres['retour'], $this->formats_supportes);
184
		return in_array($this->parametres['retour'], $this->formats_supportes);
Line 154... Line 185...
154
	}
185
	}
Line 161... Line 192...
161
			$this->imgHauteur = $match[2];
192
			$this->imgHauteur = $match[2];
162
		}
193
		}
163
		return $ok;
194
		return $ok;
164
	}
195
	}
Line 165... Line 196...
165
 
196
 
166
	private function analyserIdentifiant() {
197
	private function analyserRessources() {
-
 
198
		if (count($this->ressources) == 1) {
-
 
199
			$positionIds = 0;
167
		if (isset($this->ressources[0])) {
200
			if ($this->etreRessourceIdentifiants($positionIds)) {
168
			$ids = $this->ressources[0];
201
				$ids = $this->ressources[$positionIds];
169
			if (preg_match('/^[0-9]+$/', $ids)) {
202
				$this->analyserIdentifiants($ids);
170
				$this->taxonsDemandes[self::CODE_REFTAX_DEFAUT]['nn'][] = $ids;
203
				// TODO : charger une nouvelle classe executant le sous service.
171
			} else {
-
 
172
				// ceci contient potentiellement des formes ref_tax1.nn:1,2;ref_tax2.nt:3,4
204
			} else {
173
				throw new Exception("A implémenter : ressource id multiples");
205
				throw new Exception("A implémenter : carte proportionnelle ensemble des infos");
174
				$projetsListeEtNumNoms = explode(';', $nn);
206
			}
175
				if (count($projetsListeEtNumNoms) > 0) {
207
		} else if (count($this->ressources) == 2) {
176
					foreach ($projetsListeEtNumNoms as $projetEtNumNoms) {
-
 
177
						$projetEtNumNoms = (strpos($projetEtNumNoms, ':')) ? $projetEtNumNoms : self::CODE_REFTAX_DEFAUT.':'.$projetEtNumNoms;
208
			if ($this->etreIdentifiants(0)) {
178
						list($projet, $numNoms) = explode(':', $projetEtNumNoms);
209
				$ids = $this->ressources[$positionIds];
179
						$this->ref_tax_demande[$projet] = explode(',', $numNoms);
-
 
180
					}
-
 
181
				}
210
				$this->analyserIdentifiants($ids);
-
 
211
			}
-
 
212
			if ($this->etreRessourceLegende(1)) {
-
 
213
				// TODO : charger une nouvelle classe executant le sous service.
-
 
214
			}
-
 
215
		}
-
 
216
	}
-
 
217
 
-
 
218
	private function etreRessourceIdentifiants($position) {
-
 
219
		$ok = true;
-
 
220
		if (isset($this->ressources[$position])) {
-
 
221
			$ids = $this->ressources[$position];
-
 
222
			$projetPattern = '(?:(?:[A-Z0-9]+(\.(?:nn|nt)?):)?(?:[0-9]+,)*[0-9]+)';
-
 
223
			$patternComplet = "/^$projetPattern(?:;$projetPattern)*$/i";
-
 
224
			$ok = preg_match($patternComplet, $ids) ? true : false;
-
 
225
		}
-
 
226
		return $ok;
-
 
227
	}
-
 
228
 
-
 
229
	private function analyserIdentifiants($ids) {
-
 
230
		if (preg_match('/^[0-9]+$/', $ids)) {
182
			}
231
			$this->taxonsDemandes[self::CODE_REFTAX_DEFAUT]['nn'][] = $ids;
183
		} else {
232
		} else {
-
 
233
			// ceci contient potentiellement des formes ref_tax1.nn:1,2;ref_tax2.nt:3,4
-
 
234
			$projetsListeEtNumNoms = explode(';', $ids);
-
 
235
			if (count($projetsListeEtNumNoms) > 0) {
-
 
236
				foreach ($projetsListeEtNumNoms as $projetEtNumNoms) {
-
 
237
					$projetEtNumNoms = (strpos($projetEtNumNoms, ':')) ? $projetEtNumNoms : self::CODE_REFTAX_DEFAUT.'.nn:'.$projetEtNumNoms;
-
 
238
					list($projetEtType, $numNoms) = explode(':', $projetEtNumNoms);
-
 
239
					list($projet, $type) = explode('.', $projetEtType);
-
 
240
					$this->taxonsDemandes[$projet][$type] = explode(',', $numNoms);
-
 
241
				}
184
			throw new Exception("A implémenter : carte proportionnelle ensemble des infos");
242
			}
185
		}
243
		}
Line 186... Line 244...
186
	}
244
	}
-
 
245
 
-
 
246
	private function etreRessourceLegende($position) {
187
 
247
		$ok = true;
188
	private function chargerDonnees() {
248
		if (isset($this->ressources[$position])) {
-
 
249
			$legende = $this->ressources[$position];
-
 
250
			$ok = ($legende == 'legende') ? true : false;
-
 
251
		}
Line -... Line 252...
-
 
252
		return $ok;
-
 
253
	}
189
		$refTax = self::CODE_REFTAX_DEFAUT;
254
 
190
		$numNom = $this->Bdd->proteger($this->taxonsDemandes[$refTax]['nn'][0]);
255
	private function chargerDonnees() {
191
 
256
		$conditions = $this->getConditions();
192
		$requete = 'SELECT * '.
257
		$requete = 'SELECT * '.
Line 193... Line 258...
193
				'FROM chorodep_v2012_01 '.
258
				"FROM {$this->tableChorodep} ".
194
				"WHERE num_nom IN ($numNom) ";
259
				(isset($conditions) ? 'WHERE '.implode(' AND ', $conditions) : '');
195
		$resultat = $this->Bdd->recupererTous($requete);
260
		$resultat = $this->Bdd->recupererTous($requete);
196
 
261
 
197
		if (!is_array($resultat) || count($resultat) <= 0) {
262
		if (!is_array($resultat) || count($resultat) <= 0) {
198
			$message = "Aucune donnée ne correspond à la ressource demandée";
263
			$message = "Aucune donnée ne correspond à la ressource demandée";
199
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
264
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
Line -... Line 265...
-
 
265
			throw new Exception($message, $code);
-
 
266
		}
-
 
267
		$this->donnees = $resultat;
-
 
268
	}
-
 
269
 
-
 
270
	private function getConditions() {
-
 
271
		$conditions = null;
-
 
272
		if ($nnListe = $this->getListeNumNom()) {
-
 
273
			$conditions[] = "num_nom IN ($nnListe) ";
-
 
274
		}
-
 
275
		if ($ntListe = $this->getListeNumTax()) {
-
 
276
			$conditions[] = "num_tax IN ($ntListe) ";
-
 
277
		}
-
 
278
		return $conditions;
-
 
279
	}
-
 
280
 
-
 
281
	private function getListeNumNom() {
-
 
282
		$nnListe = null;
-
 
283
		$refTax = self::CODE_REFTAX_DEFAUT;
-
 
284
		if (isset($this->taxonsDemandes[$refTax])) {
-
 
285
			$nnProteges = array();
-
 
286
			if (isset($this->taxonsDemandes[$refTax]['nn'])) {
-
 
287
				foreach ($this->taxonsDemandes[$refTax]['nn'] as $nn) {
-
 
288
					$nnProteges[] = $this->Bdd->proteger($nn);
-
 
289
				}
-
 
290
				$nnListe = implode(',', $nnProteges);
-
 
291
			}
-
 
292
		}
-
 
293
		return $nnListe;
-
 
294
	}
-
 
295
 
-
 
296
	private function getListeNumTax() {
-
 
297
		$ntListe = null;
-
 
298
		$refTax = self::CODE_REFTAX_DEFAUT;
-
 
299
		if (isset($this->taxonsDemandes[$refTax])) {
-
 
300
			$ntProteges = array();
-
 
301
			if (isset($this->taxonsDemandes[$refTax]['nt'])) {
-
 
302
				foreach ($this->taxonsDemandes[$refTax]['nt'] as $nt) {
-
 
303
					$ntProteges[] = $this->Bdd->proteger($nt);
-
 
304
				}
-
 
305
				$ntListe = implode(',', $ntProteges);
200
			throw new Exception($message, $code);
306
			}
201
		}
307
		}
202
		$this->donnees = $resultat;
308
		return $ntListe;
Line 203... Line 309...
203
	}
309
	}
Line 211... Line 317...
211
 
317
 
212
		$racineElement = $dom->documentElement;
318
		$racineElement = $dom->documentElement;
Line 213... Line 319...
213
		$racineElement->setAttribute('width', $this->imgLargeur);
319
		$racineElement->setAttribute('width', $this->imgLargeur);
-
 
320
 
-
 
321
		$css = $this->creerCssCarte();
214
 
322
		$styleElement = $dom->getElementsByTagName('style')->item(0);
-
 
323
		$css = $styleElement->nodeValue.$css;
215
		$css = $this->creerCssCarte();
324
		$txtCss = $dom->createCDATASection($css);
Line 216... Line 325...
216
		$txtCss = $dom->createCDATASection($css);
325
		$styleElement->nodeValue = '';
217
		$dom->getElementsByTagName('style')->item(0)->appendChild($txtCss);
326
		$styleElement->appendChild($txtCss);
218
 
327
 
219
		$titre = $this->creerTitre();
328
		$titre = $this->creerTitre();
Line 225... Line 334...
225
		$taxonTitre = $this->creerTitreTaxon();
334
		$taxonTitre = $this->creerTitreTaxon();
226
		$taxonCdata = $dom->createCDATASection($taxonTitre);
335
		$taxonCdata = $dom->createCDATASection($taxonTitre);
227
		$xpath = new DOMXPath($dom);
336
		$xpath = new DOMXPath($dom);
228
		$taxonTitreEl = $xpath->query("//*[@id='titre-taxon']")->item(0);
337
		$taxonTitreEl = $xpath->query("//*[@id='titre-taxon']")->item(0);
229
		$taxonTitreEl->nodeValue = '';
338
		$taxonTitreEl->nodeValue = '';
-
 
339
		$taxonTitreEl->setAttribute('title', $taxonTitre);
230
		$taxonTitreEl->appendChild($taxonCdata);
340
		$taxonTitreEl->appendChild($taxonCdata);
Line 231... Line 341...
231
 
341
 
232
		$svg = $dom->saveXML();
342
		$svg = $dom->saveXML();
233
		return $svg;
343
		return $svg;
Line 234... Line 344...
234
	}
344
	}
235
 
345
 
236
	private function creerCssCarte() {
346
	private function creerCssCarte() {
237
		$fichierCssBase = $this->cheminCartesBase.self::CARTE_DEFAUT.'.css';
-
 
238
		$css = file_get_contents($fichierCssBase);
347
		$css = '';
239
 
348
		$this->getZonesPriorites();
240
		$zonesCouleurs = $this->getZonesCouleurs();
349
		$zonesCouleurs = $this->getZonesCouleurs();
241
		foreach ($zonesCouleurs as $couleur => $zonesClasses) {
350
		foreach ($zonesCouleurs as $couleur => $zonesClasses) {
242
			$classes = implode(', ', $zonesClasses);
351
			$classes = implode(', ', $zonesClasses);
243
			$css .= "$classes{\nfill:$couleur;\n}\n";
352
			$css .= "$classes{\nfill:$couleur;\n}\n";
244
		}
353
		}
Line 245... Line 354...
245
		return $css;
354
		return $css;
246
	}
355
	}
-
 
356
 
247
 
357
	private function getZonesPriorites() {
248
	private function getZonesCouleurs() {
358
		$this->zones = array();
249
		$zones = array();
359
		$zonesPrioritaires = array();
250
		foreach ($this->donnees as $donnee) {
360
		foreach ($this->donnees as $donnee) {
251
			foreach ($donnee as $champ => $valeur) {
361
			foreach ($donnee as $zoneId => $codeLegende) {
-
 
362
				if (preg_match('/^[0-9][0-9ab]$/i', $zoneId)) {
-
 
363
					if (array_key_exists($codeLegende, $this->priorites)) {
-
 
364
						$priorite = $this->priorites[$codeLegende];
-
 
365
						if (array_key_exists($zoneId, $zonesPrioritaires) == false) {
252
				if (preg_match('/^[0-9][0-9ab]$/i', $champ)) {
366
							$zonesPrioritaires[$zoneId] = 0;
-
 
367
						}
-
 
368
						if ($priorite > $zonesPrioritaires[$zoneId]) {
253
					if (array_key_exists($valeur, $this->legende)) {
369
							$zonesPrioritaires[$zoneId] = $priorite;
254
						$couleur = $this->legende[$valeur];
370
							$this->zones[$zoneId] = $codeLegende;
255
						$zones[$couleur][] = strtolower(".departement$champ");
371
						}
256
					}
372
					}
-
 
373
				}
-
 
374
			}
-
 
375
		}
-
 
376
	}
-
 
377
 
-
 
378
	private function getZonesCouleurs() {
-
 
379
		$zones = array();
-
 
380
		foreach ($this->zones as $zoneId => $codeLegende) {
-
 
381
			if (array_key_exists($codeLegende, $this->legende)) {
-
 
382
				$couleur = $this->legende[$codeLegende];
257
				}
383
				$zones[$couleur][] = strtolower(".departement$zoneId");
258
			}
384
			}
Line 259... Line 385...
259
		}
385
		}
260
		return $zones;
386
		return $zones;