Rev 3857 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php
// declare(encoding='UTF-8');
/**
* Service vérifiant si un taxon a été signalé ou non dans une zone géographique donnée
*
* @internal Mininum PHP version : 5.2
* @category CEL
* @package Services
* @subpackage Observations
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@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>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class InventoryTaxonPresent extends Cel {
private $source = "chorologie";
/**
* Renvoie les zones où le taxon a été observé
*
* uid[0] : référentiel
* uid[1] : numéro nomenclatural
*/
public function getElement($uid) {
// Référentiel et num nom obligatoires
if(count($uid) < 2) {
return null;
}
$referentiel = $uid[0];
$num_nom = intval($uid[1]);
$this->source = !empty($_GET['source']) ? $_GET['source'] : $this->source;
if(!empty($_GET['ce_zone_geo']) || !empty($_GET['pays'])) {
$zone_geo = !empty($_GET['ce_zone_geo']) ? $_GET['ce_zone_geo'] : null;
$pays = !empty($_GET['pays']) ? $_GET['pays'] : null;
if($this->source == "chorologie") {
$res = $this->taxonEstPresentDansZoneGeoChorologie($referentiel, $num_nom, $pays, $zone_geo);
} else if($this->source == "cel") {
$res = $this->taxonEstPresentDansZoneGeoCel($referentiel, $num_nom, $pays, $zone_geo);
}
} else {
$res = $this->obtenirZonesGeoTaxonPresentCel($referentiel, $num_nom);
}
$this->envoyerJson($res);
}
private function taxonEstPresentDansZoneGeoChorologie($referentiel, $num_nom, $pays, $zone_geo) {
$res = "";
// Pour le moment on ne gère que bdtfx, il suffira d'ajouter l'appel à d'autres ws de chorologies
// dès qu'on les obtiendra (on pourrait peut être déjà le faire avec les antilles)
switch($referentiel) {
case "bdtfx":
$dpt = $this->convertirZoneGeoVersDepartement($zone_geo);
$base_url_choro = $this->config['eflore']['url_service_chorologie_presence'];
$url_choro = str_replace('{num_nom}', $num_nom, $base_url_choro).'/'.$dpt;
$res = json_decode(file_get_contents($url_choro), true);
// Renvoyer un int "stringé" est bien plus pratique pour le parsing
$res = (string)intval(!empty($res) && $res['present']);
break;
default:
$res = "";
}
return $res;
}
private function convertirZoneGeoVersDepartement($zone_geo) {
return substr(str_replace('INSEE-C:', '', $zone_geo), 0, 2);
}
private function taxonEstPresentDansZoneGeoCel($referentiel, $num_nom, $pays = null, $zone_geo = null) {
$referentiel = Cel::db()->proteger($referentiel);
$num_nom = Cel::db()->proteger($num_nom);
$requete = "SELECT COUNT(id_observation) > 1 as present FROM cel_obs ".
"WHERE nom_referentiel = ".$referentiel." AND ".
"(nom_sel_nn = ".$num_nom." OR nom_ret_nn = ".$num_nom.") ".
($zone_geo != null ? " AND ce_zone_geo LIKE ".Cel::db()->proteger($zone_geo.'%') : '').
($pays != null ? " AND pays = ".Cel::db()->proteger($pays) : '');
$res = Cel::db()->requeter($requete);
return $res[0]['present'];
}
private function obtenirZonesGeoTaxonPresentCel($referentiel, $num_nom) {
$referentiel = Cel::db()->proteger($referentiel);
$num_nom = Cel::db()->proteger($num_nom);
$requete = "SELECT DISTINCT pays, ce_zone_geo FROM cel_obs WHERE nom_referentiel = ".$referentiel." AND ".
"(nom_sel_nn = ".$num_nom." OR nom_ret_nn = ".$num_nom.")";
$res = Cel::db()->requeter($requete);
return $this->formaterResultat($res);
}
private function formaterResultat($res) {
$res_fmt = array();
foreach($res as &$r) {
$pays = !empty($r['pays']) ? $r['pays'] : 'inconnu';
if($this->doitCreerIndexPaysZoneGeo($res_fmt, $r, $pays)) {
$res_fmt[$pays] = array();
}
if($this->estUneZoneGeoBienFormee($r)) {
$res_fmt[$pays][] = $r['ce_zone_geo'];
}
}
return $res_fmt;
}
private function doitCreerIndexPaysZoneGeo($res_fmt, $r, $pays) {
return !isset($res_fmt[$pays]) && $this->estUneZoneGeoBienFormee($r);
}
private function estUneZoneGeoBienFormee($r) {
return !empty($r['ce_zone_geo']) && $r['ce_zone_geo'] != "INSEE-C:";
}
}
?>