Subversion Repositories eFlore/Applications.moissonnage

Rev

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

?>