New file |
0,0 → 1,290 |
<?php |
|
/** |
* Recuperer les stations ou se sont realisees des observations effectuees |
* par les utilisateurs du Carnet En Ligne (http://tela-botanica.org/page:cel |
* |
* @author Alexandre GALIBERT |
* @copyright 2013 Tela Botanica (accueil@tela-botanica.org) |
* |
*/ |
|
|
|
class Stations { |
|
private $zoom = null; |
private $bbox = null; |
|
private $utilisateur = ''; |
private $departement = ''; |
private $taxon = null; |
private $referentiel = ''; |
private $sousTaxons = array(); |
|
private $bdd; |
|
|
public function __construct() {} |
|
public function consulter($ressources, $parametres) { |
extract($parametres); |
$zoomMaxMaillage = Config::get('zoom_maximal_maillage'); |
$seuilMaillage = Config::get('seuil_maillage'); |
$this->utilisateur = $utilisateur != '*' ? $utilisateur : ''; |
$this->departement = $dept != '*' ? $dept : ''; |
|
// recuperation, traitement de tous les parametres et vertification du zoom |
// et des coordonnees des limites de l'espace de recherche (parametre bbox) |
$statutParametresEspace = $this->traiterParametresEspace($parametres); |
if ($statutParametresEspace == false) { |
$message = "Recherche des stations impossible : parametres de l'espace de recherche incorrects"; |
return new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); |
} |
|
// recherche du taxon dans les referentiels bdtfx et bdtxa et verification de sa validite |
if ($referentiel != '*') { |
$this->referentiel = $this->verifierExistenceReferentiel($referentiel); |
if (is_null($this->referentiel)) { |
$message = "Recherche des stations impossible : referentiel inconnu\n" |
+ "Voici les referentiels disponibles : " |
+ implode(', ', Referentiel::listeReferentielsDisponibles()); |
return new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); |
} |
} |
|
if ($num_taxon != '*') { |
$this->traiterParametresTaxon($num_taxon); |
if (is_null($this->taxon)) { |
$message = "Recherche des stations impossible : taxon non trouve dans les referentiels"; |
return new Exception($message, RestServeur::HTTP_CODE_MAUVAISE_REQUETE); |
} |
// recuperer les sous-taxons |
$referentiel = new Referentiel($this->referentiel); |
$this->sousTaxons = $referentiel->recupererSousTaxons(); |
} |
|
$stations = array(); |
if ($this->zoom <= $zoomMaxMaillage && is_null($this->taxon) && $this->departement != '*' |
&& $this->utilisateur != '*' && $this->nombreStations() >= $seuilMaillage) { |
// recuperer les mailles se trouvant dans l'espace de recherche demande |
$stations = $this->getMailles(); |
} else { |
// recuperer les informations sur les stations repondant a ces parametres |
$stations = $this->recupererStations(); |
if ($this->zoom <= $zoomMaxMaillage && count($stations) >= $seuilMaillage) { |
// generer un maillage a partir des stations recuperees dans la base de donnees |
$maillage = new Maillage($this->bbox, $this->zoom, 'sophy'); |
$maillage->genererMaillesVides(); |
$maillage->ajouterPoints($stations); |
$stations = $maillage->resumePourReponseAJAX(); |
} |
} |
|
// mettre en forme les informations au format JSON |
$formateurJSON = new FormateurJson(); |
$donneesFormatees = $formateurJSON->formaterStations($stations); |
return $donneesFormatees; |
} |
|
|
|
//------------------------------------------------------------------------------- |
// Recuperation et verification des parametres |
//------------------------------------------------------------------------------- |
|
private function traiterParametresEspace($parametres) { |
$this->zoom = $this->verifierZoom($parametres['zoom']); |
$this->bbox = $this->verifierCoordonneesBbox($parametres['bbox']); |
return (!is_null($this->zoom) && !is_null($this->bbox)); |
} |
|
private function traiterParametresTaxon($numeroTaxon) { |
if ($numeroTaxon != '*') { |
if ($this->referentiel != '') { |
$referentiel = new Referentiel($this->referentiel); |
$this->taxon = $referentiel->recupererTaxon($numeroTaxon); |
} else { |
$this->taxon = $this->verifierExistenceTaxon($numeroTaxon); |
} |
} |
} |
|
private function verifierZoom($niveauZoom) { |
$zoom = intval($niveauZoom); |
$limitesZoom = array( |
'min' => intval(Config::get('carte.zoom_minimal')), |
'max' => intval(Config::get('carte.zoom_maximal')) |
); |
if ($zoom < $limitesZoom['min'] || $zoom > $limitesZoom['max']) { |
return null; |
} |
return $zoom; |
} |
|
private function verifierCoordonneesBbox($limitesBbox) { |
$coordonnees = explode(',', $limitesBbox); |
if (count($coordonnees) != 4) { |
return null; |
} |
|
// index du tableau des coordonnees : ouest/sud/est/nord |
$nomsIndexBbox = array("ouest", "sud", "est", "nord"); |
$bbox = array(); |
for ($i = 0; $i < count($coordonnees); $i ++) { |
$bbox[$nomsIndexBbox[$i]] = $coordonnees[$i]; |
} |
|
// verifier que les coordonnees de chaque bord de la bbox sont valides |
$limites = array( |
'ouest' => floatval(Config::get('carte.limite_ouest')), |
'est' => floatval(Config::get('carte.limite_est')), |
'sud' => floatval(Config::get('carte.limite_sud')), |
'nord' => floatval(Config::get('carte.limite_nord')) |
); |
|
if (floatval($bbox['ouest']) >= $limites['ouest'] && floatval($bbox['ouest']) <= $limites['est'] |
&& floatval($bbox['est']) >= $limites['ouest'] && floatval($bbox['est']) <= $limites['est'] |
&& floatval($bbox['nord']) >= $limites['sud'] && floatval($bbox['nord']) <= $limites['nord'] |
&& floatval($bbox['sud']) >= $limites['sud'] && floatval($bbox['sud']) <= $limites['nord']) { |
return $bbox; |
} |
return null; |
} |
|
private function verifierExistenceReferentiel($referentiel) { |
if ($referentiel == '*') { |
return ''; |
} |
$listeReferentiels = Referentiel::listeReferentielsDisponibles(); |
foreach ($listeReferentiels as $nomReferentiel) { |
if (strstr($nomReferentiel, $referentiel) !== false) { |
$this->referentiel = $nomReferentiel; |
break; |
} |
} |
return null; |
} |
|
private function verifierExistenceTaxon($numTaxon) { |
$listeReferentiels = Referentiel::listeReferentielsDisponibles(); |
// tester chaque referentiel jusqu'a trouver un taxon correspondant |
// a tous les criteres demandes dans les masques |
foreach ($listeReferentiels as $nomReferentiel) { |
$referentiel = new Referentiel($nomReferentiel); |
$taxon = $referentiel->recupererTaxon($numTaxon); |
if (!is_null($taxon)) { |
$this->referentiel = $nomReferentiel; |
return $taxon; |
} |
} |
return null; |
} |
|
|
|
//------------------------------------------------------------------------------- |
// Recuperation des donnees dans la base de donnees |
// et mise sous forme d'objet geographique en fonction du niveau de zoom |
//------------------------------------------------------------------------------- |
|
private function getBdd() { |
if (!isset($this->bdd)) { |
$this->bdd = new Bdd(); |
} |
$this->bdd->requeter("USE tb_eflore"); |
return $this->bdd; |
} |
|
|
/** |
* Recuperer les points localisant les stations d'observation |
*/ |
private function recupererStations() { |
$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 ' |
. $this->construireWhereDepartement() . $this->construireWhereUtilisateur() |
. $this->construireWhereTaxon() . $this->construireWhereCoordonnees() |
. ' GROUP BY lieu_station_latitude, lieu_station_longitude'; |
return $this->getBdd()->recupererTous($requete); |
} |
|
private function construireWhereTaxon() { |
if (is_null($this->taxon)) { |
return ''; |
} |
$criteres = '(nom_scientifique_complet LIKE \'' . addslashes($this->taxon['nom']) . '%\''; |
foreach ($this->sousTaxons as $sousTaxon) { |
$criteres .= ' OR nom_scientifique_complet LIKE \'' . addslashes($sousTaxon['nom']) . '%\''; |
} |
$criteres .= ') AND '; |
return $criteres; |
} |
|
private function construireWhereDepartement() { |
$sql = ''; |
return $sql; |
} |
|
private function construireWhereUtilisateur() { |
$sql = ''; |
if ($this->utilisateur != '') { |
$utilisateur = $this->getBdd()->proteger($this->utilisateur); |
$sql = " AND observateur_nom_complet = $utilisateur "; |
} |
return $sql; |
} |
|
private function construireWhereCoordonnees() { |
$criteres = ' AND lieu_station_latitude BETWEEN ' . $this->bbox['sud'] . ' AND ' |
. $this->bbox['nord'] . ' AND '; |
if ($this->bbox['ouest'] > $this->bbox['est']) { |
$criteres .= '(lieu_station_longitude >= ' . $this->bbox['ouest'] |
. ' OR lieu_station_latitude <= ' . $this->bbox['est'] . ')'; |
} else { |
$criteres .= 'lieu_station_longitude BETWEEN ' . $this->bbox['ouest'] . ' AND ' |
. $this->bbox['est']; |
} |
return $criteres; |
} |
|
|
|
|
private function nombreStations() { |
$requete = 'SELECT zoom, Sum(nombre_sites) AS "total_points" FROM mailles_sophy' |
. ' WHERE zoom=' . $this->zoom . ' AND limite_sud <= ' . $this->bbox['nord'] |
. ' AND limite_nord >= ' . $this->bbox['sud']; |
if ($this->bbox['ouest'] > $this->bbox['est']) { |
$requete .= ' AND NOT (limite_ouest >= ' . $this->bbox['ouest'] |
. ' AND limite_est <= ' . $this->bbox['est'] . ')'; |
} else { |
$requete .= ' AND limite_ouest <= ' . $this->bbox['est'] |
. ' AND limite_est >= ' . $this->bbox['ouest']; |
} |
$requete .= ' GROUP BY zoom'; |
$resultat = $this->getBdd()->recuperer($requete); |
return $resultat['total_points']; |
} |
|
/** |
* Recuperer les mailles contenant des points dans l'espace de recherche de la bbox |
*/ |
private function getMailles() { |
$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=' . $this->zoom |
. ' AND limite_sud <= ' . $this->bbox['nord'] . ' AND limite_nord >= ' . $this->bbox['sud']; |
if ($this->bbox['ouest'] > $this->bbox['est']) { |
$requete .= ' AND NOT (limite_ouest >= ' . $this->bbox['ouest'] . ' AND limite_est <= ' |
. $this->bbox['est'] . ')'; |
} else { |
$requete .= ' AND limite_ouest <= ' . $this->bbox['est'] . ' AND limite_est >= ' |
. $this->bbox['ouest']; |
} |
return $this->getBdd()->recupererTous($requete); |
} |
|
} |
|
?> |