Subversion Repositories eFlore/Applications.moissonnage

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
17 delphine 1
<?php
2
 
3
/**
4
 * Recuperer les stations ou se sont realisees des observations effectuees
5
 * par les utilisateurs du Carnet En Ligne (http://tela-botanica.org/page:cel
6
 *
7
 * @author Alexandre GALIBERT
8
 * @copyright 2013 Tela Botanica (accueil@tela-botanica.org)
9
 *
10
 */
11
 
12
 
13
 
14
class Stations {
15
 
16
private $zoom = null;
17
	private $bbox = null;
18
 
19
	private $utilisateur = '';
20
	private $departement = '';
21
	private $taxon = null;
22
	private $referentiel = '';
23
	private $sousTaxons = array();
24
 
25
	private $bdd;
26
 
27
 
28
	public function __construct() {}
29
 
30
	public function consulter($ressources, $parametres) {
31
		extract($parametres);
32
		$zoomMaxMaillage = Config::get('zoom_maximal_maillage');
33
		$seuilMaillage   = Config::get('seuil_maillage');
34
		$this->utilisateur = $utilisateur != '*' ? $utilisateur : '';
35
		$this->departement = $dept != '*' ? $dept : '';
36
 
37
		// recuperation, traitement de tous les parametres et vertification du zoom
38
		// et des coordonnees des limites de l'espace de recherche (parametre bbox)
39
		$statutParametresEspace = $this->traiterParametresEspace($parametres);
40
		if ($statutParametresEspace == false) {
41
			$message = "Recherche des stations impossible : parametres de l'espace de recherche incorrects";
42
			return new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
43
		}
44
 
45
		// recherche du taxon dans les referentiels bdtfx et bdtxa et verification de sa validite
46
		if ($referentiel != '*') {
47
			$this->referentiel = $this->verifierExistenceReferentiel($referentiel);
48
			if (is_null($this->referentiel)) {
49
				$message = "Recherche des stations impossible : referentiel inconnu\n"
50
					+ "Voici les referentiels disponibles : "
51
					+ implode(', ', Referentiel::listeReferentielsDisponibles());
52
				return new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
53
			}
54
		}
55
 
56
		if ($num_taxon != '*') {
57
			$this->traiterParametresTaxon($num_taxon);
58
			if (is_null($this->taxon)) {
59
				$message = "Recherche des stations impossible : taxon non trouve dans les referentiels";
60
				return new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
61
			}
62
			// recuperer les sous-taxons
63
			$referentiel = new Referentiel($this->referentiel);
64
			$this->sousTaxons = $referentiel->recupererSousTaxons();
65
		}
66
 
67
		$stations = array();
68
		if ($this->zoom <= $zoomMaxMaillage && is_null($this->taxon) && $this->departement != '*'
69
			&& $this->utilisateur != '*' && $this->nombreStations() >= $seuilMaillage) {
70
			// recuperer les mailles se trouvant dans l'espace de recherche demande
71
			$stations = $this->getMailles();
72
		} else {
73
			// recuperer les informations sur les stations repondant a ces parametres
74
			$stations = $this->recupererStations();
75
			if ($this->zoom <= $zoomMaxMaillage && count($stations) >= $seuilMaillage) {
76
				// generer un maillage a partir des stations recuperees dans la base de donnees
77
				$maillage = new Maillage($this->bbox, $this->zoom, 'sophy');
78
				$maillage->genererMaillesVides();
79
				$maillage->ajouterPoints($stations);
80
				$stations = $maillage->resumePourReponseAJAX();
81
			}
82
		}
83
 
84
		// mettre en forme les informations au format JSON
85
		$formateurJSON = new FormateurJson();
86
		$donneesFormatees = $formateurJSON->formaterStations($stations);
87
		return $donneesFormatees;
88
	}
89
 
90
 
91
 
92
	//-------------------------------------------------------------------------------
93
	//    Recuperation et verification des parametres
94
	//-------------------------------------------------------------------------------
95
 
96
private function traiterParametresEspace($parametres) {
97
		$this->zoom = $this->verifierZoom($parametres['zoom']);
98
		$this->bbox = $this->verifierCoordonneesBbox($parametres['bbox']);
99
		return (!is_null($this->zoom) && !is_null($this->bbox));
100
	}
101
 
102
	private function traiterParametresTaxon($numeroTaxon) {
103
		if ($numeroTaxon != '*') {
104
			if ($this->referentiel != '') {
105
				$referentiel = new Referentiel($this->referentiel);
106
				$this->taxon = $referentiel->recupererTaxon($numeroTaxon);
107
			} else {
108
				$this->taxon = $this->verifierExistenceTaxon($numeroTaxon);
109
			}
110
		}
111
	}
112
 
113
	private function verifierZoom($niveauZoom) {
114
		$zoom = intval($niveauZoom);
115
		$limitesZoom = array(
116
			'min' => intval(Config::get('carte.zoom_minimal')),
117
			'max' => intval(Config::get('carte.zoom_maximal'))
118
		);
119
		if ($zoom < $limitesZoom['min'] || $zoom > $limitesZoom['max']) {
120
			return null;
121
		}
122
		return $zoom;
123
	}
124
 
125
	private function verifierCoordonneesBbox($limitesBbox) {
126
		$coordonnees = explode(',', $limitesBbox);
127
		if (count($coordonnees) != 4) {
128
			return null;
129
		}
130
 
131
		// index du tableau des coordonnees : ouest/sud/est/nord
132
		$nomsIndexBbox = array("ouest", "sud", "est", "nord");
133
		$bbox = array();
134
		for ($i = 0; $i < count($coordonnees); $i ++) {
135
			$bbox[$nomsIndexBbox[$i]] = $coordonnees[$i];
136
		}
137
 
138
		// verifier que les coordonnees de chaque bord de la bbox sont valides
139
		$limites = array(
140
			'ouest' => floatval(Config::get('carte.limite_ouest')),
141
			'est'   => floatval(Config::get('carte.limite_est')),
142
			'sud'   => floatval(Config::get('carte.limite_sud')),
143
			'nord'  => floatval(Config::get('carte.limite_nord'))
144
		);
145
 
146
		if (floatval($bbox['ouest']) >= $limites['ouest']  && floatval($bbox['ouest']) <= $limites['est']
147
			&& floatval($bbox['est']) >= $limites['ouest'] && floatval($bbox['est']) <= $limites['est']
148
			&& floatval($bbox['nord']) >= $limites['sud']  && floatval($bbox['nord']) <= $limites['nord']
149
			&& floatval($bbox['sud']) >= $limites['sud']   && floatval($bbox['sud']) <= $limites['nord']) {
150
			return $bbox;
151
		}
152
		return null;
153
	}
154
 
155
	private function verifierExistenceReferentiel($referentiel) {
156
		if ($referentiel == '*') {
157
			return '';
158
		}
159
		$listeReferentiels = Referentiel::listeReferentielsDisponibles();
160
		foreach ($listeReferentiels as $nomReferentiel) {
161
			if (strstr($nomReferentiel, $referentiel) !== false) {
162
				$this->referentiel = $nomReferentiel;
163
				break;
164
			}
165
		}
166
		return null;
167
	}
168
 
169
	private function verifierExistenceTaxon($numTaxon) {
170
		$listeReferentiels = Referentiel::listeReferentielsDisponibles();
171
		// tester chaque referentiel jusqu'a trouver un taxon correspondant
172
		// a tous les criteres demandes dans les masques
173
		foreach ($listeReferentiels as $nomReferentiel) {
174
			$referentiel = new Referentiel($nomReferentiel);
175
			$taxon = $referentiel->recupererTaxon($numTaxon);
176
			if (!is_null($taxon)) {
177
				$this->referentiel = $nomReferentiel;
178
				return $taxon;
179
			}
180
		}
181
		return null;
182
	}
183
 
184
 
185
 
186
	//-------------------------------------------------------------------------------
187
	//    Recuperation des donnees dans la base de donnees
188
	//    et mise sous forme d'objet geographique en fonction du niveau de zoom
189
	//-------------------------------------------------------------------------------
190
 
191
	private function getBdd() {
192
		if (!isset($this->bdd)) {
193
			$this->bdd = new Bdd();
194
		}
195
		$this->bdd->requeter("USE tb_eflore");
196
		return $this->bdd;
197
	}
198
 
199
 
200
	/**
201
	 * Recuperer les points localisant les stations d'observation
202
	 */
203
	private function recupererStations() {
204
		$requete = 'SELECT DISTINCT lieu_station_nom AS "nom", lieu_station_latitude AS "latitude",'
205
			. ' lieu_station_longitude AS "longitude", \'STATION\' AS type_site FROM sophy_tapir WHERE '
206
			. $this->construireWhereDepartement() . $this->construireWhereUtilisateur()
207
			. $this->construireWhereTaxon() . $this->construireWhereCoordonnees()
208
			. ' GROUP BY lieu_station_latitude, lieu_station_longitude';
209
		return $this->getBdd()->recupererTous($requete);
210
	}
211
 
212
	private function construireWhereTaxon() {
213
		if (is_null($this->taxon)) {
214
			return '';
215
		}
216
		$criteres = '(nom_scientifique_complet LIKE \'' . addslashes($this->taxon['nom']) . '%\'';
217
		foreach ($this->sousTaxons as $sousTaxon) {
218
			$criteres .= ' OR nom_scientifique_complet LIKE \'' . addslashes($sousTaxon['nom']) . '%\'';
219
		}
220
		$criteres .= ') AND ';
221
		return $criteres;
222
	}
223
 
224
	private function construireWhereDepartement() {
225
		$sql = '';
226
		return $sql;
227
	}
228
 
229
	private function construireWhereUtilisateur() {
230
		$sql = '';
231
		if ($this->utilisateur != '') {
232
			$utilisateur = $this->getBdd()->proteger($this->utilisateur);
233
			$sql = " AND observateur_nom_complet = $utilisateur ";
234
		}
235
		return $sql;
236
	}
237
 
238
	private function construireWhereCoordonnees() {
239
		$criteres = ' AND lieu_station_latitude BETWEEN ' . $this->bbox['sud'] . ' AND '
240
			. $this->bbox['nord'] . ' AND ';
241
		if ($this->bbox['ouest'] > $this->bbox['est']) {
242
			$criteres .= '(lieu_station_longitude >= ' . $this->bbox['ouest']
243
				. ' OR lieu_station_latitude <= ' . $this->bbox['est'] . ')';
244
		} else {
245
			$criteres .= 'lieu_station_longitude BETWEEN ' . $this->bbox['ouest'] . ' AND '
246
				. $this->bbox['est'];
247
		}
248
		return $criteres;
249
	}
250
 
251
 
252
 
253
 
254
	private function nombreStations() {
255
		$requete = 'SELECT zoom, Sum(nombre_sites) AS "total_points" FROM mailles_sophy'
256
			. ' WHERE zoom=' . $this->zoom . ' AND limite_sud <= ' . $this->bbox['nord']
257
			. ' AND limite_nord >= ' . $this->bbox['sud'];
258
		if ($this->bbox['ouest'] > $this->bbox['est']) {
259
			$requete .= ' AND NOT (limite_ouest >= ' . $this->bbox['ouest']
260
				. ' AND limite_est <= ' . $this->bbox['est'] . ')';
261
		} else {
262
			$requete .= ' AND limite_ouest <= ' . $this->bbox['est']
263
				. ' AND limite_est >= ' . $this->bbox['ouest'];
264
		}
265
		$requete .= ' GROUP BY zoom';
266
		$resultat = $this->getBdd()->recuperer($requete);
267
		return $resultat['total_points'];
268
	}
269
 
270
	/**
271
	 * Recuperer les mailles contenant des points dans l'espace de recherche de la bbox
272
	 */
273
	private function getMailles() {
274
		$requete = 'SELECT zoom, position_latitude, position_longitude, limite_sud AS "sud",'
275
			. ' limite_ouest AS "ouest", limite_nord AS "nord", limite_est AS "est", nombre_sites'
276
			. ' AS "points", \'MAILLE\' AS "type_site" FROM mailles_sophy WHERE zoom=' . $this->zoom
277
			. ' AND limite_sud <= ' . $this->bbox['nord'] . ' AND limite_nord >= ' . $this->bbox['sud'];
278
		if ($this->bbox['ouest'] > $this->bbox['est']) {
279
			$requete .= ' AND NOT (limite_ouest >= ' . $this->bbox['ouest'] . ' AND limite_est <= '
280
				. $this->bbox['est'] . ')';
281
		} else {
282
			$requete .= ' AND limite_ouest <= ' . $this->bbox['est'] . ' AND limite_est >= '
283
				. $this->bbox['ouest'];
284
		}
285
		return $this->getBdd()->recupererTous($requete);
286
	}
287
 
288
}
289
 
290
?>