Subversion Repositories eFlore/Projets.eflore-projets

Compare Revisions

Ignore whitespace Rev 1123 → Rev 1124

/trunk/services/modules/0.1/chorodep/Noms.php
101,13 → 101,13
$donnees['entete']['href.precedent'] = $url_base . '/' . $this->serviceNom . '?'
. 'navigation.depart=' . max(0, ($this->depart - $this->limite)) . '&navigation.limite=' . $this->limite
. '&retour.tri=' . $this->tri . '&retour.ordre=' . $this->tri_dir
. '&' . $masqueEnParams;
. ($masqueEnParams ? '&' . $masqueEnParams : '');
}
if (($this->depart + $this->limite) < $total ) {
$donnees['entete']['href.suivant'] = $url_base . '/' . $this->serviceNom . '?'
. 'navigation.depart=' . ($this->depart + $this->limite) . '&navigation.limite=' . $this->limite
. '&retour.tri=' . $this->tri . '&retour.ordre=' . $this->tri_dir
. '&' . $masqueEnParams;
. ($masqueEnParams ? '&' . $masqueEnParams : '');
}
$donnees['resultat'] = $noms;
 
/trunk/services/modules/0.1/chorodep/Observations.php
215,15 → 215,6
if ($nom_champ == 'station') {
if (!preg_match('/^\s*([0-9]{2})\s*$/', $valeur, $colonne)) { // si le nom est passé
$this->requete_condition[] = '1';
/* $url = $this->ajouterHrefAutreProjet('zone-geo',$key,'INSEE-D');// d'apres nom
$dept = $this->rest_client->consulter($url);
$entete = $this->rest_client->getReponseEntetes();
if (isset($entete['wrapper_data'])) {
$colonne = json_decode($relation);
} else {
$this->renvoyerErreur(RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE,
'Le service '.$this->service.' de ce projet comporte des erreurs. url lancée : '.$url);
}*/
} else {
$this->requete_condition[] = '`'.$valeur."` != '' ";
$this->requete_champ .= ', `'.$valeur.'` ';
/trunk/services/modules/0.1/chorodep/NomsPlus.php
New file
0,0 → 1,154
<?php
/**
* Retourne la liste des noms de répertoriés par le projet chorodep, associés à la liste de
* leurs statuts de protection, la liste de leurs noms vernaculaires, et leur présence, utile
* surtout dans le cas où on filtre par zone géo.
* Merci Monsieur Plus !
* Paramètres :
* - masque.nom : un LIKE sera effectué sur le nom
* - masque.zone-geo : limite les résultats aux noms des espèces présentes dans le département (nombre à 2 chiffres) spécifié
* - masque.proteges : si '0' retourne les protections NULL, si '1' les NOT NULL
*
* @package chorodep
* @author Mathias Chouet <mathias@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 1.0
* @copyright 1999-2014 Tela Botanica (accueil@tela-botanica.org)
*/
 
class NomsPlus extends Noms {
 
protected $tableNomsVernaculaires;
protected $tableStatutsProtection;
 
protected function init() {
parent::init();
$this->tableNomsVernaculaires = Config::get('table_chorologie_nv');
$this->tableStatutsProtection = Config::get('table_chorologie_sp');
$this->serviceNom = 'noms-plus';
}
 
protected function setMasque($parametres) {
parent::setMasque($parametres);
// masque sur protection
if(isset($parametres['masque.proteges']) && $parametres['masque.proteges'] != '') {
$this->masque['proteges'] = $parametres['masque.proteges'];
}
}
 
/**
* Renvoie la liste des taxons, les noms vernaculaires et statuts de protacion associés; si
* un masque a été défini sur une zone géographique, retourne aussi la présence sur cette zone
*/
protected function listeNoms() {
$req = "SELECT DISTINCT c.num_nom, c.nom_sci, group_concat(DISTINCT nv.nom_vernaculaire) as noms_vernaculaires";
if (isset($this->masque['zone-geo']) && $this->masque['zone-geo'] != null) {
$req .= ", max(`" . $this->masque['zone-geo'] . "`) as presence";
}
$req .= ", sp.protection";
$req .= " FROM " . $this->table . " c";
$req .= " LEFT JOIN " . $this->tableNomsVernaculaires . " nv";
$req .= " ON c.num_tax = nv.num_tax";
$req .= " LEFT JOIN " . $this->tableStatutsProtection . " sp";
$req .= " ON c.num_nom = sp.num_nom";
$req .= $this->construireWhere();
$req .= " GROUP BY c.num_nom";
$req .= " ORDER BY " . $this->tri . " " . $this->tri_dir . " ";
$req .= " LIMIT " . $this->depart. ", " . $this->limite;
 
//echo "REQUETE: $req"; exit;
$resultat = $this->getBdd()->recupererTous($req);
// décodage des statuts de protection
foreach ($resultat as $k => $r) {
$resultat[$k]['statuts_protection'] = json_decode($r['protection']);
unset($resultat[$k]['protection']);
}
 
return $resultat;
}
 
protected function compterNoms() {
$req = "SELECT count(DISTINCT c.num_nom, c.nom_sci) AS compte"
. " FROM " . $this->table . " c" // alias pour compatibilité avec le where
. " LEFT JOIN " . $this->tableStatutsProtection . " sp" // jointure pour compatibilité avec le where
. " ON c.num_nom = sp.num_nom";
$req .= $this->construireWhere();
$resultat = $this->getBdd()->recuperer($req);
 
return $resultat['compte'];
}
 
protected function construireWhere() {
$where = "";
$conditions = array();
// élimination des entrées sans nn valide
$conditions[] = "CAST(c.num_nom AS decimal) != 0";
// masque
if(!empty($this->masque)) {
$masqueZg = null;
if(isset($this->masque['nom'])) {
$masqueNom = $this->getBdd()->proteger($this->masque['nom']);
$conditions[] = "c.nom_sci LIKE $masqueNom";
}
if(isset($this->masque['zone-geo'])) {
$masqueZg = $this->masque['zone-geo'];
$conditions[] = "`$masqueZg` in ('1', '1?')";
}
if(isset($this->masque['proteges'])) {
$masqueProteges = ($this->masque['proteges'] === '1');
if ($masqueZg) { // protection sur les zones concernées seulement
$sousConditions = array();
$zonesProtegees = $this->zonesProtegeesParDepartement($masqueZg);
foreach ($zonesProtegees as $zp) {
// @ACHTUNG pas de $this->getBdd()->proteger() sinon ça foire les doubles quotes - danger !
$zpP = "'%" . 'zone":"' . $zp . "%'"; // fouille dans le JSON à l'arrache
$sousConditions[] = "sp.protection " . ($masqueProteges ? "" : "NOT ") . "LIKE $zpP";
}
// si clause négative, IS NULL OR (NOT LIKE [AND NOT LIKE]*) sinon LIKE [OR LIKE]*
if ($masqueProteges) {
$conditions[] = '(' . implode(" OR ", $sousConditions) . ')';
} else {
$conditions[] = '( sp.protection IS NULL OR (' . implode(" AND ", $sousConditions) . '))';
}
} else {
$conditions[] = "sp.protection IS " . ($masqueProteges ? "NOT " : "") . "NULL ";
}
}
}
$where = " WHERE " . implode(' AND ', $conditions);
return $where;
}
 
/**
* Retourne la liste des codes de zones d'application de la protection concernant un département,
* soit le code du département lui-même, le code de sa région, plus les codes "France" et "Europe"
* @TODO déplacer dans sptb ?
* @param string $dept une chaîne représentant le département, sur 2 chiffres
*/
protected function zonesProtegeesParDepartement($dept) {
$zones = array('FX', 'EU');
$zones[] = "Dpt-$dept";
 
// Appel service insee-d pour connaître la région
$url_tpl = Config::get('insee_d_url_tpl');
$url = sprintf($url_tpl, $dept);
$donnees = $this->getRestClient()->consulter($url);
$donnees = json_decode($donnees, true);
if (! empty($donnees['region.code'])) {
$zones[] = 'Reg-' . $donnees['region.code'];
}
 
return $zones;
}
 
/**
* Méthode permettant de faire appel à un client REST en fonction des besoins du service.
*/
/*protected function getRestClient() {
if (! isset($this->RestClient)) {
$this->RestClient = new RestClient();
}
return $this->RestClient;
}*/
}
/trunk/services/configurations/config_chorodep.ini
30,7 → 30,7
; +------------------------------------------------------------------------------------------------------+
; Config spécifique au projet
; Noms des services disponibles pour ce projet
servicesDispo = "meta-donnees,aide,ontologies,observations,cartes,noms,infos-espece"
servicesDispo = "meta-donnees,aide,ontologies,observations,cartes,noms,infos-espece,noms-plus"
 
[Cartes]
; Chemin de base des cartes
46,4 → 46,12
; table des noms vernaculaires
table_nv = "nvjfl_v2007"
; URL des status de protection
url_service_sptb = "http://localhost/service:eflore:0.1/sptb/statuts?masque.nn=%s"
url_service_sptb = "http://localhost/service:eflore:0.1/sptb/statuts?masque.nn=%s"
 
[NomsPlus]
; table des noms vernaculaires
table_chorologie_nv = "chorologie_nv"
; table des statuts de protection
table_chorologie_sp = "chorologie_sp"
; squelette d'url pour les codes INSEE des régions
insee_d_url_tpl = http://localhost/service:eflore:0.1/insee-d/zone-geo/%s
/trunk/scripts/bibliotheque/EfloreScript.php
18,7 → 18,13
 
private $Bdd = null;
private $projetNom = null;
protected $conteneur; // mélange cracra, n'était pas utilisé jusqu'à présent (2014-09-29)
 
public function __construct($script_nom, $parametres_cli) {
parent::__construct($script_nom, $parametres_cli);
$this->conteneur = new Conteneur();
}
 
public function getProjetNom() {
return $this->projetNom;
}
85,5 → 91,28
}
return $stop;
}
 
/**
* Consulte une URL et retourne le résultat (ou déclenche une erreur), en
* admettant qu'il soit au format JSON
*
* @param string $url l'URL du service
*/
protected function chargerDonnees($url, $decoderJSON = true) {
$resultat = $this->conteneur->getRestClient()->consulter($url);
$entete = $this->conteneur->getRestClient()->getReponseEntetes();
 
// Si le service meta-donnees fonctionne correctement, l'entete comprend la clé wrapper_data
if (isset($entete['wrapper_data'])) {
if ($decoderJSON) {
$resultat = json_decode($resultat, true);
$this->entete = (isset($resultat['entete'])) ? $resultat['entete'] : null;
}
} else {
$m = "L'url <a href=\"$url\">$url</a> lancée via RestClient renvoie une erreur";
trigger_error($m, E_USER_WARNING);
}
return $resultat;
}
}
?>
/trunk/scripts/modules/chorodep/Chorodep.php
55,6 → 55,25
case 'supprimerTous' :
$this->supprimerTous();
break;
// noms vernaculaires et statuts de protection
case 'NVSP' :
$this->nettoyageNVSP();
$this->chargerStructureNVSP();
$this->rabouterNomsVernaculaires();
$this->rabouterStatutsProtection();
break;
case 'nettoyageNVSP' :
$this->nettoyageNVSP();
break;
case 'chargerStructureNVSP' :
$this->chargerStructureNVSP();
break;
case 'nomsVernaculaires' :
$this->rabouterNomsVernaculaires();
break;
case 'statutsProtection' :
$this->rabouterStatutsProtection();
break;
default :
throw new Exception("Erreur : la commande '$cmd' n'existe pas!");
}
142,7 → 161,7
private function initialiserTraitement() {
//------------------------------------------------------------------------------------------------------------//
// Récupération des informations à vérifier
$table = $this->getNomTableDernierVersion();
$table = $this->getNomTableDerniereVersion();
$requete = 'SELECT * '.
"FROM $table ";
$taxons = $this->getBdd()->recupererTous($requete);
486,7 → 505,7
return $tablesChorodep;
}
 
private function getNomTableDernierVersion() {
private function getNomTableDerniereVersion() {
$version = $this->getDerniereVersion();
$table = sprintf(Config::get('tables.chorodepTpl'), $version);
return $table;
496,6 → 515,123
$version = array_pop(explode(',', Config::get('versions')));
return $version;
}
 
// ----------
// intégration des noms vernaculaires et statuts de protection (NVSP) dans
// une table dédiée, pour permettre le service intégratif de l'applciation "chorologie"
// (basé sur les scripts de "gentiana-services")
// ----------
 
/**
* Dézingue tout le bousin
* @TODO chaque méthode devrait s'autonettoyer au début afin d'être répétable
* sans avoir à tout reprendre depuis le début (principe du dump)
*/
protected function nettoyageNVSP() {
echo "---- suppression des tables\n";
$tableStatutsProtection = Config::get('tables.statuts_protection');
$tableNomsVernaculaires = Config::get('tables.noms_vernaculaires');
$req = "DROP TABLE IF EXISTS `" . $tableStatutsProtection . "`";
$this->getBdd()->requeter($req);
$req = "DROP TABLE IF EXISTS `" . $tableNomsVernaculaires . "`;";
$this->getBdd()->requeter($req);
}
 
/**
* Crée les tables vides
*/
protected function chargerStructureNVSP() {
echo "---- création des tables\n";
$contenuSql = $this->recupererContenu(Config::get('chemins.structureNVSP'));
$this->executerScripSql($contenuSql);
}
 
/**
* Va chercher les noms vernaculaires pour chaque espèce, et les rajoute
* dans la table dédiée
*/
protected function rabouterNomsVernaculaires() {
$tableNomsVernaculaires = Config::get('tables.noms_vernaculaires');
restore_error_handler();
restore_exception_handler();
ini_set("display_errors", true);
error_reporting(E_ALL);
$squeletteUrlNvjfl = Config::get("url_nvjfl");
echo "---- récupération des noms vernaculaires depuis eFlore\n";
$depart = 0;
$nbInsertions = 0;
$yenaencore = true;
$tailleTranche = 1000;
while ($yenaencore) {
$url = sprintf($squeletteUrlNvjfl, $depart, $tailleTranche);
$noms = $this->chargerDonnees($url);
// Si quelqu'un parvient à dédoublonner les $valeurs, on enlève le IGNORE
$req = "INSERT IGNORE INTO " . $tableNomsVernaculaires . " VALUES ";
$valeurs = array();
// insertion des données
foreach ($noms['resultat'] as $res) {
$numTaxons = explode(',', $res['num_taxon']);
$nvP = $this->getBdd()->proteger($res['nom']);
foreach ($numTaxons as $numTaxon) {
$valeurs[] = "(" . $numTaxon . ", " . $nvP . ")";
}
}
$req .= implode(",", $valeurs);
$this->getBdd()->executer($req);
// prochain tour
$nbInsertions += count($valeurs); // Faux car INSERT IGNORE - dédoublonner ou compter les insertions réelles
$depart += $tailleTranche;
$total = $noms['entete']['total'];
$yenaencore = $depart <= $total;
echo "insérés: " . min($depart, $total) . " noms, " . $nbInsertions . " attributions\n";
}
}
 
/**
* Va chercher les statuts de protection pour chaque espèce et les rajoute
* à la table; importe un fichier dump SQL des lois
*/
protected function rabouterStatutsProtection() {
$tableChorologie = $this->getNomTableDerniereVersion();
$tableStatutsProtection = Config::get('tables.statuts_protection');
echo "---- récupération des statuts de protection depuis eFlore\n";
$req = "SELECT distinct num_nom FROM " . $tableChorologie;
$resultat = $this->getBdd()->recupererTous($req);
// pour chaque taxon mentionné (inefficace mais évite d'implémenter un
// mode liste sur le service eflore/sptb
$squeletteUrlSptb = Config::get("url_sptb");
foreach ($resultat as $res) {
$nn = $res['num_nom'];
//echo "NN: $nn\n";
if ($nn != 0) {
$url = sprintf($squeletteUrlSptb, $nn);
//echo "URL: $url\n";
$statuts = $this->chargerDonnees($url);
//echo "STATUTS: " . print_r($statuts, true) . "\n";
if (count($statuts) > 0) {
$json = array();
foreach ($statuts as $statut) {
$nouveauStatut = array();
$nouveauStatut['zone'] = $statut['code_zone_application'];
$nouveauStatut['lien'] = $statut['hyperlien_legifrance'];
$json[] = $nouveauStatut;
}
// Si au moins un statut
if (count($json) > 0) {
$json = json_encode($json);
//echo "JSON: " . print_r($json, true) . "\n";
// Insertion d'un bout de JSON
$jsonP = $this->getBdd()->proteger($json);
$nnP = $this->getBdd()->proteger($nn);
$reqIns = "INSERT INTO " . $tableStatutsProtection
. " values($nnP, $jsonP)";
//echo "ReqIns: $reqIns\n";
$this->getBdd()->executer($reqIns);
}
}
}
}
}
}
 
class ZgFrDepartements {
626,4 → 762,4
return (int)self::$departements[$n][3];
}
}
?>
?>
/trunk/scripts/modules/chorodep/chorodep.ini
1,5 → 1,5
; Ajouter les nouvelles version à la suite dans versions et versionsDonnees.
versions = "2011_04,2012_01,2013_07,2013_08,2013_11,2014_08"
versions = "2011_04,2012_01,2013_07,2013_08,2013_11"
versionsDonnees="2011-04-05,2012-01-01,2013-07-22,2013-08-05,2013-11-13,2014-08-15"
dossierTsv = "{ref:dossierDonneesEflore}chorodep/{ref:versionDonnees}/"
dossierTsvTpl = "{ref:dossierDonneesEflore}chorodep/%s/"
19,6 → 19,9
chorodepOntologies = "chorodep_ontologies"
chorodep = "chorodep_v{ref:version}"
chorodepTpl = "chorodep_v%s"
; Noms vernaculaires et status de protection :
statuts_protection = "chorologie_sp"
noms_vernaculaires = "chorologie_nv"
 
[fichiers]
structureSql = "chorodep.sql"
29,6 → 32,8
chorodepOntologies = "chorodep_ontologies.tsv"
chorodep = "chorodep_v{ref:versionDonnees}.tsv"
chorodepTpl = "chorodep_v%s.tsv"
; Noms vernaculaires et status de protection :
structureNVSP = "nvsp.sql"
 
[chemins]
structureSql = "{ref:dossierSql}{ref:fichiers.structureSql}"
38,4 → 43,12
chorodepSources = "{ref:dossierSql}{ref:fichiers.chorodepSources}"
chorodepOntologies = "{ref:dossierSql}{ref:fichiers.chorodepOntologies}"
chorodep = "{ref:dossierTsv}{ref:fichiers.chorodep}"
chorodepTpl = "{ref:dossierTsvTpl}{ref:fichiers.chorodepTpl}"
chorodepTpl = "{ref:dossierTsvTpl}{ref:fichiers.chorodepTpl}"
; Noms vernaculaires et status de protection :
structureNVSP = "{ref:dossierSql}{ref:fichiers.structureNVSP}"
 
[services]
;base_url_service_eflore = "http://api.tela-botanica.org/service:eflore:0.1/";
base_url_service_eflore = "http://localhost/service:eflore:0.1/";
url_nvjfl = "{ref:base_url_service_eflore}nvjfl/noms-vernaculaires?masque.lg=fra&retour.champs=num_taxon&retour.tri=num_taxon&navigation.depart=%s&navigation.limite=%s"
url_sptb = "{ref:base_url_service_eflore}sptb/statuts?masque.nn=%s"
/trunk/docs/projets/cel/bdd/cel_v1_00.sql
File deleted