New file |
0,0 → 1,135 |
<?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:"; |
} |
} |
?> |