Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** Exemple lancement:* /opt/lampp/bin/php -d memory_limit=3500M ~/web/moissonnage/scripts/cli.php tuilage -a genererMaillage** @author alex**/class Tuilage extends Script {private $bdd = null;private $resolution = 0;private $resolutionInitiale = 0;private $origine = 0;private $longueurMaille;public function executer() {try {$this->initialiserScript();$cmd = $this->getParametre('a');switch ($cmd) {case 'genererMaillage' :$this->genererTuilage();break;default :throw new Exception("Erreur : la commande '{$cmd}' n'existe pas!");}} catch(Exception $e) {$this->traiterErreur($e->getMessage());}}private function initialiserScript() {$fichierIni = $this->getScriptChemin().'tuilage.ini';if (file_exists($fichierIni)) {Config::charger($fichierIni);} else {$m = "Veuillez configurer le projet en créant le fichier '{$this->projetNom}.ini' "."dans le dossier du module de script du projet à partir du fichier '{$this->projetNom}.defaut.ini'.";throw new Exception($m);}$this->longueurMaille = Config::get('taille_mailles_px');$this->resolutionInitiale = 2 * M_PI * Config::get('rayon_terre') / 256;$this->origine = 2 * M_PI * Config::get('rayon_terre') / 2.0;}private function genererTuilage() {if (!$this->estTableCreee()) {$this->creerStructureTable();}$niveauxZoom = range(Config::get('zoom_minimal'), Config::get('zoom_maximal'), 1);foreach ($niveauxZoom as $zoom) {print("Génération des mailles au niveau de zoom {$zoom}...\n");$this->resolution = $this->resolutionInitiale / pow(2, $zoom);$coordonneesLng = $this->calculerCoordonneesLimitesTuiles($zoom, 'lng');$coordonneesLat = $this->calculerCoordonneesLimitesTuiles($zoom, 'lat');$this->ajouterMaillesDansBdd($zoom, $coordonneesLng, $coordonneesLat);}}private function estTableCreee() {$tables = $this->getBdd()->recupererTous("SHOW TABLES FROM ".Config::get('bdd_nom'));$table = Config::get('eflore_table_mailles');for ($index = 0; $index < count($tables) && $tables[$index]['Tables_in_tb_eflore'] != $table; $index ++);return $index < count($tables);}private function creerStructureTable() {$table = Config::get('eflore_table_mailles');print("Table {$table} non trouvée dans la base de données, création de sa structure...\n");$requete ="CREATE TABLE {$table} ("."zoom TINYINT UNSIGNED NOT NULL,"."axe ENUM('lat','lng') NOT NULL,"."position SMALLINT UNSIGNED NOT NULL,"."debut DECIMAL(9,6) NOT NULL,"."fin DECIMAL(9,6) NOT NULL,"."PRIMARY KEY (zoom, axe, position)".") ENGINE=MyISAM, CHARACTER SET utf8";$this->getBdd()->requeter($requete);$requete = "ALTER TABLE {$table} ADD INDEX (debut), ADD INDEX(fin)";$this->getBdd()->requeter($requete);}private function calculerCoordonneesLimitesTuiles($zoom, $axe) {$variableConfigLimite = $axe == 'lng' ? 'carte.limite_est' : 'carte.limite_nord';$limiteCalcul = Config::get($variableConfigLimite);$nombrePixels = pow(2, $zoom+8);$tailleTableau = $nombrePixels / $this->longueurMaille;$valeurs = array();for ($index = 0; $index <= $tailleTableau; $index ++) {$valeur = $this->convertirPixelEnLatLng($index * $this->longueurMaille, $axe);$valeurs[] = $this->convertirFloatToString($valeur);}return $valeurs;}private function convertirPixelEnLatLng($pixel, $axe) {$coord_metrique = $pixel * $this->resolution - $this->origine;$coord_lnglat = ($coord_metrique / $this->origine) * 180.0;if ($axe == 'lat') {$coord_lnglat = 180 / M_PI * (2 * atan(exp($coord_lnglat * M_PI / 180.0)) - M_PI / 2.0);}return $coord_lnglat;}private function ajouterMaillesDansBdd($zoom, $coordonneesLng, $coordonneesLat) {$table = Config::get('eflore_table_mailles');$nomsChamps = Config::get('eflore_champs_table');$this->getBdd()->requeter("DELETE FROM {$table} WHERE zoom=$zoom");$insertions = array();for ($index = 0; $index < count($coordonneesLng)-1; $index ++) {$insertions[] = "({$zoom},'lng',{$index},".$coordonneesLng[$index].",".$coordonneesLng[$index+1].")";}for ($index = 0; $index < count($coordonneesLat)-1; $index ++) {$insertions[] = "({$zoom},'lat',{$index},".$coordonneesLat[$index].",".$coordonneesLat[$index+1].")";}$requete = "INSERT INTO {$table}({$nomsChamps}) VALUES ".implode(',', $insertions);$this->getBdd()->requeter($requete);}private function getBdd() {if (is_null($this->bdd)) {$this->bdd = new Bdd();}return $this->bdd;}private function convertirFloatToString($float) {return str_replace(',', '.', strval($float));}}?>