* @license GPL v3 * @license CECILL v2 * @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, observateur_nom_complet AS auteur ". "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; } } ?>