/trunk/services/modules/0.1/Projets.php |
---|
New file |
0,0 → 1,175 |
<?php |
class Projets extends RestService { |
private $parametres = array(); |
private $ressources = array(); |
private $squeletteDossier = ''; |
private $cache; |
public function __construct() { |
$this->squeletteDossier = dirname(__FILE__).DIRECTORY_SEPARATOR; |
} |
public function consulter($ressources, $parametres) { |
$resultat = ''; |
$reponseHttp = new ReponseHttp(); |
try { |
$this->initialiserRessourcesEtParametres($ressources, $parametres); |
$resultat = $this->traiterRessources(); |
$reponseHttp->setResultatService($resultat); |
} catch (Exception $e) { |
$reponseHttp->ajouterErreur($e); |
} |
$reponseHttp->emettreLesEntetes(); |
$corps = $reponseHttp->getCorps(); |
return $corps; |
} |
private function initialiserRessourcesEtParametres($ressources, $parametres) { |
$this->ressources = $ressources; |
$this->parametres = $parametres; |
} |
private function traiterRessources() { |
$retour = ''; |
if ($this->avoirRessources()) { |
if ($this->avoirRessourceService()) { |
$retour = $this->initialiserService(); |
} |
} |
return $retour; |
} |
private function avoirRessources() { |
$presenceDeRessources = false; |
if (isset($this->ressources) && count($this->ressources) > 0) { |
$presenceDeRessources = true; |
} else { |
$message = "Accès au service refusé : aucune ressource indiquée.\n" |
. "Veuillez indiquer au moins une source de données à interroger" |
. " et le type d'informations a renvoyer."; |
$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE; |
throw new Exception($message, $code); |
} |
return $presenceDeRessources; |
} |
private function chargerConfiguration($nomParametre) { |
$tableau = array(); |
$tableauPartiel = explode(',', Config::get($nomParametre)); |
$tableauPartiel = array_map('trim', $tableauPartiel); |
foreach ($tableauPartiel as $champ) { |
if (strpos($champ, '=') === false) { |
$tableau[] = $champ; |
} else { |
list($cle, $val) = explode('=', $champ); |
$clePropre = trim($cle); |
$valeurPropre = trim($val); |
$tableau[$clePropre] = $valeurPropre; |
} |
} |
return $tableau; |
} |
public static function chargerConfigurationSource($nomSource) { |
$chemin = Config::get('chemin_configurations')."config_$nomSource.ini"; |
Config::charger($chemin); |
} |
private function chargerClasse($classe) { |
if (class_exists($classe)) { |
return null; |
} |
$cheminBiblio = Config::get('chemin_bibliotheque'); |
$chemins = array(); |
$chemins[] = $this->squeletteDossier; |
$chemins[] = $this->squeletteDossier.'commun' .DIRECTORY_SEPARATOR; |
$chemins[] = $this->squeletteDossier.'sources'.DIRECTORY_SEPARATOR; |
$chemins[] = $cheminBiblio; |
$chemins[] = $cheminBiblio.'robots'.DIRECTORY_SEPARATOR; |
foreach ($chemins as $chemin) { |
$chemin = $chemin.$classe.'.php'; |
if (file_exists($chemin)) { |
require_once $chemin; |
break; |
} |
} |
} |
private function avoirRessourceService() { |
$presenceRessourceService = false; |
$servicesDispo = $this->chargerConfiguration('services_dispo'); |
if (isset($this->ressources[0])) { |
$service = $this->ressources[0]; |
if (in_array($service, $servicesDispo)) { |
$presenceRessourceService = true; |
} else { |
$message = "La service demandé '$service' n'est pas disponible !\n" |
. "Les services disponibles sont : ".implode(', ', $servicesDispo); |
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE; |
throw new Exception($message, $code); |
} |
} else { |
$message = "Vous n'avez pas indiqué de service !\n" |
. "Les services disponibles sont : ".implode(', ', $servicesDispo); |
$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE; |
throw new Exception($message, $code); |
} |
return $presenceRessourceService; |
} |
private function initialiserService() { |
$nomService = 'commun'; |
$classe = $this->obtenirNomClasseService($nomService); |
$chemins = array(); |
$chemins[] = $this->squeletteDossier.'commun'.DIRECTORY_SEPARATOR.'Commun.php'; |
// php5.3 : Enregistrement en première position des autoload de la méthode gérant les classes des services |
if (phpversion() < 5.3) { |
spl_autoload_register(array($this, 'chargerClasse')); |
} else { |
spl_autoload_register(array($this, 'chargerClasse'), true , true); |
} |
$retour = ''; |
$service = null; |
foreach ($chemins as $chemin) { |
if (file_exists($chemin)) { |
$service = new $classe($this->getBdd()); |
$ressourcesPourService = $this->filtrerRessourcesPourService(); |
$this->cache = new CacheMoissonnage($service, $nomService, |
Config::get('cache')); |
$retour = $this->cache->consulter($ressourcesPourService, $this->parametres); |
if (get_class($retour) == 'Exception') { |
throw new Exception($retour->getMessage(), RestServeur::HTTP_CODE_MAUVAISE_REQUETE); |
} |
} |
} |
if (is_null($service)) { |
$message = "Le service demandé '{$nomService}' n'existe pas !"; |
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE; |
throw new Exception($message, $code); |
} |
return $retour; |
} |
private function obtenirNomClasseService($mot) { |
$classeNom = str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot)))); |
return $classeNom; |
} |
private function filtrerRessourcesPourService() { |
return $this->ressources; |
} |
} |
?> |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/trunk/services/modules/0.1/commun/Commun.php |
---|
New file |
0,0 → 1,92 |
<?php |
class Commun { |
private $parametres; |
private $nomSource; |
private $nomService; |
private $verificateur; |
private $parametresRecherche; |
public function consulter($ressources, $parametres) { |
$this->recupererRessourcesEtParametres($ressources, $parametres); |
$retour = null; |
try { |
if (!$this->verifierExistenceSourcesDonnees()) { |
$message = "Source de donnees indisponible"; |
throw new Exception($message, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE); |
} else { |
$this->chargerNomSource(); |
$this->verifierParametres(); |
$this->chargerNomService(); |
$objetTraitement = new $this->nomService($this->parametresRecherche); |
$methode = $this->genererNomMethodeAExecuter(); |
$retour = $objetTraitement->$methode(); |
} |
} catch (Exception $erreur) { |
$retour = $erreur; |
} |
return $retour; |
} |
private function recupererRessourcesEtParametres($ressources, $parametres) { |
$this->ressources = $ressources; |
$this->parametres = $parametres; |
} |
private function chargerNomService() { |
$this->nomService = ucfirst($this->parametres['source']) . 'Formateur'; |
Projets::chargerConfigurationSource($this->parametres['source']); |
} |
private function genererNomMethodeAExecuter() { |
return 'recuperer' . ucfirst($this->ressources[0]); |
} |
private function verifierExistenceSourcesDonnees() { |
$sourcesDisponibles = explode(',', Config::get('sources_dispo')); |
$estDisponible = false; |
if (isset($this->parametres['source'])) { |
if (in_array($this->parametres['source'], $sourcesDisponibles)) { |
$estDisponible = true; |
} |
} else { |
// choisir la source par defaut, qui est toujours disponible |
$estDisponible = true; |
} |
return $estDisponible; |
} |
private function chargerNomSource() { |
if (isset($this->parametres['source'])) { |
$this->nomSource = $this->parametres['source']; |
} else { |
$this->nomSource = Config::get('source_defaut'); |
} |
} |
private function verifierParametres() { |
$this->verificateur = new VerificateurParametres($this->parametres); |
$this->verificateur->verifierParametres(); |
if ($this->verificateur->contientErreurs()) { |
$this->verificateur->leverException(); |
} else { |
$this->recupererParametresRecherche(); |
} |
} |
private function recupererParametresRecherche() { |
$this->parametresRecherche = $this->verificateur->renvoyerResultatVerification(); |
} |
} |
?> |
/trunk/services/modules/0.1/sources/SophyFormateur.php |
---|
New file |
0,0 → 1,263 |
<?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 { |
private $criteresRecherche; |
private $bdd; |
public function __construct($criteresRecherche) { |
$this->criteresRecherche = $criteresRecherche; |
} |
public function recupererStations() { |
$stations = array(); |
$nombreStations = $this->obtenirNombreStationsDansBbox(); |
$seuilMaillage = Config::get('seuil_maillage'); |
$nombreParametresNonSpatiaux = $this->calculerNombreCriteresNonSpatiaux(); |
if ($nombreStations >= $seuilMaillage && $nombreParametresNonSpatiaux == 0) { |
// pas besoin de rechercher les stations correspondant a ces criteres |
// recuperer les mailles se trouvant dans l'espace de recherche demande |
$stations = $this->recupererMaillesDansBbox(); |
} else { |
$requeteSql = $this->construireRequeteStations(); |
$stations = $this->getBdd()->recupererTous($requeteSql); |
$zoom = $this->criteresRecherche->zoom; |
$zoomMaxMaillage = Config::get('zoom_maximal_maillage'); |
if ($zoom <= $zoomMaxMaillage && count($stations) >= $seuilMaillage) { |
// generer un maillage a partir des stations recuperees dans la base de donnees |
$maillage = new Maillage($this->criteresRecherche->bbox, $zoom, 'sophy'); |
$maillage->genererMaillesVides(); |
$maillage->ajouterPoints($stations); |
$stations = $maillage->formaterSortie(); |
} |
} |
// mettre en forme les informations au format JSON |
$formateurJSON = new FormateurJson('sophy'); |
$donneesFormatees = $formateurJSON->formaterStations($stations); |
return $donneesFormatees; |
} |
public function recupererObservations() { |
$requeteSql = $this->construireRequeteObservations(); |
$observations = $this->getBdd()->recupererTous($requeteSql); |
$this->recupererNumeroNomenclaturauxTaxons($observations); |
$nomStation = $this->obtenirNomsStationsSurPoint(); |
$formateurJSON = new FormateurJson('sophy'); |
$donneesFormatees = $formateurJSON->formaterObservations($observations, $nomStation); |
return $donneesFormatees; |
} |
private function calculerNombreCriteresNonSpatiaux() { |
$nombreParametresNonSpatiaux = 0; |
$criteresSpatiaux = array('zoom', 'bbox', 'longitude', 'latitude'); |
foreach ($this->criteresRecherche as $nomCritere => $valeur) { |
if (!in_array($nomCritere, $criteresSpatiaux)) { |
$nombreParametresNonSpatiaux ++; |
} |
} |
return $nombreParametresNonSpatiaux; |
} |
// ------------------------------------------------------------------------ // |
// Fonctions de construction des criteres de recherches pour la requete SQL // |
// ------------------------------------------------------------------------ // |
private function getBdd() { |
if (!isset($this->bdd)) { |
$this->bdd = new Bdd(); |
} |
$this->bdd->requeter("USE ".Config::get('bdd_nom')); |
return $this->bdd; |
} |
private function construireRequeteStations() { |
$requete = |
"SELECT DISTINCT lieu_station_nom AS nom, lieu_station_latitude AS latitude, ". |
"lieu_station_longitude AS longitude, 'STATION' AS type_site ". |
"FROM sophy_tapir WHERE 1 ". |
$this->construireWhereDepartement().' '. |
$this->construireWhereAuteur().' '. |
$this->construireWhereReferentiel().' '. |
$this->construireWhereTaxon().' '. |
$this->construireWhereCoordonneesBbox().' '. |
"GROUP BY lieu_station_latitude, lieu_station_longitude"; |
return $requete; |
} |
private 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->construireWhereTaxon().' '. |
$this->construireWhereCoordonneesPoint().' '. |
"ORDER BY nom_scientifique_complet, date, observateur"; |
return $requete; |
} |
private function construireWhereTaxon() { |
$sql = ''; |
if (isset($this->criteresRecherche->taxon)) { |
$taxon = $this->criteresRecherche->taxon; |
$criteres = "nom_scientifique_complet LIKE ".$this->getBdd()->proteger($taxon['nom']."%"); |
$referentiel = new Referentiel($this->criteresRecherche->referentiel, $this->criteresRecherche->taxon); |
$sousTaxons = $referentiel->recupererSousTaxons(); |
foreach ($sousTaxons as $sousTaxon) { |
$criteres .= " OR nom_scientifique_complet LIKE ".$this->getBdd()->proteger($taxon['nom']."%"); |
} |
$sql = "AND ($criteres)"; |
} |
return $sql; |
} |
// TODO : completer le corps des methodes construire where pour referentiel et departement |
private function construireWhereReferentiel() { |
$sql = ''; |
return $sql; |
} |
private function construireWhereDepartement() { |
$sql = ''; |
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 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; |
} |
private function construireWhereCoordonneesPoint() { |
$sql = "AND lieu_station_latitude=".$this->criteresRecherche->latitude." ". |
"AND lieu_station_longitude=".$this->criteresRecherche->longitude; |
return $sql; |
} |
private 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); |
} |
private 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']; |
} |
private function recupererMaillesDansBbox() { |
$bbox = $this->criteresRecherche->bbox; |
$zoom = $this->criteresRecherche->zoom; |
$requete = |
"SELECT zoom, position_latitude, position_longitude, limite_sud AS sud, limite_ouest AS ouest, ". |
"limite_nord AS nord, limite_est AS est, nombre_sites AS points, 'MAILLE' AS type_site ". |
"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']; |
return $this->getBdd()->recupererTous($requete); |
} |
private function recupererNumeroNomenclaturauxTaxons(& $observations) { |
for ($index = 0; $index < count($observations); $index ++) { |
$taxon = isset($this->criteresRecherche->taxon) ? $this->criteresRecherche->taxon : null; |
if (is_null($taxon) && strlen(trim($observations[$index]['nomSci'])) > 0) { |
if (isset($this->criteresRecherche->taxon)) { |
$taxon = $this->rechercherTaxonDansReferentiel($observations[$index]['nomSci'], |
$this->criteresRecherche->referentiel); |
} else { |
$taxon = $this->obtenirNumeroTaxon($observations[$index]['nomSci']); |
} |
} |
if (!is_null($taxon)) { |
$observations[$index]['nn'] = $taxon['nn']; |
$observations[$index]['num_referentiel'] = $taxon['referentiel']; |
} else { |
$observations[$index]['nn'] = ''; |
} |
} |
} |
private function rechercherTaxonDansReferentiel($nomScientifique, $nomReferentiel) { |
$referentiel = new Referentiel($nomReferentiel); |
$taxon = $referentiel->obtenirNumeroNomenclatural($nomScientifique); |
return $taxon; |
} |
private function obtenirNumeroTaxon($nomScientifique) { |
$taxonTrouve = null; |
$listeReferentiels = Referentiel::recupererListeReferentielsDisponibles(); |
foreach ($listeReferentiels as $nomReferentiel) { |
$taxon = $this->rechercherTaxonDansReferentiel($nomScientifique, $nomReferentiel); |
if (!is_null($taxon)) { |
$taxonTrouve = $taxon; |
break; |
} |
} |
return $taxonTrouve; |
} |
} |
?> |
/trunk/services/modules/0.1/sources/FloradataFormateur.php |
---|
New file |
0,0 → 1,233 |
<?php |
/** |
* |
* Classe en charge de recuperer les donnees d'observation ou liees a leur localisation |
* Le jeu de donnees a interroger est celui utilise par l'application Carnet En Ligne |
* (http://www.tela-botanica.org/page:cel) |
* |
* 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 FloradataFormateur { |
private $criteresRecherche; |
private $bdd; |
public function __construct($criteresRecherche) { |
$this->criteresRecherche = $criteresRecherche; |
} |
public function recupererStations() { |
// recuperer les informations au niveau de la base de donnees |
$requeteSql = $this->construireRequeteStations(); |
$stations = $this->getBdd()->recupererTous($requeteSql); |
$zoomMaxMaillage = Config::get('zoom_maximal_maillage'); |
$seuilMaillage = Config::get('seuil_maillage'); |
$zoom = $this->criteresRecherche->zoom; |
$bbox = $this->criteresRecherche->bbox; |
// TODO: gérer une notion d'échelle plutot que de zoom (pour les clients SIG) |
if (count($stations) > $seuilMaillage && intval($zoom)<= $zoomMaxMaillage) { |
// partitionnement des donnees en mailles |
$maillage = new Maillage($bbox, $zoom); |
$maillage->genererMaillesVides(); |
$maillage->ajouterPoints($stations); |
$stations = $maillage->formaterSortie(); |
} |
// mettre en forme les informations au format JSON |
$formateurJSON = new FormateurJson('floradata'); |
$donneesFormatees = $formateurJSON->formaterStations($stations); |
return $donneesFormatees; |
} |
public function recupererObservations() { |
// recuperer les informations sur les stations repondant a ces parametres |
$requeteSql = $this->construireRequeteObservations(); |
$observations = $this->getBdd()->recupererTous($requeteSql); |
$nomSite = $this->obtenirNomStation(); |
// mettre en forme les informations au format JSON |
$formateurJSON = new FormateurJson('floradata'); |
$donneesFormatees = $formateurJSON->formaterObservations($observations, $nomSite); |
return $donneesFormatees; |
} |
// ------------------------------------------------------------------------ // |
// Fonctions de construction des criteres de recherches pour la requete SQL // |
// ------------------------------------------------------------------------ // |
private function getBdd() { |
if (!isset($this->bdd)) { |
$this->bdd = new Bdd(); |
} |
$this->bdd->requeter("USE ".Config::get('bdd_nom')); |
return $this->bdd; |
} |
private function construireRequeteStations() { |
$selectTypeSite = |
"IF(". |
"(longitude IS NULL OR latitude IS NULL) ". |
"OR (longitude=0 AND latitude=0) ". |
"OR (longitude=999.99999 AND latitude=999.99999)". |
", 'COMMUNE', 'STATION'". |
")"; |
$requete = |
'SELECT ce_zone_geo, zone_geo, station, longitude, latitude, nom AS "nom_commune",'. |
'wgs84_longitude AS "lng_commune", wgs84_latitude AS "lat_commune", '. |
$selectTypeSite.' AS "type_site" '. |
'FROM cel_obs LEFT JOIN cel_zones_geo cz ON ce_zone_geo=id_zone_geo '. |
'WHERE transmission=1 '. |
$this->construireWhereDepartement().' '. |
$this->construireWhereAuteur().' '. |
$this->construireWhereReferentiel().' '. |
$this->construireWhereTaxon().' '. |
$this->construireWhereCoordonneesBbox().' '. |
"GROUP BY longitude, latitude, wgs84_longitude, wgs84_latitude"; |
return $requete; |
} |
private function construireRequeteObservations() { |
$requete = |
"SELECT id_observation AS id_obs, nom_ret_nn AS nn, nom_ret AS nomSci, ". |
"Date(date_transmission) AS date, milieu AS lieu, nom_referentiel, ". |
"Concat(prenom_utilisateur, ' ', nom_utilisateur) AS observateur, ce_utilisateur AS observateurId ". |
"FROM cel_obs WHERE transmission=1 ". |
$this->construireWhereAuteur().' '. |
$this->construireWhereReferentiel().' '. |
$this->construireWhereTaxon().' '. |
$this->construireWhereCoordonneesPoint().' '. |
"ORDER BY nom_ret, date, observateur"; |
return $requete; |
} |
private function construireWhereTaxon() { |
$sql = ''; |
if (isset($this->criteresRecherche->taxon)) { |
$taxon = $this->criteresRecherche->taxon; |
$criteres = "nom_ret LIKE ".$this->getBdd()->proteger($taxon['nom']."%"); |
$referentiel = new Referentiel($this->criteresRecherche->referentiel, $this->criteresRecherche->taxon); |
$sousTaxons = $referentiel->recupererSousTaxons(); |
foreach ($sousTaxons as $sousTaxon) { |
$criteres .= " OR nom_ret LIKE ".$this->getBdd()->proteger($taxon['nom']."%"); |
} |
$sql = "AND ($criteres)"; |
} |
return $sql; |
} |
private function construireWhereReferentiel() { |
$sql = ''; |
if (isset($this->criteresRecherche->referentiel) && !isset($this->criteresRecherche->taxon)) { |
$referentiel = current(explode('_', $this->criteresRecherche->referentiel)); |
$sql = "AND nom_referentiel LIKE ".$this->getBdd()->proteger($referentiel."%"); |
} |
return $sql; |
} |
private function construireWhereDepartement() { |
$sql = ''; |
if (isset($this->criteresRecherche->departement)) { |
$valeurs_a_proteger = $this->criteresRecherche->departement; |
foreach ($valeurs_a_proteger as $valeur) { |
$valeurs_protegees[] = "ce_zone_geo LIKE " . $this->getBdd()->proteger('INSEE-C:' . $valeur . '%'); |
} |
$valeurs = implode(' OR ', $valeurs_protegees); |
$sql = "AND ($valeurs)"; |
} |
return $sql; |
} |
private function construireWhereAuteur() { |
$sql = ''; |
if (isset($this->criteresRecherche->auteur)) { |
$utilisateur = $this->getBdd()->proteger($this->criteresRecherche->auteur); |
$sql = "AND courriel_utilisateur = $utilisateur"; |
} |
return $sql; |
} |
private function construireWhereCoordonneesBbox() { |
$bbox = $this->criteresRecherche->bbox; |
$sql = |
"AND (". |
"(". |
"longitude BETWEEN ".$bbox['ouest']." AND ".$bbox['est']." ". |
"AND latitude BETWEEN ".$bbox['sud']." AND ".$bbox['nord']." ". |
"AND (wgs84_longitude IS NULL OR wgs84_latitude IS NULL)". |
") OR (". |
"wgs84_longitude BETWEEN ".$bbox['ouest']." AND ". $bbox['est']." ". |
"AND wgs84_latitude BETWEEN ".$bbox['sud']." AND ".$bbox['nord']. |
")". |
")"; |
return $sql; |
} |
private function construireWhereCoordonneesPoint() { |
$commune = $this->obtenirCoordonneesCommune(); |
$condition = "(longitude=".$this->criteresRecherche->longitude." ". |
"AND latitude=".$this->criteresRecherche->latitude.")"; |
if (!is_null($commune)) { |
$condition .= " OR (longitude IS NULL AND latitude IS NULL AND ce_zone_geo=". |
$this->getBdd()->proteger($commune['id_zone_geo']).")"; |
} |
return "AND ($condition)"; |
} |
private function obtenirCoordonneesCommune() { |
$requete = "SELECT id_zone_geo, nom FROM cel_zones_geo WHERE wgs84_longitude=". |
$this->criteresRecherche->longitude." AND wgs84_latitude=".$this->criteresRecherche->latitude; |
$commune = $this->getBdd()->recuperer($requete); |
if ($commune === false) { |
$commune = null; |
} |
return $commune; |
} |
private function obtenirNomStation() { |
// verifier si les coordonnees du point de requetage correspondent a une commune |
$station = $this->obtenirCoordonneesCommune(); |
if (is_null($station)) { |
$requete = 'SELECT DISTINCT lieudit AS nom FROM cel_obs WHERE longitude='. |
$this->criteresRecherche->longitude.' AND latitude='.$this->criteresRecherche->latitude; |
$station = $this->getBdd()->recuperer($requete); |
} |
$nomStation = ''; |
if ($station !== false) { |
$nomStation = trim($station['nom']); |
} |
return $nomStation; |
} |
} |
?> |