14,8 → 14,9 |
* On va verifier que c'est une serie de quatre nombre decimaux delimites par des virgules |
* et compris dans l'espace representant le monde a partir du systeme de projection WGS84 (EPSG:4326) |
* |
* - longitude et latitude : representent les coordonnees d'un point dans l'espace |
* On va verifier que ces coordonnees soient valides dans le systeme de projection utilise |
* - stations : liste de points d'observations. C'est une serie de stations qui est passee en parametres |
* de cette maniere, separees entre elles par un seperateur vertical |. Chaque station est decrite |
* par sa source de donnees, le type de site et ses coordonnees longitude et latitude. |
* |
* - referentiel : referentiel taxonomique a utiliser. On peut passer aussi bien en parametres |
* son nom court que son nom complet (incluant le numero de version) |
31,13 → 32,13 |
* |
* - auteur : l'auteur de l'observation |
* |
* - type_site : pour les observations, le type de point correspondant a la station cliquee |
* (STATION ou COMMUNE). Cela indique le niveau de precision ramene aux coordonnees des observations |
* |
* - date_debut et date_fin : intervalle de dates d'observation. On verifie que ce sont des dates valides |
* et que date_debut <= date_fin. Le programme peut accepter la presence d'un seul de ces deux |
* parametres : soit une date de debut, soit une date de fin |
* |
* - nb_jours : valeur entiere qui indique de recuperer les observations effectuees ou transmises |
* sur les derniers jours avant la date d'execution du script |
* |
* La fonction principale de verification des parametres va parcourir tous les parametres, et verifier |
* pour chacun d'eux la validite de leurs valeurs. Dans le cas ou une valeur anormale est detectee |
* ou qu'elle se trouve en dehors de l'intervalle des resultats acceptes, une liste de messages d'erreur |
70,10 → 71,8 |
|
public function __construct($parametres) { |
foreach ($parametres as $nomParametre => $valeur) { |
if ($nomParametre != 'source') { |
$this->parametres[$nomParametre] = $valeur; |
} |
} |
$this->bboxMonde = array( |
'ouest' => floatval(Config::get('carte.limite_ouest')), |
'est' => floatval(Config::get('carte.limite_est')), |
90,9 → 89,7 |
break; |
case 'bbox' : $this->traiterParametreBbox($valeur); |
break; |
case 'longitude' : |
case 'latitude' : $this->traiterParametresCoordonnees($this->parametres['longitude'], |
$this->parametres['latitude']); |
case 'stations' : $this->traiterParametreStations($this->parametres['stations']); |
break; |
case 'dept' : $this->traiterParametreDepartement($valeur); |
break; |
118,6 → 115,7 |
} |
break; |
} |
case 'format' : $this->validation->format = strtolower($valeur); break; |
// autres parametres ==> les ignorer |
default : break; |
} |
164,7 → 162,20 |
} |
} |
|
private function traiterParametreBbox($bbox) { |
private function traiterParametreBbox($chaineBbox) { |
$listeBbox = explode('|', trim($chaineBbox)); |
$critereBbox = array(); |
foreach ($listeBbox as $bbox) { |
$bboxVerifiee = $this->verifierCoordonneesBbox($bbox); |
if (!is_null($bboxVerifiee)) { |
$critereBbox[] = $bboxVerifiee; |
} |
} |
$this->validation->bbox = $critereBbox; |
} |
|
private function verifierCoordonneesBbox($bbox) { |
$bboxVerifiee = null; |
// verifier que la chaine de caracteres $bbox est une serie de chaque nombre decimaux |
// separes entre eux par une virgule |
if (preg_match('/^(-?\d{1,3}(.\d+)?,){3}(-?\d{1,3}(.\d+)?)$/', $bbox) == 0) { |
181,7 → 192,7 |
} |
// verifier que les coordonnees de chaque bord de la bbox sont valides |
if ($this->estUneBboxValide($bbox)) { |
$this->validation->bbox = $bbox; |
$bboxVerifiee = $bbox; |
} else { |
$message = "Certaines coordonnées de la bounding box sont situés en dehors des limites ". |
"de notre monde"; |
188,6 → 199,7 |
$this->ajouterErreur($message); |
} |
} |
return $bboxVerifiee; |
} |
|
private function estUneBboxValide($bbox) { |
198,13 → 210,34 |
&& floatval($bbox['sud']) >= $monde['sud'] && floatval($bbox['sud']) <= $monde['nord']); |
} |
|
private function traiterParametresCoordonnees($longitude, $latitude) { |
private function traiterParametreStations($listeStations) { |
$stations = explode('|', trim($listeStations)); |
$critereStations = array(); |
foreach ($stations as $station) { |
preg_match("/([a-z]+):([a-z]+):(-?\d{1,3}.\d+),(-?\d{1,3}.\d+)/", $station, $matches); |
if (count($matches) < 5) { |
$message = "Les données transmises sur la station à interroger sont incomplètes. ". |
"Le format suivant doit être respecté : source:type_site:longitude:latitude"; |
$this->ajouterErreur($message); |
} else { |
$matches = array_splice($matches, 1, count($matches)); |
$this->verifierCoordonneesStation($matches); |
$this->verifierSourceStation($matches[0]); |
$this->verifierTypeStation($matches[1]); |
$critereStations[] = $matches; |
} |
} |
$this->validation->stations = $critereStations; |
} |
|
private function verifierCoordonneesStation(& $station) { |
$longitude = floatval($station[2]); |
$latitude = floatval($station[3]); |
if ($this->sontDesCoordonneesValides($longitude, $latitude)) { |
$this->validation->latitude = $latitude; |
$this->validation->longitude = $longitude; |
$station[2] = $latitude; |
$station[3] = $longitude; |
} else { |
$message = "Les coordonnees du point passées en parametres sont en dehors des limites de ". |
"notre monde"; |
$message = "Les coordonnees du point passées en parametres sont en dehors des limites de notre monde"; |
$this->ajouterErreur($message); |
} |
} |
215,6 → 248,23 |
&& floatval($latitude) >= $monde['sud'] && floatval($latitude) <= $monde['nord']); |
} |
|
private function verifierTypeStation($typeStation) { |
$typeStationsValides = array('station', 'commune'); |
if (!in_array($typeStation, $typeStationsValides)) { |
$message = "'$typeStation' n'est pas un type de station reconnu. Sont acceptés seulement 'station' et 'commune'."; |
$this->ajouterErreur($message); |
} |
} |
|
private function verifierSourceStation($source) { |
$sourcesARequeter = explode(',', trim($this->parametres['source'])); |
if (!in_array($source, $sourcesARequeter)) { |
$message = "La source '$source' n'est pas listée dans le paramètre source de l'URL (sont disponibles ". |
implode(',', $sourcesARequeter).")."; |
$this->ajouterErreur($message); |
} |
} |
|
private function traiterParametreDepartement($numeroDepartement) { |
if ($numeroDepartement != '*') { |
$departements = explode(',', trim($numeroDepartement)); |
400,7 → 450,7 |
private function verifierPresenceParametreSpatial() { |
$presenceParametreSpatial = false; |
if (isset($this->parametres['bbox']) |
|| (isset($this->parametres['longitude']) && isset($this->parametres['latitude']))) { |
|| (isset($this->parametres['stations']))) { |
$presenceParametreSpatial = true; |
} |
if ($presenceParametreSpatial == false) { |