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; |
} |
} |
?> |