Subversion Repositories eFlore/Applications.moissonnage

Rev

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

Rev Author Line No. Line
18 delphine 1
<?php
2
 
3
 
4
 
5
class Observations {
6
 
7
	private $longitude = null;
8
	private $latitude = null;
9
 
10
	private $utilisateur = '';
11
	private $taxon = null;
12
	private $referentiel = '';
13
	private $sousTaxons = array();
14
 
15
	private $bdd;
16
 
17
 
18
	public function __construct() {}
19
 
20
 
21
	public function consulter($ressources, $parametres) {
22
		extract($parametres);
23
		$this->utilisateur = $utilisateur != '*' ? $utilisateur : '';
24
		$this->departement = $dept != '*' ? $dept : '';
25
		$this->traiterParametresCoordonnees($parametres);
26
		if (is_null($this->longitude) || is_null($this->latitude)) {
27
			$message = "Recherche des observations impossible : coordonnees de la station hors du plan";
28
			return new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
29
		}
30
 
31
		// recherche du taxon dans les referentiels bdtfx et bdtxa et verification de sa validite
32
		if ($referentiel != '*') {
33
			$this->referentiel = $this->verifierExistenceReferentiel($referentiel);
34
			if (is_null($this->referentiel)) {
35
				$message = "Recherche des stations impossible : referentiel inconnu\n"
36
					+ "Voici les referentiels disponibles : "
37
					+ implode(', ', Referentiel::listeReferentielsDisponibles());
38
				return new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
39
			}
40
		}
41
 
42
		if ($num_taxon != '*') {
43
			$this->traiterParametresTaxon($num_taxon);
44
			if (is_null($this->taxon)) {
45
				$message = "Recherche des stations impossible : taxon non trouve dans les referentiels";
46
				return new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
47
			}
48
			// recuperer les sous-taxons
49
			$referentiel = new Referentiel($this->referentiel);
50
			$this->sousTaxons = $referentiel->recupererSousTaxons();
51
		}
52
 
53
		// recuperer les informations sur les stations repondant a ces parametres
54
		$observations = $this->recupererObservations();
55
		$nomSite = $this->obtenirNomSite();
56
 
57
		// mettre en forme les informations au format JSON
58
		$formateurJSON = new FormateurJson();
59
		$donneesFormatees = $formateurJSON->formaterObservations($observations, $nomSite);
60
		return $donneesFormatees;
61
	}
62
 
63
 
64
 
65
 
66
	//-------------------------------------------------------------------------------
67
	//    Recuperation et verification des parametres
68
	//-------------------------------------------------------------------------------
69
 
70
	private function traiterParametresCoordonnees($parametres) {
71
		$this->longitude = $this->verifierCoordonnees($parametres['longitude'], 'lng');
72
		$this->latitude  = $this->verifierCoordonnees($parametres['latitude'],  'lat');
73
	}
74
 
75
	private function verifierCoordonnees($valeur, $axe) {
76
		$limites = array(
77
			'ouest' => floatval(Config::get('carte.limite_ouest')),
78
			'est'   => floatval(Config::get('carte.limite_est')),
79
			'sud'   => floatval(Config::get('carte.limite_sud')),
80
			'nord'  => floatval(Config::get('carte.limite_nord'))
81
		);
82
		if (($axe=='lng' && floatval($valeur) >= $limites['ouest'] && floatval($valeur) <= $limites['est'])
83
			|| ($axe=='lat' && floatval($valeur) >= $limites['sud'] && floatval($valeur) <= $limites['nord'])) {
84
			return $valeur;
85
		}
86
 
87
		return null;
88
	}
89
 
90
	private function traiterParametresTaxon($numeroTaxon) {
91
		if ($numeroTaxon != '*') {
92
			if ($this->referentiel != '') {
93
				$referentiel = new Referentiel($this->referentiel);
94
				$this->taxon = $referentiel->recupererTaxon($numeroTaxon);
95
			} else {
96
				$this->taxon = $this->verifierExistenceTaxon($numeroTaxon);
97
			}
98
		}
99
	}
100
 
101
	private function verifierExistenceReferentiel($referentiel) {
102
		if ($referentiel == '*') {
103
			return '';
104
		}
105
		$listeReferentiels = Referentiel::listeReferentielsDisponibles();
106
		foreach ($listeReferentiels as $nomReferentiel) {
107
			if (strstr($nomReferentiel, $referentiel) !== false) {
108
				$this->referentiel = $nomReferentiel;
109
				break;
110
			}
111
		}
112
		return null;
113
	}
114
 
115
	private function verifierExistenceTaxon($numTaxon) {
116
		$listeReferentiels = Referentiel::listeReferentielsDisponibles();
117
		// tester chaque referentiel jusqu'a trouver un taxon correspondant
118
		// a tous les criteres demandes dans les masques
119
		foreach ($listeReferentiels as $nomReferentiel) {
120
			$referentiel = new Referentiel($nomReferentiel);
121
			$taxon = $referentiel->recupererTaxon($numTaxon);
122
			if (!is_null($taxon)) {
123
				$this->referentiel = $nomReferentiel;
124
				return $taxon;
125
			}
126
		}
127
		return null;
128
	}
129
 
130
 
131
 
132
	//-------------------------------------------------------------------------------
133
	//    Recuperation des donnees dans la base de donnees
134
	//    et mise sous forme d'objet geographique en fonction du niveau de zoom
135
	//-------------------------------------------------------------------------------
136
 
137
	private function recupererObservations() {
138
		$requete = 'SELECT ' . $this->construireColonnesSelection() . ' FROM cel_obs'
139
			. ' WHERE transmission=1' . $this->construireWhereUtilisateur()
140
			. $this->construireWhereTaxon() . $this->construireWhereCoordonnees()
141
			. ' ORDER BY nom_ret, date, observateur';
142
		return $this->getBdd()->recupererTous($requete);
143
	}
144
 
145
	private function getBdd() {
146
		if (!isset($this->bdd)) {
147
			$this->bdd = new Bdd();
148
		}
149
		$this->bdd->requeter("USE tb_cel");
150
		return $this->bdd;
151
	}
152
 
153
	private function construireColonnesSelection() {
154
		$colonnes = array(
155
			'idObs' => 'id_observation',
156
			'nn' => 'nom_ret_nn',
157
			'nomSci' => 'nom_ret',
158
			'date' => 'Date(date_transmission)',
159
			'lieu' => 'milieu',
160
			'observateur' => "Concat(prenom_utilisateur, ' ', nom_utilisateur)",
161
			'observateurId' => 'ce_utilisateur',
162
			'urlEflore' => "If(nom_ret_nn IS NULL, NULL, Concat('http://www.tela-botanica.org/bdtfx-nn-', nom_ret_nn))"
163
		);
164
		$selectSql = '';
165
		foreach ($colonnes as $renvoi => $colonne) {
166
			$selectSql .= (strlen($selectSql) == 0 ? '' : ', ') . "{$colonne} AS {$renvoi}";
167
		}
168
		return $selectSql;
169
	}
170
 
171
	private function construireWhereTaxon() {
172
		$sql = '';
173
		if (!is_null($this->taxon)) {
174
			$criteres = "nom_ret LIKE '" . addslashes($this->taxon['nom']) . "%'";
175
			foreach ($this->sousTaxons as $sousTaxon) {
176
				$criteres .= " OR nom_ret LIKE '" . addslashes($sousTaxon['nom']) . "%'";
177
			}
178
			$sql = " AND ($criteres)";
179
		}
180
		return $sql;
181
	}
182
 
183
	private function construireWhereUtilisateur() {
184
		$sql = '';
185
		if ($this->utilisateur != '') {
186
			$utilisateur = $this->getBdd()->proteger($this->utilisateur);
187
			$sql = " AND courriel_utilisateur = $utilisateur ";
188
		}
189
		return $sql;
190
	}
191
 
192
	private function construireWhereCoordonnees() {
193
		// coordonnees du point qui correspondent a une commune ?
194
		$requete = "SELECT id_zone_geo FROM cel_zones_geo WHERE wgs84_longitude=" . $this->longitude
195
		. " AND wgs84_latitude=" . $this->latitude;
196
		$commune = $this->getBdd()->recuperer($requete);
197
 
198
		$sql = ' AND ((longitude=' .  $this->longitude . ' AND latitude=' . $this->latitude . ')';
199
		if ($commune != false) {
200
			$sql .= " OR (longitude IS NULL AND latitude IS NULL AND ce_zone_geo='"
201
				. $commune['id_zone_geo'] . "')";
202
		}
203
		$sql .= ')';
204
		return $sql;
205
	}
206
 
207
	private function obtenirNomSite() {
208
		// coordonnees du point qui correspondent a une commune ?
209
		$requete = 'SELECT code, nom FROM cel_zones_geo WHERE wgs84_longitude=' . $this->longitude
210
			. ' AND wgs84_latitude=' . $this->latitude;
211
		$site = $this->getBdd()->recuperer($requete);
212
		if (!$site) {
213
			// recuperer les informations de la station
214
			$requete = 'SELECT DISTINCT lieudit AS "nom" FROM cel_obs WHERE longitude='
215
				. $this->longitude . ' AND latitude = ' . $this->latitude;
216
			$site = $this->getBdd()->recuperer($requete);
217
		}
218
		if (!$site)
219
			return null;
220
		return is_null($site['nom']) ? '' : $site['nom'];
221
	}
222
 
223
}
224
 
225
?>