/branches/v5.9-aulnaie/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 |
/branches/v5.9-aulnaie/services/configurations |
---|
Property changes: |
Modified: svn:mergeinfo |
Merged /trunk/services/configurations:r1124 |
/branches/v5.9-aulnaie/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; |
/branches/v5.9-aulnaie/services/modules/0.1/chorodep/Observations.php |
---|
215,16 → 215,7 |
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.'` '; |
} |
/branches/v5.9-aulnaie/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; |
}*/ |
} |
/branches/v5.9-aulnaie/services/modules |
---|
Property changes: |
Modified: svn:mergeinfo |
Merged /trunk/services/modules:r1124 |
/branches/v5.9-aulnaie/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; |
} |
} |
?> |
/branches/v5.9-aulnaie/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,8 → 515,125 |
$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 { |
static private $departements = |
array( |
/branches/v5.9-aulnaie/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" |
/branches/v5.9-aulnaie/docs/projets/cel/bdd/cel_v1_00.sql |
---|
File deleted |
/branches/v5.9-aulnaie/. |
---|
Property changes: |
Modified: svn:mergeinfo |
Merged /trunk:r1124 |