Rev 26 | Rev 34 | 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.3* @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 SophyFormateur extends Formateur {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 "."FROM sophy_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;}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 "."FROM sophy_tapir WHERE 1 ".$this->construireWhereAuteur().' '.$this->construireWhereReferentiel().' '.$this->construireWhereDate().' '.$this->construireWhereTaxon().' '.$this->construireWhereCoordonneesPoint().' '."ORDER BY nom_scientifique_complet, date, observateur";return $requete;}protected function construireWhereTaxon() {$sql = '';if (isset($this->criteresRecherche->taxon)) {$taxons = $this->criteresRecherche->taxon;$criteres = array();foreach ($taxons as $taxon) {$nomRang = $this->getNomRang($taxon);$criteres[] = "nom_scientifique_complet LIKE ".$this->getBdd()->proteger($taxon['nom']."%");if ($nomRang == 'espece') {$criteres = array_merge($criteres, $this->concatenerTaxonsSousEspeces($taxon));} elseif ($nomRang == 'genre') {$criteres = array_merge($criteres, $this->concatenerTaxonsFamilles($taxon));}}$sql = "AND (".implode(' OR ',array_unique($criteres)).")";}return $sql;}protected function concatenerTaxonsSousEspeces($taxon) {$referentiel = new Referentiel($this->criteresRecherche->referentiel, $taxon);$sousTaxons = $referentiel->recupererTaxonsSousEspeces();$criteres = array();foreach ($sousTaxons as $sousTaxon) {$criteres[] = "nom_scientifique_complet LIKE ".$this->getBdd()->proteger($sousTaxon['nom']."%");}return $criteres;}protected function concatenerTaxonsFamilles($taxon) {$referentiel = new Referentiel($this->criteresRecherche->referentiel, $taxon);$sousTaxons = $referentiel->recupererTaxonsFamilles();$criteres = array();foreach ($sousTaxons as $sousTaxon) {$criteres[] = "nom_scientifique_complet LIKE ".$this->getBdd()->proteger($sousTaxon['nom']."%");}return $criteres;}// TODO : completer le corps des methodes construire where pour referentiel et departementprotected function construireWhereReferentiel() {$sql = '';return $sql;}protected 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;}protected function construireWhereAuteur() {$sql = '';if (isset($this->criteresRecherche->auteur)) {$auteur = $this->getBdd()->proteger($this->criteresRecherche->auteur);$sql = "AND observateur_nom_complet = $auteur";}return $sql;}protected 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;}protected function construireWhereCoordonneesBbox() {$bbox = $this->criteresRecherche->bbox;$sql = "AND lieu_station_longitude BETWEEN ".$bbox['ouest']." AND ".$bbox['est']." "."AND lieu_station_latitude BETWEEN ".$bbox['sud']." AND ".$bbox['nord'];return $sql;}protected function construireWhereCoordonneesPoint() {$sql = "AND lieu_station_latitude=".$this->criteresRecherche->latitude." "."AND lieu_station_longitude=".$this->criteresRecherche->longitude;return $sql;}protected function obtenirNomsStationsSurPoint() {$requete = "SELECT DISTINCTROW lieu_station_nom FROM sophy_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);}protected function obtenirNombreStationsDansBbox() {$bbox = $this->criteresRecherche->bbox;$zoom = $this->criteresRecherche->zoom;$requete ="SELECT zoom, Sum(nombre_sites) AS total_points FROM mailles_sophy "."WHERE zoom=".$zoom." AND limite_sud<=".$bbox['nord']." AND limite_nord>=".$bbox['sud']." "."AND limite_ouest<=".$bbox['est']." AND limite_est>=".$bbox['ouest']." GROUP BY zoom";$resultat = $this->getBdd()->recuperer($requete);return $resultat['total_points'];}protected function recupererMaillesDansBbox() {$bbox = $this->criteresRecherche->bbox;$zoom = $this->criteresRecherche->zoom;$requete ="SELECT limite_sud AS latitudeSud, limite_ouest AS longitudeOuest, limite_est AS longitudeEst, "."limite_nord AS latitudeNord, nombre_sites, nombre_observations FROM mailles_sophy "."WHERE zoom=".$zoom." AND limite_sud<=".$bbox['nord']." "."AND limite_nord>=".$bbox['sud']." AND limite_ouest<=". $bbox['est']." "."AND limite_est>=".$bbox['ouest'];$mailles = $this->getBdd()->recupererTous($requete, Bdd::MODE_OBJET);// 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();}}?>