Subversion Repositories eFlore/Projets.eflore-projets

Compare Revisions

Ignore whitespace Rev 247 → Rev 248

/trunk/services/modules/0.1/chorodep/Cartes.php
33,11 → 33,17
private $taxonsDemandes = array();
private $imgLargeur = 0;
private $imgHauteur = 0;
private $legende = array();
private $donnees = array();
 
public function __construct(Bdd $bdd = null, Array $config = null, CacheSimple $cache = null) {
$this->Bdd = is_null($bdd) ? new Bdd() : $bdd;
$this->config = is_null($config) ? Config::get('Cartes') : $config;
 
$this->chargerLegende();
 
$this->cheminCartesBase = $this->config['chemin'];
 
$cacheOptions = array('mise_en_cache' => $this->config['cache']['miseEnCache'],
'stockage_chemin' => $this->config['cache']['stockageChemin'],
'duree_de_vie' => $this->config['cache']['dureeDeVie']);
45,6 → 51,33
$this->cache = is_null($cache) ? new CacheSimple($cacheOptions) : $cache;
}
 
private function chargerLegende() {
$requete = 'SELECT * '.
'FROM chorodep_ontologies '.
"WHERE classe_id = 1 ";
$resultats = $this->Bdd->recupererTous($requete);
 
if (!is_array($resultats) || count($resultats) <= 0) {
$message = "La légende n'a pu être chargée pour la ressource demandée";
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
throw new Exception($message, $code);
}
 
foreach ($resultats as $ontologie) {
$ontologie = $this->extraireComplementsOntologies($ontologie);
$this->legende[$ontologie['code']] = $ontologie['legende'];
}
}
 
private function extraireComplementsOntologies($ontologie) {
$complements = explode(',', trim($ontologie['complements']));
foreach ($complements as $complement) {
list($cle, $val) = explode('=', trim($complement));
$ontologie[trim($cle)] = trim($val);
}
return $ontologie;
}
 
public function consulter($ressources, $parametres) {
//$tpsDebut = microtime(true);
$this->parametres = $parametres;
55,6 → 88,7
$this->analyserIdentifiant();
 
$resultat = new ResultatService();
$this->chargerDonnees();
if ($this->parametres['retour'] == self::MIME_SVG) {
$svg = $this->genererSVG();
$resultat->corps = $svg;
151,52 → 185,93
}
}
 
private function genererSVG() {
$fichierCssBase = $this->cheminCartesBase.self::CARTE_DEFAUT.'.css';
$css = file_get_contents($fichierCssBase);
$css .= ".departement2b{fill:#ff0000;}";
private function chargerDonnees() {
$refTax = self::CODE_REFTAX_DEFAUT;
$numNom = $this->Bdd->proteger($this->taxonsDemandes[$refTax]['nn'][0]);
 
$idCss = $this->getIdFichierCss();
$fichierCss = $this->config['cache']['stockageChemin'].$idCss.'.css';
file_put_contents($fichierCss, $css);
$urlCss = sprintf($this->config['cssUrlTpl'], $idCss);
$requete = 'SELECT * '.
'FROM chorodep_v2012_01 '.
"WHERE num_nom IN ($numNom) ";
$resultat = $this->Bdd->recupererTous($requete);
 
$fichierCarteSvg = $this->cheminCartesBase.self::CARTE_DEFAUT.'.svg';
if (!is_array($resultat) || count($resultat) <= 0) {
$message = "Aucune donnée ne correspond à la ressource demandée";
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
throw new Exception($message, $code);
}
$this->donnees = $resultat;
}
 
private function genererSVG() {
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->validateOnParse = true;
 
$fichierCarteSvg = $this->cheminCartesBase.self::CARTE_DEFAUT.'.svg';
$dom->load($fichierCarteSvg);
 
$racineElement = $dom->documentElement;
$racineElement->setAttribute('width', $this->imgLargeur);
$piCss = $dom->createProcessingInstruction('xml-stylesheet', 'type="text/css" href="'.$urlCss.'"');
$dom->insertBefore($piCss, $racineElement);
 
$css = $this->creerCssCarte();
$txtCss = $dom->createCDATASection($css);
$dom->getElementsByTagName('style')->item(0)->appendChild($txtCss);
 
$titre = $this->creerTitre();
$titreCdata = $dom->createCDATASection($titre);
$titreElement = $dom->getElementsByTagName('title')->item(0);
$titreElement->nodeValue = '';
$titreElement->appendChild($titreCdata);
 
$taxonTitre = $this->creerTitreTaxon();
$taxonCdata = $dom->createCDATASection($taxonTitre);
$xpath = new DOMXPath($dom);
$taxonTitreEl = $xpath->query("//*[@id='titre-taxon']")->item(0);
$taxonTitreEl->nodeValue = '';
$taxonTitreEl->appendChild($taxonCdata);
 
$svg = $dom->saveXML();
return $svg;
}
 
private function chargerDonnees() {
$refTax = self::CODE_REFTAX_DEFAUT;
$numNom = $this->Bdd->proteger($this->taxonsDemandes[$refTax]['nn'][0]);
private function creerCssCarte() {
$fichierCssBase = $this->cheminCartesBase.self::CARTE_DEFAUT.'.css';
$css = file_get_contents($fichierCssBase);
 
$requete = 'SELECT '.
'FROM cel_obs_images AS coi '.
' LEFT JOIN cel_inventory AS ci '.
'ON (coi.coi_ce_observation = ci.ordre AND coi.coi_ce_utilisateur = ci.identifiant) '.
'WHERE ci.transmission = 1 '.
" AND ci.num_nom_ret IN ($numNom) ";
$resultat = $this->Bdd->recupererTous($requete);
$zonesCouleurs = $this->getZonesCouleurs();
foreach ($zonesCouleurs as $couleur => $zonesClasses) {
$classes = implode(', ', $zonesClasses);
$css .= "$classes{\nfill:$couleur;\n}\n";
}
return $css;
}
 
if (!is_array($resultat) || count($resultat) <= 0) {
$message = "Aucune donnée ne correspond à la ressource demandée";
$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
throw new Exception($message, $code);
private function getZonesCouleurs() {
$zones = array();
foreach ($this->donnees as $donnee) {
foreach ($donnee as $champ => $valeur) {
if (preg_match('/^[0-9][0-9ab]$/i', $champ)) {
if (array_key_exists($valeur, $this->legende)) {
$couleur = $this->legende[$valeur];
$zones[$couleur][] = strtolower(".departement$champ");
}
}
}
}
return $zones;
}
 
private function creerTitre() {
$titre = "Carte en cours d'élaboration pour ".$this->creerTitreTaxon();
return $titre;
}
 
private function getIdFichierCss() {
$ids = isset($this->ressources[0]) ? $this->ressources[0] : 'globale';
$idCss = str_replace(array(',', ';', ':'), '-', $ids);
return $idCss;
private function creerTitreTaxon() {
$noms = array();
foreach ($this->donnees as $donnee) {
$noms[] = $donnee['nom_sci'];
}
$titre = implode(', ', $noms);
return $titre;
}
 
private function convertirEnPNG($svg) {
221,5 → 296,23
$convertisseur->destroy();
return $png;
}
 
public function getParametreTableau($cle) {
$tableau = array();
$parametre = $this->config[$cle];
if (empty($parametre) === false) {
$tableauPartiel = explode(',', $parametre);
$tableauPartiel = array_map('trim', $tableauPartiel);
foreach ($tableauPartiel as $champ) {
if (strpos($champ, '=') === false) {
$tableau[] = trim($champ);
} else {
list($cle, $val) = explode('=', $champ);
$tableau[trim($cle)] = trim($val);
}
}
}
return $tableau;
}
}
?>