* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org) * @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3 * @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2 * @version $Id$ */ // +-------------------------------------------------------------------------------------------------------------------+ class MigrationSauvages extends Script { protected $parametres_autorises = array( '-s' => array(false, true, "Chemin vers le fichier de sortie pour l'export")); // +-------------------------------------------------------------------------------------------------------------------+ public function executer() { include_once dirname(__FILE__).'/bibliotheque/Dao.php'; $this->dao = new Dao(); // Récupération de paramétres // Lancement de l'action demandée $this->mode_verbeux = $this->getParametre('v'); $cmd = $this->getParametre('a'); try { switch ($cmd) { case 'exporter' : $this->exporterObservationsSauvagesAMigrer(); break; case 'migrer' : $this->migrerObservationsSauvages(); break; default : $msg = "Erreur : la commande '$cmd' n'existe pas!\n". "Commandes existantes : exporter, migrer"; throw new Exception($msg); } } catch (Exception $e) { $this->traiterErreur($e->getMessage()); } } private function exporterObservationsSauvagesAMigrer() { $total = $this->dao->obtenirNbObservationsSauvages(); $pas_liste_obs = 5000; echo " Traitement des $total observations par paquet de $pas_liste_obs \n"; $fichier = $this->getParametre('s'); $fp = fopen($fichier, 'w'); $ecrireEntete = true; for ($i = 0; $i <= $total; $i += $pas_liste_obs) { $liste_observations = $this->dao->obtenirObservationsSauvages($i, $pas_liste_obs); foreach ($liste_observations as $observation) { if ($this->doitMigrerObservation($observation)) { $champs_etendus = $this->convertirChampsObsSauvagesEnChampsEtendus($observation); $champs_etendus_fixes = array( 'latitudeDebutRue', 'longitudeDebutRue', 'latitudeFinRue', 'longitudeFinRue', 'adresse', 'coteRue'); foreach ($champs_etendus_fixes as $cle) { $observation[$cle] = ''; foreach ($champs_etendus as $champs) { if ($champs['cle'] == $cle) { $observation[$cle] = $champs['valeur']; } } } } if ($ecrireEntete) { fputcsv($fp, array_keys($observation)); $ecrireEntete = false; } fputcsv($fp, array_values($observation)); $this->afficherAvancement("\tObs traitées : ", 1); } } fclose($fp); echo "\nFin de l'export\n"; } private function migrerObservationsSauvages() { if ($this->mode_verbeux) $debut = microtime(true); $nb_obs_modifiees = 0; $nb_obs_ignorees = 0; $total = $this->dao->obtenirNbObservationsSauvages(); if ($this->mode_verbeux) { echo "-------------------------------------------------------------------\n". " Début de la migration des observations sauvages vers les champs étendus \n". " $total observations concernées\n". "-------------------------------------------------------------------\n"; } $champs_etendus_a_inserer = array(); $nb_champs_total = 0; $nb_champs_etendus_a_inserer = 0; $pas_liste_obs = 5000; echo " Traitement des observations par paquet de ".$pas_liste_obs." (5 champs étendus ajoutés par observation traitée) \n"; for ($i = 0; $i <= $total; $i += $pas_liste_obs) { $liste_observations = $this->dao->obtenirObservationsSauvages($i, $pas_liste_obs); $champs_etendus_a_inserer = array(); $nb_champs_etendus_a_inserer = 0; foreach ($liste_observations as $observation) { // test si obs candidate est ok, i.e. si elle contient bien un champ station formate comme ceci // coordonnees_debut_de_rue;coordonnees_fin_de_rue;cote_de_la_rue if ($this->doitMigrerObservation($observation)) { $champs_etendus = $this->convertirChampsObsSauvagesEnChampsEtendus($observation); $champs_etendus_a_inserer[] = $champs_etendus; $nb_champs = count($champs_etendus); $nb_obs_modifiees++; $nb_champs_etendus_a_inserer += $nb_champs; $nb_champs_total += $nb_champs; } else { $nb_obs_ignorees++; } // insertion par paquets de 100 champs ou bien à la fin du parcours de la liste s'il y a moins de // 20 observations à traiter (20 obs * 5 champs = 100 champs) if ($nb_champs_etendus_a_inserer >= 100) { $this->dao->ajouterChampsEtendusParLots($champs_etendus_a_inserer); $champs_etendus_a_inserer = array(); $nb_champs_etendus_a_inserer = 0; } } echo " $nb_champs_total champs étendus insérés \n"; } // insertion des champs restants s'il en reste moins de 100 à la fin if ($nb_champs_etendus_a_inserer > 0) { $this->dao->ajouterChampsEtendusParLots($champs_etendus_a_inserer); $nb_champs_total += $nb_champs_etendus_a_inserer; echo " $nb_champs_total champs étendus insérés \n"; } if ($this->mode_verbeux) { $fin = microtime(true); $tps_ecoule = $fin - $debut; echo "\n". "-------------------------------------------------------------------\n". " Fin de la migration des observations sauvages, \n". " $tps_ecoule secondes écoulées \n". " $nb_champs_total champs étendus créées \n". " $nb_obs_modifiees observations modifiées \n". " $nb_obs_ignorees observations ignorées \n". "-------------------------------------------------------------------\n\n"; } } private function doitMigrerObservation($observation) { return (!empty($observation['station']) && substr_count($observation['station'], ';') == 2); } private function convertirChampsObsSauvagesEnChampsEtendus($observation) { list($coords_debut_rue, $coords_fin_rue, $cote_rue) = explode(';', $observation['station']); $coords_debut_rue = explode(',', $coords_debut_rue); $coords_fin_rue = explode(',', $coords_fin_rue); $lieu_dit = (trim($observation['lieudit']) == 'non renseigné(e)') ? '' : $observation['lieudit']; $id = $observation['id_observation']; if (!preg_match('/^(?:2cotes|pair|impair|)$/', $cote_rue)) { $msg = "Obs #$id: erreur champ cote_rue contient : $cote_rue"; $this->traiterErreur($msg); } $testCoords = array( 'latitudeDebutRue' => $coords_debut_rue[0], 'longitudeDebutRue' => $coords_debut_rue[1], 'latitudeDebutRue' => $coords_fin_rue[0], 'longitudeDebutRue' => $coords_fin_rue[1] ); foreach ($testCoords as $champ => $coord) { if (!preg_match('/^(?:-|)[0-9]{1,2}[.][0-9]{5}$/', $coord)) { $msg = "Obs #$id: erreur champ $champ contient : $coord"; $this->traiterErreur($msg); } } $champs_etendus = array(); if (count($coords_debut_rue) == 2) { $champs_etendus[] = array('id_observation' => $id, 'cle' => 'latitudeDebutRue', 'label' => 'Latitude du début de la rue', 'valeur' => $coords_debut_rue[0]); $champs_etendus[] = array('id_observation' => $id, 'cle' => 'longitudeDebutRue', 'label' => 'Longitude du début de la rue', 'valeur' => $coords_debut_rue[1]); } if (count($coords_fin_rue) == 2) { $champs_etendus[] = array('id_observation' => $id, 'cle' => 'latitudeFinRue', 'label' => 'Latitude de fin de la rue', 'valeur' => $coords_fin_rue[0]); $champs_etendus[] = array('id_observation' => $id, 'cle' => 'longitudeFinRue', 'label' => 'Longitude de fin de la rue', 'valeur' => $coords_fin_rue[1]); } if ($lieu_dit != '') { $champs_etendus[] = array('id_observation' => $id, 'cle' => 'adresse', 'label' => 'Adresse', 'valeur' => $lieu_dit); } if (preg_match('/^(?:2cotes|pair|impair)$/', $cote_rue)) { $champs_etendus[] = array('id_observation' => $id, 'cle' => 'coteRue', 'label' => 'Côté rue', 'valeur' => $cote_rue); } return $champs_etendus; } } ?>