Blame | 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 BaznatFormateur extends Formateur {protected function construireRequeteStations() {$requete ="SELECT COUNT(guid) AS observations, commune AS nom, code_insee_commune AS code_insee, "."latitude, longitude, 'STATION' AS type_site FROM baznat_tapir WHERE 1 ".$this->construireWhereDepartement().' '.$this->construireWhereAuteur().' '.$this->construireWhereDate().' '.$this->construireWhereReferentiel().' '.$this->construireWhereTaxon().' '.$this->construireWhereCoordonneesBbox().' '."GROUP BY longitude, latitude";return $requete;}protected function construireRequeteObservations() {$requete ="SELECT code_observation AS id_obs, nom_scientifique AS nomSci, date_observation AS date, "."commune AS lieu, observateur FROM baznat_tapir WHERE 1 ".$this->construireWhereAuteur().' '.$this->construireWhereReferentiel().' '.$this->construireWhereDate().' '.$this->construireWhereTaxon().' '.$this->construireWhereCoordonneesPoint().' '."ORDER BY nom_scientifique, 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 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 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 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[] = "code_insee_commune LIKE {$aProteger}";}$valeurs = implode(' OR ', $valeurs_protegees);$sql = "AND ($valeurs)";}return $sql;}protected function construireWhereAuteur() {$sql = '';if (isset($this->criteresRecherche->auteur)) {$aProteger = $this->getBdd()->proteger('%'.$this->criteresRecherche->auteur.'%');$sql = "AND observateur LIKE {$aProteger}";}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 = "date_observation=".$dateDebut;} elseif (is_null($dateFin)) {$condition = "date_observation>=".$dateDebut;} elseif (is_null($dateDebut)) {$condition = "date_observation<=".$dateFin;} else {$condition = "date_observation BETWEEN ".$dateDebut." AND ".$dateFin;}$sql = "AND ($condition)";}return $sql;}protected function construireWhereCoordonneesBbox() {$bbox = $this->criteresRecherche->bbox;$sql ="AND longitude BETWEEN ".$bbox['ouest']." AND ".$bbox['est']." "."AND latitude BETWEEN ".$bbox['sud']." AND ".$bbox['nord'];return $sql;}protected function construireWhereCoordonneesPoint() {$sql ="AND latitude=".$this->criteresRecherche->latitude." "."AND longitude=".$this->criteresRecherche->longitude;return $sql;}protected function obtenirNomsStationsSurPoint() {$requete ="SELECT DISTINCTROW commune FROM baznat_tapir WHERE 1 ".$this->construireWhereTaxon().' '.$this->construireWhereCoordonneesPoint();$stations = $this->getBdd()->recupererTous($requete);$nomsStations = array();foreach ($stations as $station) {$nomsStations[] = $station['commune'];}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_baznat "."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_baznat "."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);$maillage = new Maillage($this->criteresRecherche->bbox, $zoom, $this->nomSource);$maillage->genererMaillesVides();$maillage->ajouterMailles($mailles);return $maillage->formaterSortie();}}?>