2691 |
aurelien |
1 |
<?php
|
|
|
2 |
// declare(encoding='UTF-8');
|
|
|
3 |
/**
|
|
|
4 |
* Service vérifiant si un taxon a été signalé ou non dans une zone géographique donnée
|
|
|
5 |
*
|
|
|
6 |
* @internal Mininum PHP version : 5.2
|
|
|
7 |
* @category CEL
|
|
|
8 |
* @package Services
|
|
|
9 |
* @subpackage Observations
|
|
|
10 |
* @version 0.1
|
|
|
11 |
* @author Mathias CHOUET <mathias@tela-botanica.org>
|
|
|
12 |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
|
|
|
13 |
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
|
|
|
14 |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
|
|
|
15 |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
|
|
|
16 |
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
|
|
|
17 |
*/
|
|
|
18 |
class InventoryTaxonPresent extends Cel {
|
|
|
19 |
|
|
|
20 |
private $source = "chorologie";
|
|
|
21 |
|
|
|
22 |
/**
|
|
|
23 |
* Renvoie les zones où le taxon a été observé
|
|
|
24 |
*
|
|
|
25 |
* uid[0] : référentiel
|
|
|
26 |
* uid[1] : numéro nomenclatural
|
|
|
27 |
*/
|
|
|
28 |
public function getElement($uid) {
|
|
|
29 |
// Référentiel et num nom obligatoires
|
|
|
30 |
if(count($uid) < 2) {
|
|
|
31 |
return null;
|
|
|
32 |
}
|
|
|
33 |
|
|
|
34 |
$referentiel = $uid[0];
|
|
|
35 |
$num_nom = intval($uid[1]);
|
|
|
36 |
|
|
|
37 |
$this->source = !empty($_GET['source']) ? $_GET['source'] : $this->source;
|
|
|
38 |
|
|
|
39 |
if(!empty($_GET['ce_zone_geo']) || !empty($_GET['pays'])) {
|
|
|
40 |
|
|
|
41 |
$zone_geo = !empty($_GET['ce_zone_geo']) ? $_GET['ce_zone_geo'] : null;
|
|
|
42 |
$pays = !empty($_GET['pays']) ? $_GET['pays'] : null;
|
|
|
43 |
|
|
|
44 |
if($this->source == "chorologie") {
|
|
|
45 |
$res = $this->taxonEstPresentDansZoneGeoChorologie($referentiel, $num_nom, $pays, $zone_geo);
|
|
|
46 |
} else if($this->source == "cel") {
|
|
|
47 |
$res = $this->taxonEstPresentDansZoneGeoCel($referentiel, $num_nom, $pays, $zone_geo);
|
|
|
48 |
}
|
|
|
49 |
|
|
|
50 |
} else {
|
|
|
51 |
$res = $this->obtenirZonesGeoTaxonPresentCel($referentiel, $num_nom);
|
|
|
52 |
}
|
|
|
53 |
|
|
|
54 |
$this->envoyerJson($res);
|
|
|
55 |
}
|
|
|
56 |
|
|
|
57 |
private function taxonEstPresentDansZoneGeoChorologie($referentiel, $num_nom, $pays, $zone_geo) {
|
|
|
58 |
|
|
|
59 |
$res = "";
|
|
|
60 |
// Pour le moment on ne gère que bdtfx, il suffira d'ajouter l'appel à d'autres ws de chorologies
|
|
|
61 |
// dès qu'on les obtiendra (on pourrait peut être déjà le faire avec les antilles)
|
|
|
62 |
switch($referentiel) {
|
|
|
63 |
case "bdtfx":
|
|
|
64 |
$dpt = $this->convertirZoneGeoVersDepartement($zone_geo);
|
|
|
65 |
$base_url_choro = $this->config['eflore']['url_service_chorologie_presence'];
|
|
|
66 |
$url_choro = str_replace('{num_nom}', $num_nom, $base_url_choro).'/'.$dpt;
|
|
|
67 |
|
|
|
68 |
$res = json_decode(file_get_contents($url_choro), true);
|
|
|
69 |
|
|
|
70 |
// Renvoyer un int "stringé" est bien plus pratique pour le parsing
|
|
|
71 |
$res = (string)intval(!empty($res) && $res['present']);
|
|
|
72 |
break;
|
|
|
73 |
default:
|
|
|
74 |
$res = "";
|
|
|
75 |
}
|
|
|
76 |
|
|
|
77 |
return $res;
|
|
|
78 |
}
|
|
|
79 |
|
|
|
80 |
private function convertirZoneGeoVersDepartement($zone_geo) {
|
|
|
81 |
return substr(str_replace('INSEE-C:', '', $zone_geo), 0, 2);
|
|
|
82 |
}
|
|
|
83 |
|
|
|
84 |
private function taxonEstPresentDansZoneGeoCel($referentiel, $num_nom, $pays = null, $zone_geo = null) {
|
|
|
85 |
|
|
|
86 |
$referentiel = Cel::db()->proteger($referentiel);
|
|
|
87 |
$num_nom = Cel::db()->proteger($num_nom);
|
|
|
88 |
|
|
|
89 |
$requete = "SELECT COUNT(id_observation) > 1 as present FROM cel_obs ".
|
|
|
90 |
"WHERE nom_referentiel = ".$referentiel." AND ".
|
|
|
91 |
"(nom_sel_nn = ".$num_nom." OR nom_ret_nn = ".$num_nom.") ".
|
|
|
92 |
($zone_geo != null ? " AND ce_zone_geo LIKE ".Cel::db()->proteger($zone_geo.'%') : '').
|
|
|
93 |
($pays != null ? " AND pays = ".Cel::db()->proteger($pays) : '');
|
|
|
94 |
$res = Cel::db()->requeter($requete);
|
|
|
95 |
|
|
|
96 |
return $res[0]['present'];
|
|
|
97 |
}
|
|
|
98 |
|
|
|
99 |
private function obtenirZonesGeoTaxonPresentCel($referentiel, $num_nom) {
|
|
|
100 |
|
|
|
101 |
$referentiel = Cel::db()->proteger($referentiel);
|
|
|
102 |
$num_nom = Cel::db()->proteger($num_nom);
|
|
|
103 |
|
|
|
104 |
$requete = "SELECT DISTINCT pays, ce_zone_geo FROM cel_obs WHERE nom_referentiel = ".$referentiel." AND ".
|
|
|
105 |
"(nom_sel_nn = ".$num_nom." OR nom_ret_nn = ".$num_nom.")";
|
|
|
106 |
$res = Cel::db()->requeter($requete);
|
|
|
107 |
|
|
|
108 |
return $this->formaterResultat($res);
|
|
|
109 |
}
|
|
|
110 |
|
|
|
111 |
private function formaterResultat($res) {
|
|
|
112 |
$res_fmt = array();
|
|
|
113 |
|
|
|
114 |
foreach($res as &$r) {
|
|
|
115 |
$pays = !empty($r['pays']) ? $r['pays'] : 'inconnu';
|
|
|
116 |
if($this->doitCreerIndexPaysZoneGeo($res_fmt, $r, $pays)) {
|
|
|
117 |
$res_fmt[$pays] = array();
|
|
|
118 |
}
|
|
|
119 |
|
|
|
120 |
if($this->estUneZoneGeoBienFormee($r)) {
|
|
|
121 |
$res_fmt[$pays][] = $r['ce_zone_geo'];
|
|
|
122 |
}
|
|
|
123 |
}
|
|
|
124 |
return $res_fmt;
|
|
|
125 |
}
|
|
|
126 |
|
|
|
127 |
private function doitCreerIndexPaysZoneGeo($res_fmt, $r, $pays) {
|
|
|
128 |
return !isset($res_fmt[$pays]) && $this->estUneZoneGeoBienFormee($r);
|
|
|
129 |
}
|
|
|
130 |
|
|
|
131 |
private function estUneZoneGeoBienFormee($r) {
|
|
|
132 |
return !empty($r['ce_zone_geo']) && $r['ce_zone_geo'] != "INSEE-C:";
|
|
|
133 |
}
|
|
|
134 |
}
|
|
|
135 |
?>
|