Rev 1018 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/** Exemple lancement:* /opt/lampp/bin/php -d memory_limit=3500M cli.php ifn -a chargerTous* Options :* -t : Permet de tester le script sur un jeux réduit de données (indiquer le nombre de lignes).*/class Ifn extends EfloreScript {public function executer() {// Lancement de l'action demandéetry {$this->initialiserProjet('ifn');$cmd = $this->getParametre('a');switch ($cmd) {case 'chargerTous' :$this->chargerStructureSql();$this->chargerDonnees("documentationFlore");$this->chargerDonneesAnnuelles();include_once dirname(__FILE__)."/bibliotheque/proj4php/proj4php.php";$this->genererCoordonneesWgs('placettesForet');$this->genererCoordonneesWgs('placettesPeupleraie');$this->genererCodeInsee('placettesForet');$this->genererCodeInsee('placettesPeupleraie');$this->creerVueTapir();$this->ajouterTupleEfloreOntologies();break;case 'chargerStructure' :$this->chargerStructureSql();break;case 'chargerDonnees' :$this->chargerDonnees("documentationFlore");$this->chargerDonneesAnnuelles();break;case 'genererCoordWgs' :include_once dirname(__FILE__)."/bibliotheque/proj4php/proj4php.php";$this->genererCoordonneesWgs('placettesForet');$this->genererCoordonneesWgs('placettesPeupleraie');break;case 'genererCodeInsee' :$this->genererCodeInsee('placettesForet');$this->genererCodeInsee('placettesPeupleraie');break;case 'creerVueTapir' :$this->creerVueTapir();$this->ajouterTupleEfloreOntologies();break;case 'supprimerTous' :$this->supprimerTous();break;default :throw new Exception("Erreur : la commande '$cmd' n'existe pas!");}} catch (Exception $e) {$this->traiterErreur($e->getMessage());}}private function chargerDonneesAnnuelles() {$categories = explode(",",Config::get('categories'));$annees = explode(",",Config::get('versions'));foreach ($categories as $categorie) {foreach ($annees as $annee) {$this->chargerDonnees($categorie, $annee."/");Debug::printr($categorie." ".$annee."\n");}}}private function chargerDonnees($categorie, $annee = '') {$chemin = Config::get('dossierTsv').$annee.Config::get('fichiers.'.$categorie);$table = Config::get('tables.'.$categorie);$requete = "LOAD DATA INFILE '$chemin' "."REPLACE INTO TABLE $table ".'CHARACTER SET utf8 '.'FIELDS '." TERMINATED BY ';' "." ENCLOSED BY '' "." ESCAPED BY '\\\' ".'IGNORE 1 LINES';$this->getBdd()->requeter($requete);}private function genererNumNomBdtfx() {$table = Config::get('tables.flore');$placettes = $this->recupererTuplesPrChpCoordonnees($table);$this->preparerTablePrCoordWgs($table);foreach ($placettes as $placette) {$placette = $this->transformerCoordL93enWgs84($placette);$this->remplirChpCoordonnees($table, $placette);}}private function creerVueTapir() {$requete = "DROP VIEW IF EXISTS ifn_tapir; CREATE VIEW ifn_tapir AS "."SELECT f.idp as observation_id, b.nom_sci as nom_scientifique_complet, b.num_nom, "." fo.lieu_commune_code_insee, fo.lieu_station_latitude, fo.lieu_station_longitude,"." 'WGS84' AS geodeticDatum, e.dateeco as observation_date, '' AS observateur_nom_complet"." FROM `bdtfx_v2_01` b, ifn_flore f, ifn_ecologie e, ifn_placettes_foret fo"." WHERE f.idp = e.idp"." AND e.idp = fo.idp"." AND b.cd_nom = f.cd_ref";$this->getBdd()->requeter($requete);}private function ajouterTupleEfloreOntologies(){ // pour la légende$requete = "INSERT INTO `eflore_ontologies`(id,`classe_id`, `nom`, `description`, `code`, `complements`) VALUES "."(24,10,'IFN',"."'données issues des données brutes mises en ligne de l\'Inventaire Forestier National',"."'ifn','legende=#F2B148')";$this->getBdd()->requeter($requete);}private function genererCoordonneesWgs($categorie) {$table = Config::get('tables.'.$categorie);$placettes = $this->recupererTuplesPrChpCoordonnees($table);$this->preparerTablePrCoordWgs($table);foreach ($placettes as $placette) {$placette = $this->transformerCoordL93enWgs84($placette);$this->remplirChpCoordonnees($table, $placette);}}private function transformerCoordL93enWgs84($coord) {$proj4 = new Proj4php();$projL93 = new Proj4phpProj('EPSG:2154',$proj4);$projWGS84 = new Proj4phpProj('EPSG:4326',$proj4);$projLI = new Proj4phpProj('EPSG:27571',$proj4);$projLSud = new Proj4phpProj('EPSG:27563',$proj4);$projL72 = new Proj4phpProj('EPSG:31370',$proj4);$pointSrc = new proj4phpPoint($coord['xl93'],$coord['yl93']);$pointDest = $proj4->transform($projL93,$projWGS84,$pointSrc);$coord['longitude_wgs'] = '"'.number_format($pointDest->x, 6).'"';$coord['latitude_wgs'] = '"'.number_format($pointDest->y, 6).'"';return $coord;}private function recupererTuplesPrChpCoordonnees($table) {$requete = 'SELECT idp, xl93, yl93 '."FROM {$table} ";$resultat = $this->getBdd()->recupererTous($requete);return $resultat;}private function remplirChpCoordonnees($table, $placette) {$requete = "UPDATE {$table} "." SET lieu_station_longitude = {$placette['longitude_wgs']} , lieu_station_latitude = {$placette['latitude_wgs']} "." WHERE idp = {$placette['idp']} ";$resultat = $this->getBdd()->requeter($requete);if ($resultat === false) {throw new Exception("Erreur d'insertion pour le tuple $idp");}}private function preparerTablePrCoordWgs($table) {$requete = "SHOW COLUMNS FROM {$table} LIKE 'lieu_station_latitude' ";$resultat = $this->getBdd()->recuperer($requete);if ($resultat === false) {$requete = "ALTER TABLE {$table} ".' ADD `lieu_station_latitude` DECIMAL( 9, 6 ),'.' ADD `lieu_station_longitude` DECIMAL( 9, 6 )';$this->getBdd()->requeter($requete);}}private function genererCodeInsee($categorie) {$table = Config::get('tables.'.$categorie);$this->preparerTablePrChpCodeInsee($table);$liste_coordonnees = $this->recupererTuplesPrChpCodeInsee($table);foreach ($liste_coordonnees as $coordonnees) {$code_insee = $this->chercherCodeCommune($coordonnees['latitude'], $coordonnees['longitude']);if ($code_insee != "") {$this->remplirChpCodeInsee($table, $coordonnees['latitude'], $coordonnees['longitude'], $code_insee);}}}private function preparerTablePrChpCodeInsee($table) {$requete = "SHOW COLUMNS FROM {$table} LIKE 'lieu_commune_code_insee' ";$resultat = $this->getBdd()->recuperer($requete);if ($resultat === false) {$requete = "ALTER TABLE {$table} ".' ADD `lieu_commune_code_insee` VARCHAR(5);';$this->getBdd()->requeter($requete);}}private function recupererTuplesPrChpCodeInsee($table) {$requete = 'SELECT distinct lieu_station_latitude as latitude, lieu_station_longitude as longitude '."FROM {$table} WHERE lieu_commune_code_insee IS NULL ";$resultat = $this->getBdd()->recupererTous($requete);return $resultat;}private function remplirChpCodeInsee($table, $latitude, $longitude, $code_insee) {$requete = "UPDATE {$table} "." SET lieu_commune_code_insee = '{$code_insee}'"." WHERE lieu_station_longitude = {$longitude} AND lieu_station_latitude = {$latitude} ";$resultat = $this->getBdd()->requeter($requete);if ($resultat === false) {throw new Exception("Erreur d'insertion pour le tuple $idp");}}private function chercherCodeCommune($latitude, $longitude) {$code_insee = '';if ($this->testerCoordonneesWgsFrance($latitude, $longitude)) {$url_service = "api.tela-botanica.org/service:eflore:0.1/osm/nom-commune"."?lat={$latitude}&lon={$longitude}";$url_service = str_replace(',', '.', $url_service);$ch = curl_init($url_service);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$reponse = curl_exec($ch);$reponse = json_decode($reponse);if (isset($reponse->codeINSEE)) {$code_insee = $reponse->codeINSEE;}curl_close($ch);}return $code_insee;}private function testerCoordonneesWgsFrance($latitude, $longitude) {$coord_france = false;if ($latitude != '' && $longitude != '') {if ($latitude < 51.071667 && $latitude > 41.316667) {if ($longitude < 9.513333 && $longitude > -5.140278) {$coord_france = true;}}}return $coord_france;}private function supprimerTous() {$requete = "DROP TABLE IF EXISTS `ifn_arbres_forets`, `ifn_arbres_peupleraie`, `ifn_couverts_foret`,`ifn_documentation`, `ifn_documentation_flore`, `ifn_ecologie`, `ifn_flore`, `ifn_placettes_foret`,`ifn_placettes_peupleraie`;";$this->getBdd()->requeter($requete);}}?>