initialiserScript(); $cmd = $this->getParametre('a'); $parametre = explode('=', $cmd); if (count($parametre) != 2 && $parametre[0] != 'source') { throw new Exception("Parametre passé incorrect : attendu source=nom_de_la_source\n"); } else { if (!$this->estSourceDisponible($parametre[1])) { $sourcesDispo = Config::get('sources_disponibles'); $message = "Erreur lors de l'éxécution du script : la soruce demandée n'est pas disponible.\n". "Les sources dont le maillage est réalisable sont les suivantes : {$sourcesDispo}.\n"; throw new Exception($message); } else { $this->nomSource = $parametre[1]; $this->chargerConfigurationSource($parametre[1]); $this->tableRequetage = $parametre[1].Config::get('suffixe_table_interrogation'); $this->genererMaillage(); } } } catch(Exception $e) { $this->traiterErreur($e->getMessage()); } } private function initialiserScript() { $fichierIni = $this->getScriptChemin().'maillage_projet.ini'; if (file_exists($fichierIni)) { Config::charger($fichierIni); } else { $m = "Veuillez configurer le projet en créant le fichier '{$this->nomProjet}.ini' ". "dans le dossier du module de script du projet à partir du fichier '{$this->nomProjet}.defaut.ini'."; throw new Exception($m); } } private function estSourceDisponible($nomSource) { $sourcesDispo = explode(',', Config::get('sources_disponibles')); return (in_array($nomSource, $sourcesDispo)); } private function chargerConfigurationSource($nomSource) { $fichierIni = $this->getScriptChemin()."sources".DIRECTORY_SEPARATOR."{$nomSource}.ini"; if (file_exists($fichierIni)) { Config::charger($fichierIni); } else { $m = "Veuillez configurer les champs specifiques à la source en créant le fichier ". "'{$nomSource}.ini' dans le dossier sources de script du projet {$this->nomProjet}."; throw new Exception($m); } } private function genererMaillage() { if (!$this->estTableCreee()) { $this->creerStructureTable(); } $zoomMinimal = Config::get('zoom_minimal'); $niveauxZoom = range($zoomMinimal, Config::get('zoom_maximal'), 1); foreach ($niveauxZoom as $zoom) { print("Génération des mailles au niveau de zoom {$zoom}...\n"); if ($zoom == $zoomMinimal) { $this->initialiserMailles(); $this->genererMaillesPourZoomMinimal(); } else { $this->mailles->redecouperMailles(); $this->ajouterMaillesDansBdd(); } } } private function estTableCreee() { $tables = $this->getBdd()->recupererTous("SHOW TABLES FROM ".Config::get('bdd_nom')); $tableInsertion = 'mailles_'.$this->nomSource; for ($index = 0; $index < count($tables) && $tables[$index]['Tables_in_tb_eflore'] != $tableInsertion; $index ++); return $index < count($tables); } private function creerStructureTable() { $tableInsertion = 'mailles_'.$this->nomSource; print("Table {$tableInsertion} non trouvée dans la base de données, création de sa structure...\n"); $requete = "CREATE TABLE {$tableInsertion} (". "code_maille VARCHAR(25) NOT NULL PRIMARY KEY,". "zoom TINYINT UNSIGNED NOT NULL,". "position_latitude SMALLINT UNSIGNED NOT NULL,". "position_longitude SMALLINT UNSIGNED NOT NULL,". "limite_sud DECIMAL(9,6) NOT NULL,". "limite_est DECIMAL(9,6) NOT NULL,". "limite_nord DECIMAL(9,6) NOT NULL,". "limite_ouest DECIMAL(9,6) NOT NULL,". "nombre_sites MEDIUMINT UNSIGNED NOT NULL,". "nombre_observations MEDIUMINT UNSIGNED NOT NULL". ") ENGINE=MyISAM, CHARACTER SET utf8"; $this->getBdd()->requeter($requete); $requete = "ALTER TABLE {$tableInsertion} ADD INDEX bbox(zoom, limite_sud, ". "limite_nord, limite_ouest, limite_est)"; $this->getBdd()->requeter($requete); } private function initialiserMailles() { $limitesEspaceMaillage = $this->recupererExtremesCoordonnees(); $this->recupererIndexMailles($limitesEspaceMaillage, Config::get('zoom_minimal')); } private function recupererExtremesCoordonnees() { $champLongitude = Config::get('tbl.champ_longitude'); $champLatitude = Config::get('tbl.champ_latitude'); $requete = "SELECT Min({$champLongitude}) AS lng_min, Max({$champLongitude}) AS lng_max, ". "Min({$champLatitude}) AS lat_min, Max({$champLatitude}) AS lat_max FROM {$this->tableRequetage}"; $limites = $this->getBdd()->recuperer($requete); return $limites; } private function getBdd() { if (is_null($this->bdd)) { $this->bdd = new Bdd(); } return $this->bdd; } private function recupererIndexMailles($limites, $zoom) { $bbox = array( 'sud' => $limites['lat_min'], 'ouest' => $limites['lng_min'], 'est' => $limites['lng_max'], 'nord' => $limites['lat_max'] ); $this->mailles = new Maillage($bbox, $zoom); $this->mailles->genererMaillesVides(); } private function genererMaillesPourZoomMinimal() { $this->points = $this->recupererPoints(); $this->mailles->ajouterPoints($this->points); $this->ajouterMaillesDansBdd(); } private function recupererPoints() { print("Récupération des points dans la base de données...\n"); $champLongitude = Config::get('tbl.champ_longitude'); $champLatitude = Config::get('tbl.champ_latitude'); $id = Config::get('tbl.champ_id'); $requete = "SELECT COUNT({$id}) AS observations, {$champLatitude} AS latitude, {$champLongitude} ". "AS longitude FROM {$this->tableRequetage} GROUP BY {$champLongitude},{$champLatitude}"; $points = $this->getBdd()->recupererTous($requete); return $points; print("Points chargés\n"); } private function ajouterMaillesDansBdd() { $aInserer = $this->mailles->formaterPourInsertionBdd(); $champsTable = Config::get('champs_table_mailles'); $tableInsertion = 'mailles_'.$this->nomSource; $ordresInsertion = array(); $this->getBdd()->requeter("DELETE FROM {$tableInsertion} WHERE zoom={$aInserer[0]['zoom']}"); foreach ($aInserer as $ligne) { $codeMaille = $this->nomSource.'.'.$ligne['zoom'].'-'.$ligne['indexLat'].'-'.$ligne['indexLng']; $sql = "('{$codeMaille}',{$ligne['zoom']},{$ligne['indexLng']},{$ligne['indexLat']},". "{$ligne['ouest']},{$ligne['sud']},{$ligne['est']},{$ligne['nord']},". "{$ligne['points']},{$ligne['observations']})"; $ordresInsertion[] = $sql; } $requete = "INSERT INTO {$tableInsertion} ({$champsTable}) VALUES ".implode(',', $ordresInsertion); $this->getBdd()->requeter($requete); } } ?>