Rev 31 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/**** Classe en charge de recuperer les donnees d'observation ou liees a leur localisation* Le jeu de donnees a interroger est partage en commun avec l'application EFlore** On passera en parametre lors de la creation d'une instance un objet contenant la liste des criteres* qui vont restreindre le nombre de resultats a renvoyer** Les deux operations suivantes peuvent etre utilisees dans les services :* - recupererStations : va rechercher dans la base de donnees tous les points d'observations* correspondant aux criteres de recherche demandes. La precision des lieux d'observation est* soit un point precis, soit ramenee au niveau de la commune dans laquelle l'observation a ete faite* En fonction du niveau de zoom et du nombre de resultats trouves, la presentation se fera* soit par les points localisant les stations pour des niveaux de zoom eleves ou pour un nombre* de stations inferieur a un seuil, ou par des mailles de 64*64 pixels dans le cas contraire** - recupererObservations : va rechercher dans la base de donnees les donnees sur des observations* a partir des coordonnees longitude et latitude d'une station (+ des parametres additionnels)** Les donnees seront renvoyees au format JSON** @package framework-0.4* @author Alexandre GALIBERT <alexandre.galibert@tela-botanica.org>* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>* @version $Id$* @copyright 2013 Tela Botanica (accueil@tela-botanica.org)**/class MoissonnageFormateur extends Formateur {final protected function construireRequeteStations() {$requete ="SELECT COUNT(guid) AS observations, lieu_station_nom AS nom, lieu_station_latitude AS latitude, "."lieu_station_longitude AS longitude, 'STATION' AS type_site, lieu_commune_code_insee AS code_insee, "."'{$this->nomSource}' AS source FROM {$this->nomSource}_tapir WHERE 1 ".$this->construireWhereDepartement().' '.$this->construireWhereAuteur().' '.$this->construireWhereDate().' '.$this->construireWhereReferentiel().' '.$this->construireWhereTaxon().' '.$this->construireWhereCoordonneesBbox().' '."GROUP BY lieu_station_longitude, lieu_station_latitude";return $requete;}final protected function construireRequeteObservations() {$requete ="SELECT observation_id AS id_obs, nom_scientifique_complet AS nomSci, "."observation_date AS date, lieu_station_nom AS lieu, observateur_nom_complet AS observateur, "."'{$this->nomSource}' AS projet FROM {$this->nomSource}_tapir WHERE 1 ".$this->construireWhereAuteur().' '.$this->construireWhereReferentiel().' '.$this->construireWhereDate().' '.$this->construireWhereTaxon().' '.$this->construireWhereCoordonneesPoint().' '."ORDER BY nom_scientifique_complet, date, observateur";return $requete;}final protected function construireRequeteWfs() {$requete ="SELECT nom_scientifique_complet AS taxon, lieu_station_nom AS nom, lieu_station_latitude AS latitude, "."lieu_station_longitude AS longitude, 'STATION' AS type_site, lieu_commune_code_insee AS code_insee, "."'{$this->nomSource}' AS source FROM {$this->nomSource}_tapir WHERE 1 ".$this->construireWhereCoordonneesBbox().' '.$this->construireWhereNomScientifique().' '."ORDER BY lieu_station_longitude, lieu_station_latitude";return $requete;}private function construireWhereTaxon() {$sql = '';if (isset($this->criteresRecherche->taxon)) {$taxons = $this->criteresRecherche->taxon;$criteres = array();foreach ($taxons as $taxon) {$criteres[] = "nom_scientifique_complet LIKE ".$this->getBdd()->proteger($taxon['nom']."%");if ($taxon['rang'] >= Config::get('rang.espece')) {$criteres = array_merge($criteres, $this->concatenerSynonymesEtSousEspeces($taxon));} elseif ($taxon['rang'] == Config::get('rang.famille')) {$criteres = array_merge($criteres, $this->concatenerTaxonsGenres($taxon));}}$sql = "AND (".implode(' OR ',array_unique($criteres)).")";}return $sql;}private function concatenerSynonymesEtSousEspeces($taxon) {$referentiel = new Referentiel($this->criteresRecherche->referentiel, $taxon);$sousTaxons = $referentiel->recupererSynonymesEtSousEspeces();$criteres = array();foreach ($sousTaxons as $sousTaxon) {$criteres[] = "nom_scientifique_complet LIKE ".$this->getBdd()->proteger($sousTaxon['nom']."%");}return $criteres;}private function concatenerTaxonsGenres($taxon) {$referentiel = new Referentiel($this->criteresRecherche->referentiel, $taxon);$sousTaxons = $referentiel->recupererGenres();$criteres = array();foreach ($sousTaxons as $sousTaxon) {$criteres[] = "nom_scientifique_complet LIKE ".$this->getBdd()->proteger($sousTaxon['nom']."%");}return $criteres;}private function construireWhereReferentiel() {$sql = '';if (isset($this->criteresRecherche->referentiel)) {$referentielSource = Config::get('referentiel_source');if (strstr($this->criteresRecherche->referentiel, $referentielSource) === false) {$sql = "AND 0";}}return $sql;}private function construireWhereDepartement() {$sql = '';if (isset($this->criteresRecherche->departement)) {$valeurs_a_proteger = $this->criteresRecherche->departement;foreach ($valeurs_a_proteger as $valeur) {$aProteger = $this->getBdd()->proteger($valeur . '%');$valeurs_protegees[] = "lieu_commune_code_insee LIKE {$aProteger}";}$valeurs = implode(' OR ', $valeurs_protegees);$sql = "AND ($valeurs)";}return $sql;}private function construireWhereAuteur() {$sql = '';if (isset($this->criteresRecherche->auteur)) {$auteur = $this->getBdd()->proteger($this->criteresRecherche->auteur);$sql = "AND observateur_nom_complet = $auteur";}return $sql;}private function construireWhereDate() {$sql = '';$dateDebut = isset($this->criteresRecherche->dateDebut) ? $this->criteresRecherche->dateDebut : null;$dateFin = isset($this->criteresRecherche->dateFin) ? $this->criteresRecherche->dateFin : null;if (!is_null($dateDebut) || !is_null($dateFin)) {$dateDebut = !is_null($dateDebut) ? substr($dateDebut, 0, 4) : null;$dateFin = !is_null($dateFin) ? substr($dateFin, 0, 4) : date('Y');$condition = '';if ($dateDebut == $dateFin) {$condition = "observation_date=".$dateDebut;} elseif (is_null($dateFin)) {$condition = "observation_date>=".$dateDebut;} elseif (is_null($dateDebut)) {$condition = "observation_date<=".$dateFin;} else {$condition = "observation_date BETWEEN ".$dateDebut." AND ".$dateFin;}$sql = "AND ($condition)";}return $sql;}private function construireWhereCoordonneesBbox() {$sql = '';if (isset($this->criteresRecherche->bbox)) {$bboxRecherche = $this->criteresRecherche->bbox;$conditions = array();foreach ($bboxRecherche as $bbox) {$conditions[] = "(lieu_station_longitude BETWEEN ".$bbox['ouest']." AND ".$bbox['est']." "."AND lieu_station_latitude BETWEEN ".$bbox['sud']." AND ".$bbox['nord'].")";}$sql = 'AND ('.implode(' OR ', $conditions).')';}return $sql;}private function construireWhereNomScientifique() {$sql = '';if (isset($this->criteresRecherche->filtre)) {$filtre = $this->criteresRecherche->filtre;$valeur = "'{$filtre['valeur']}".($filtre['operateur'] == 'LIKE' ? "%" : "")."'";switch ($filtre['champ']) {case "taxon" : $sql = "AND nom_scientifique_complet {$filtre['operateur']} {$valeur}"; break;}}return $sql;}private function construireWhereCoordonneesPoint() {$sql = '';$conditions = array();foreach ($this->criteresRecherche->stations as $station) {if ($station[0] == $this->nomSource) {$longitude = str_replace(",", ".", strval($station[2]));$latitude = str_replace(",", ".", strval($station[3]));$conditions[] = "(lieu_station_latitude={$longitude} AND lieu_station_longitude={$latitude})";}}if (count($conditions) > 0) {$sql = "AND (".implode(" OR ", $conditions).")";}return $sql;}final protected function obtenirNomsStationsSurPoint() {$requete = "SELECT DISTINCTROW lieu_station_nom FROM {$this->nomSource}_tapir WHERE 1 ".$this->construireWhereTaxon().' '.$this->construireWhereCoordonneesPoint();$stations = $this->getBdd()->recupererTous($requete);$nomsStations = array();foreach ($stations as $station) {$nomsStations[] = $station['lieu_station_nom'];}return implode(', ', $nomsStations);}final protected function obtenirNombreStationsDansBbox() {$bbox = $this->criteresRecherche->bbox;$zoom = $this->criteresRecherche->zoom;$requete ="SELECT zoom, Sum(nombre_sites) AS total_points FROM mailles_{$this->nomSource} "."WHERE zoom=".$zoom." ".$this->construireWhereMaillesBbox()." GROUP BY zoom";$resultat = $this->getBdd()->recuperer($requete);return $resultat['total_points'];}final protected function recupererMaillesDansBbox() {$bbox = $this->criteresRecherche->bbox;$zoom = $this->criteresRecherche->zoom;$requete ="SELECT limite_sud AS sud, limite_ouest AS ouest, limite_est AS est, limite_nord AS nord, "."nombre_sites AS stations, nombre_observations AS observations FROM mailles_{$this->nomSource} "."WHERE zoom=".$zoom." ".$this->construireWhereMaillesBbox();$mailles = $this->getBdd()->recupererTous($requete);// placer les totaux des nombres de stations dans des mailles vides$maillage = new Maillage($this->criteresRecherche->bbox, $zoom, $this->nomSource);$maillage->genererMaillesVides();$maillage->ajouterMailles($mailles);return $maillage->formaterSortie();}private function construireWhereMaillesBbox() {$bboxRecherche = $this->criteresRecherche->bbox;$conditions = array();$sql = '';foreach ($bboxRecherche as $bbox) {$conditions[] = "(limite_sud<=".$bbox['nord']." AND limite_nord>=".$bbox['sud']." "."AND limite_ouest<=". $bbox['est']." AND limite_est>=".$bbox['ouest'].")";}if (count($conditions) > 0) {$sql = 'AND ('.implode(' OR ', $conditions).')';}return $sql;}}?>