Subversion Repositories eFlore/Applications.cel

Rev

Rev 1999 | Blame | Last modification | View Log | RSS feed

<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
 * Traitement des observations sauvages pour les migrer vers des champs étendus
 *
 * Description : classe permettant d'affecter des champs étendus aux observations sauvages
 * Utilisation : php script.php migrationsauvages -a migrerObservationsSauvages
 *
 * @category            PHP 5.3
 * @package             scripts
 //Auteur original :
 * @author              Aurélien PERONNET <aurelien@tela-botanica.org>
 * @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 {
        
        // +-------------------------------------------------------------------------------------------------------------------+
        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
                $cmd = $this->getParametre('a');
                $this->mode_verbeux = $this->getParametre('v');
        
                $this->migrerObservationsSauvages();
                
        }
        
        private function migrerObservationsSauvages() {
                $nb_obs = $this->dao->obtenirNbObservationsSauvages();
                $this->traiterObservationsSauvages($nb_obs);
        }
        
        private function traiterObservationsSauvages($nb_obs) {
                $debut = microtime(true);
                $nb_obs_modifiees = 0;
                $nb_obs_ignorees = 0;
                $total = $nb_obs;
                
                if($this->mode_verbeux) {
                        echo "-------------------------------------------------------------------\n";
                        echo " Début de la migration des observations sauvages vers les champs étendus \n";
                        echo " ".$total." observations concernées                                                                      \n";
                        echo "-------------------------------------------------------------------\n";
                }
                
                $champs_etendus_a_inserer = array();
                $nb_champs_total = 0;
                $nb_champs = 0;
                
                $pas_liste_obs = 5000;
                echo " Insertion des champs étendus (5 par observation) par paquet de 100 \n";
                
                for($i = 0; $i <= $total; $i += $pas_liste_obs) {       
                        $liste_observations = $this->dao->obtenirObservationsSauvages($i, $pas_liste_obs);
                        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_a_inserer[] = $this->convertirChampsObsSauvagesEnChampsEtendus($observation);
                                        $nb_obs_modifiees++;
                                        $nb_champs += 5;
                                        $nb_champs_total += 5;
                                } 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 >= 100 || ($nb_obs_modifiees + $nb_obs_ignorees >= count($liste_observations))) {
                                        $this->dao->ajouterChampsEtendusParLots($champs_etendus_a_inserer);
                                        $champs_etendus_a_inserer = array();
                                        $nb_champs = 0;
                                        
                                        if($this->mode_verbeux) {
                                                $this->afficherAvancement(' champs étendus insérés ', $nb_champs_total);
                                        }
                                }
                        }
                }
                $fin = microtime(true);
                if($this->mode_verbeux) {
                        echo "\n";
                        echo "-------------------------------------------------------------------\n";
                        echo "  Fin de la migration des observations sauvages, \n";
                        echo "  ".($fin - $debut)." secondes écoulées \n";
                        echo "  ".$nb_champs_total." champs étendus créées \n";
                        echo "  ".$nb_obs_modifiees." observations modifiées \n";
                        echo "  ".$nb_obs_ignorees." observations ignorées \n";
                        echo "-------------------------------------------------------------------\n";
                        echo "\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'];
                $champs_etendus = array(
                                                        array('id_observation' => $id,
                                                                                'cle' => 'latitudeDebutRue',
                                                                                'label' => 'Latitude du début de la rue',
                                                                                'valeur' => $coords_debut_rue[0]),
                                                        array('id_observation' => $id,
                                                                                'cle' => 'longitudeDebutRue',
                                                                                'label' => 'Longitude du début de la rue',
                                                                                'valeur' => $coords_debut_rue[1]),
                                                        array('id_observation' => $id,
                                                                                'cle' => 'latitudeFinRue',
                                                                                'label' => 'Latitude de fin de la rue',
                                                                                'valeur' => $coords_debut_rue[0]),
                                                        array('id_observation' => $id,
                                                                                'cle' => 'longitudeFinRue',
                                                                                'label' => 'Longitude de fin de la rue',
                                                                                'valeur' => $coords_debut_rue[1]),
                                                        array('id_observation' => $id,
                                                                                'cle' => 'adresse',
                                                                                'label' => 'Adresse',
                                                                                'valeur' => $lieu_dit)
                                                );
                return $champs_etendus;
        }
}
?>