Subversion Repositories eFlore/Applications.moissonnage

Rev

Rev 31 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 31 Rev 34
Line 12... Line 12...
12
 *   - bbox : rectangle dont les bords delimitent en coordonnees l'espace de recherche de donnees spatiales
12
 *   - bbox : rectangle dont les bords delimitent en coordonnees l'espace de recherche de donnees spatiales
13
 *     L'ordre des valeurs est le suivant : ouest, sud, est, nord
13
 *     L'ordre des valeurs est le suivant : ouest, sud, est, nord
14
 *     On va verifier que c'est une serie de quatre nombre decimaux delimites par des virgules
14
 *     On va verifier que c'est une serie de quatre nombre decimaux delimites par des virgules
15
 *     et compris dans l'espace representant le monde a partir du systeme de projection WGS84 (EPSG:4326)
15
 *     et compris dans l'espace representant le monde a partir du systeme de projection WGS84 (EPSG:4326)
16
 *
16
 *
-
 
17
 *   - stations : liste de points d'observations. C'est une serie de stations qui est passee en parametres
17
 *   - longitude et latitude : representent les coordonnees d'un point dans l'espace
18
 *     de cette maniere, separees entre elles par un seperateur vertical |. Chaque station est decrite
18
 *     On va verifier que ces coordonnees soient valides dans le systeme de projection utilise
19
 *     par sa source de donnees, le type de site et ses coordonnees longitude et latitude.
19
 *
20
 *
20
 *   - referentiel : referentiel taxonomique a utiliser. On peut passer aussi bien en parametres
21
 *   - referentiel : referentiel taxonomique a utiliser. On peut passer aussi bien en parametres
21
 *     son nom court que son nom complet (incluant le numero de version)
22
 *     son nom court que son nom complet (incluant le numero de version)
22
 *     On va verifier la disponibilite du referentiel pour ce service
23
 *     On va verifier la disponibilite du referentiel pour ce service
23
 *
24
 *
Line 29... Line 30...
29
 *   - dept : une liste de numeros de departements separees entre eux par des virgules
30
 *   - dept : une liste de numeros de departements separees entre eux par des virgules
30
 *     On va verifier que chaque numero est un nombre entier et represente un code de departement valide
31
 *     On va verifier que chaque numero est un nombre entier et represente un code de departement valide
31
 *
32
 *
32
 *   - auteur : l'auteur de l'observation
33
 *   - auteur : l'auteur de l'observation
33
 *
34
 *
34
 *   - type_site : pour les observations, le type de point correspondant a la station cliquee
-
 
35
 *     (STATION ou COMMUNE). Cela indique le niveau de precision ramene aux coordonnees des observations
-
 
36
 *
-
 
37
 *   - date_debut et date_fin : intervalle de dates d'observation. On verifie que ce sont des dates valides
35
 *   - date_debut et date_fin : intervalle de dates d'observation. On verifie que ce sont des dates valides
38
 *     et que date_debut <= date_fin. Le programme peut accepter la presence d'un seul de ces deux
36
 *     et que date_debut <= date_fin. Le programme peut accepter la presence d'un seul de ces deux
39
 *     parametres : soit une date de debut, soit une date de fin
37
 *     parametres : soit une date de debut, soit une date de fin
-
 
38
 *     
-
 
39
 *   - nb_jours : valeur entiere qui indique de recuperer les observations effectuees ou transmises
-
 
40
 *     sur les derniers jours avant la date d'execution du script
40
 *
41
 *
41
 * La fonction principale de verification des parametres va parcourir tous les parametres, et verifier
42
 * La fonction principale de verification des parametres va parcourir tous les parametres, et verifier
42
 * pour chacun d'eux la validite de leurs valeurs. Dans le cas ou une valeur anormale est detectee
43
 * pour chacun d'eux la validite de leurs valeurs. Dans le cas ou une valeur anormale est detectee
43
 * ou qu'elle se trouve en dehors de l'intervalle des resultats acceptes, une liste de messages d'erreur
44
 * ou qu'elle se trouve en dehors de l'intervalle des resultats acceptes, une liste de messages d'erreur
44
 * sera generee et mise a jour.
45
 * sera generee et mise a jour.
Line 68... Line 69...
68
	private $bboxMonde = null;
69
	private $bboxMonde = null;
Line 69... Line 70...
69
	
70
	
70
	
71
	
71
	public function __construct($parametres) {
-
 
72
		foreach ($parametres as $nomParametre => $valeur) {
72
	public function __construct($parametres) {
73
			if ($nomParametre != 'source') {
-
 
74
				$this->parametres[$nomParametre] = $valeur;
73
		foreach ($parametres as $nomParametre => $valeur) {
75
			}
74
			$this->parametres[$nomParametre] = $valeur;
76
		}
75
		}
77
		$this->bboxMonde = array(
76
		$this->bboxMonde = array(
78
			'ouest' => floatval(Config::get('carte.limite_ouest')),
77
			'ouest' => floatval(Config::get('carte.limite_ouest')),
Line 88... Line 87...
88
			switch ($nomParametre) {
87
			switch ($nomParametre) {
89
				case 'zoom' : $this->traiterParametreZoom($valeur);
88
				case 'zoom' : $this->traiterParametreZoom($valeur);
90
					break;
89
					break;
91
				case 'bbox' : $this->traiterParametreBbox($valeur);
90
				case 'bbox' : $this->traiterParametreBbox($valeur);
92
					break;
91
					break;
93
				case 'longitude' :
-
 
94
				case 'latitude'  : $this->traiterParametresCoordonnees($this->parametres['longitude'],
92
				case 'stations'  : $this->traiterParametreStations($this->parametres['stations']);
95
					$this->parametres['latitude']);
-
 
96
					break;
93
					break;
97
				case 'dept' : $this->traiterParametreDepartement($valeur);
94
				case 'dept' : $this->traiterParametreDepartement($valeur);
98
					break;
95
					break;
99
				case 'auteur' : $this->traiterParametreAuteur($valeur);
96
				case 'auteur' : $this->traiterParametreAuteur($valeur);
100
					break;
97
					break;
Line 116... Line 113...
116
						$this->traiterParametresDate($dateDebut, $dateFin);
113
						$this->traiterParametresDate($dateDebut, $dateFin);
117
						$this->dateTraitee = true;
114
						$this->dateTraitee = true;
118
					}
115
					}
119
					break;
116
					break;
120
				}
117
				}
-
 
118
				case 'format' : $this->validation->format = strtolower($valeur); break;
121
				// autres parametres ==> les ignorer
119
				// autres parametres ==> les ignorer
122
				default : break;
120
				default : break;
123
			}
121
			}
124
		}
122
		}
125
		$this->verifierPresenceParametreSpatial();
123
		$this->verifierPresenceParametreSpatial();
Line 162... Line 160...
162
		} else {
160
		} else {
163
			$this->validation->zoom = $zoom;
161
			$this->validation->zoom = $zoom;
164
		}
162
		}
165
	}
163
	}
Line 166... Line 164...
166
	
164
	
-
 
165
	private function traiterParametreBbox($chaineBbox) {
-
 
166
		$listeBbox = explode('|', trim($chaineBbox));
-
 
167
		$critereBbox = array();
-
 
168
		foreach ($listeBbox as $bbox) {
-
 
169
			$bboxVerifiee = $this->verifierCoordonneesBbox($bbox);
-
 
170
			if (!is_null($bboxVerifiee)) {
-
 
171
				$critereBbox[] = $bboxVerifiee;
-
 
172
			}
-
 
173
		}
-
 
174
		$this->validation->bbox = $critereBbox;
-
 
175
	}
-
 
176
	
-
 
177
	private function verifierCoordonneesBbox($bbox) {
167
	private function traiterParametreBbox($bbox) {
178
		$bboxVerifiee = null;
168
		// verifier que la chaine de caracteres $bbox est une serie de chaque nombre decimaux
179
		// verifier que la chaine de caracteres $bbox est une serie de chaque nombre decimaux
169
		// separes entre eux par une virgule
180
		// separes entre eux par une virgule
170
		if (preg_match('/^(-?\d{1,3}(.\d+)?,){3}(-?\d{1,3}(.\d+)?)$/', $bbox) == 0) {
181
		if (preg_match('/^(-?\d{1,3}(.\d+)?,){3}(-?\d{1,3}(.\d+)?)$/', $bbox) == 0) {
171
			$message = "Format de saisie des coordonnees de la bounding box non valide.  Le service ".
182
			$message = "Format de saisie des coordonnees de la bounding box non valide.  Le service ".
Line 179... Line 190...
179
			for ($i = 0; $i < count($coordonnees); $i ++) {
190
			for ($i = 0; $i < count($coordonnees); $i ++) {
180
				$bbox[$nomsIndexBbox[$i]] = $coordonnees[$i];
191
				$bbox[$nomsIndexBbox[$i]] = $coordonnees[$i];
181
			}
192
			}
182
			// verifier que les coordonnees de chaque bord de la bbox sont valides
193
			// verifier que les coordonnees de chaque bord de la bbox sont valides
183
			if ($this->estUneBboxValide($bbox)) {
194
			if ($this->estUneBboxValide($bbox)) {
184
				$this->validation->bbox = $bbox;
195
				$bboxVerifiee = $bbox;
185
			} else {
196
			} else {
186
				$message = "Certaines coordonnées de la bounding box sont situés en dehors des limites ".
197
				$message = "Certaines coordonnées de la bounding box sont situés en dehors des limites ".
187
					"de notre monde";
198
					"de notre monde";
188
				$this->ajouterErreur($message);
199
				$this->ajouterErreur($message);
189
			}
200
			}
190
		}
201
		}
-
 
202
		return $bboxVerifiee;
191
	}
203
	}
Line 192... Line 204...
192
	
204
	
193
	private function estUneBboxValide($bbox) {
205
	private function estUneBboxValide($bbox) {
194
		$monde = $this->bboxMonde;
206
		$monde = $this->bboxMonde;
195
		return (floatval($bbox['ouest']) >= $monde['ouest']  && floatval($bbox['ouest']) <= $monde['est']
207
		return (floatval($bbox['ouest']) >= $monde['ouest']  && floatval($bbox['ouest']) <= $monde['est']
196
		&& floatval($bbox['est'])   >= $monde['ouest']  && floatval($bbox['est'])   <= $monde['est']
208
		&& floatval($bbox['est'])   >= $monde['ouest']  && floatval($bbox['est'])   <= $monde['est']
197
		&& floatval($bbox['nord'])  >= $monde['sud']    && floatval($bbox['nord'])  <= $monde['nord']
209
		&& floatval($bbox['nord'])  >= $monde['sud']    && floatval($bbox['nord'])  <= $monde['nord']
198
		&& floatval($bbox['sud'])   >= $monde['sud']    && floatval($bbox['sud'])   <= $monde['nord']);
210
		&& floatval($bbox['sud'])   >= $monde['sud']    && floatval($bbox['sud'])   <= $monde['nord']);
Line 199... Line 211...
199
	}
211
	}
-
 
212
	
-
 
213
	private function traiterParametreStations($listeStations) {
-
 
214
		$stations = explode('|', trim($listeStations));
-
 
215
		$critereStations = array();
-
 
216
		foreach ($stations as $station) {
-
 
217
			preg_match("/([a-z]+):([a-z]+):(-?\d{1,3}.\d+),(-?\d{1,3}.\d+)/", $station, $matches);
-
 
218
			if (count($matches) < 5) {
-
 
219
				$message = "Les données transmises sur la station à interroger sont incomplètes. ".
-
 
220
					"Le format suivant doit être respecté : source:type_site:longitude:latitude";
-
 
221
				$this->ajouterErreur($message);
-
 
222
			} else {
-
 
223
				$matches = array_splice($matches, 1, count($matches));
-
 
224
				$this->verifierCoordonneesStation($matches);
-
 
225
				$this->verifierSourceStation($matches[0]);
-
 
226
				$this->verifierTypeStation($matches[1]);
-
 
227
				$critereStations[] = $matches;
-
 
228
			}
-
 
229
		}
-
 
230
		$this->validation->stations = $critereStations;
-
 
231
	}
-
 
232
	
-
 
233
	private function verifierCoordonneesStation(& $station) {
200
	
234
		$longitude = floatval($station[2]);
201
	private function traiterParametresCoordonnees($longitude, $latitude) {
235
		$latitude  = floatval($station[3]);
202
		if ($this->sontDesCoordonneesValides($longitude, $latitude)) {
236
		if ($this->sontDesCoordonneesValides($longitude, $latitude)) {
203
			$this->validation->latitude = $latitude;
237
			$station[2] = $latitude;
204
			$this->validation->longitude = $longitude;
238
			$station[3] = $longitude;
205
		} else {
-
 
206
			$message = "Les coordonnees du point passées en parametres sont en dehors des limites de ".
239
		} else {
207
				"notre monde";
240
			$message = "Les coordonnees du point passées en parametres sont en dehors des limites de notre monde";
208
			$this->ajouterErreur($message);
241
			$this->ajouterErreur($message);
Line 209... Line 242...
209
		}
242
		}
210
	}
243
	}
211
	
244
	
212
	private function sontDesCoordonneesValides($longitude, $latitude) {
245
	private function sontDesCoordonneesValides($longitude, $latitude) {
213
		$monde = $this->bboxMonde;
246
		$monde = $this->bboxMonde;
Line -... Line 247...
-
 
247
		return (floatval($longitude) >= $monde['ouest'] && floatval($longitude) <= $monde['est']
-
 
248
			&& floatval($latitude)  >= $monde['sud']   && floatval($latitude)  <= $monde['nord']);
-
 
249
	}
-
 
250
	
-
 
251
	private function verifierTypeStation($typeStation) {
-
 
252
		$typeStationsValides = array('station', 'commune');
-
 
253
		if (!in_array($typeStation, $typeStationsValides)) {
-
 
254
			$message = "'$typeStation' n'est pas un type de station reconnu. Sont acceptés seulement 'station' et 'commune'.";
-
 
255
			$this->ajouterErreur($message);
-
 
256
		}
-
 
257
	}
-
 
258
	
-
 
259
	private function verifierSourceStation($source) {
-
 
260
		$sourcesARequeter = explode(',', trim($this->parametres['source']));
-
 
261
		if (!in_array($source, $sourcesARequeter)) {
-
 
262
			$message = "La source '$source' n'est pas listée dans le paramètre source de l'URL (sont disponibles ".
-
 
263
				implode(',', $sourcesARequeter).").";
214
		return (floatval($longitude) >= $monde['ouest'] && floatval($longitude) <= $monde['est']
264
			$this->ajouterErreur($message);
215
			&& floatval($latitude)  >= $monde['sud']   && floatval($latitude)  <= $monde['nord']);
265
		}
216
	}
266
	}
217
	
267
	
218
	private function traiterParametreDepartement($numeroDepartement) {
268
	private function traiterParametreDepartement($numeroDepartement) {
Line 398... Line 448...
398
	}
448
	}
Line 399... Line 449...
399
	
449
	
400
	private function verifierPresenceParametreSpatial() {
450
	private function verifierPresenceParametreSpatial() {
401
		$presenceParametreSpatial = false;
451
		$presenceParametreSpatial = false;
402
		if (isset($this->parametres['bbox'])
452
		if (isset($this->parametres['bbox'])
403
			|| (isset($this->parametres['longitude']) && isset($this->parametres['latitude']))) {
453
			|| (isset($this->parametres['stations']))) {
404
			$presenceParametreSpatial = true;
454
			$presenceParametreSpatial = true;
405
		}
455
		}
406
		if ($presenceParametreSpatial == false) {
456
		if ($presenceParametreSpatial == false) {
407
			$message = "Aucune coordonnée n'a été saisie";
457
			$message = "Aucune coordonnée n'a été saisie";