Subversion Repositories eFlore/Applications.cel

Rev

Rev 1523 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
 * Traitement des codes INSEE de la banque de données cel
 *
 * Description : classe permettant d'affecter des codes INSEE aux obs possédant des coordonnées mais pas de commune
 * Utilisation : php script.php code -a codeInseeCommune
 *
 * @category            PHP 5.3
 * @package             phytosocio
 //Auteur original :
 * @author              Delphine CAUQUIL <delphine@tela-botanica.org>
 * @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 Codeinseecommune extends Script {
        
        protected $tableauTaxon;
        protected $dao;
        protected $observations;
        
        protected $mode_verbeux = false;
        
        // Paramêtres autorisées lors de l'appel au script en ligne de commande
        protected $parametres_autorises = array(
                '-n' => array(true, true, 'Nom du fichier ou du dossier à traiter'));

// +-------------------------------------------------------------------------------------------------------------------+
        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');
                
                switch ($cmd) {
                        case 'tout' :
                                // à effectuer manuellement au premier lancement du script
                                $this->creerColonne();
                                $this->calculerCodesInsee();
                                break;
                        case 'colonne' :
                                $this->creerColonne();
                                break;
                        case 'sanscorrespondance' :
                                // devrait être être l'option utilisée dans le cron quotidien (avec l'option -v 0)
                                $this->calculerCodesInseeSansCorrespondance();
                                break;
                        case 'calculer' :
                                $this->calculerCodesInsee();
                                break;
                        default :
                                $this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
                }
        }

// +-------------------------------------------------------------------------------------------------------------------+

        private function creerColonne() {
                $this->dao->creerColonneCodeInseeCalcule();
        }
        
        private function calculerCodesInseeSansCorrespondance() {
                $liste_coordonnees = $this->dao->rechercherCoordonneesSansCorrespondances();
                $this->traiterCoordonnees($liste_coordonnees);
        }
        
        private function calculerCodesInsee() {
                $liste_coordonnees = $this->dao->rechercherCoordonnees();
                $this->traiterCoordonnees($liste_coordonnees);
        }
        
        private function traiterCoordonnees($liste_coordonnees) {
                
                $debut = microtime(true);
                $nb_coordonnees_modifiees = 0;
                $nb_coordonnees_ignorees = 0;
                $total = count($liste_coordonnees);
                
                if($this->mode_verbeux) {
                        echo "-------------------------------------------------------------------\n";
                        echo "  Calcul des codes INSEE et modification (".count($liste_coordonnees)." coordonnées en tout) ... \n";
                        echo "  Enrichissement des champs zone geo et ce_zone_geo vides ... \n";
                        echo "-------------------------------------------------------------------\n";
                }
                                
                foreach ($liste_coordonnees as $coordonnees) {
                        $infos_coord = $this->obtenirInfosPourCoordonnees($coordonnees);
                        if ($infos_coord != null) {
                                $coordonnee_a_traiter = array(
                                        'latitude' => $coordonnees['latitude'], 
                                        'longitude' => $coordonnees['longitude'],
                                        'code_insee' => $infos_coord['code_insee'],
                                        'nom' => $infos_coord['nom']    
                                );
                                $this->modifierInformationsGeo($coordonnee_a_traiter);
                                $nb_coordonnees_modifiees++;
                        } else {
                                $nb_coordonnees_ignorees++;
                        }
                        if($this->mode_verbeux) {
                                $this->afficherAvancement('  Coordonnées traitées ', $nb_coordonnees_modifiees);
                        }
                }
                
                $fin = microtime(true);
                if($this->mode_verbeux) {
                        echo "\n";
                        echo "-------------------------------------------------------------------\n";
                        echo "  Fin de la mise à jour des codes INSEE calculés et de l'enrichissement, \n";
                        echo "  ".($fin - $debut)." secondes écoulées \n";
                        echo "  ".$nb_coordonnees_modifiees." code insee calculés et modifiés \n";
                        echo "  ".$nb_coordonnees_ignorees." coordonnées ignorées \n";
                        echo "-------------------------------------------------------------------\n";
                        echo "\n";
                }
        }
        
        private function obtenirInfosPourCoordonnees($coordonnees) {
                $infos_coord = null;
                if ($this->testerCoordonneesWgsFrance($coordonnees['latitude'], $coordonnees['longitude'])) {
                        $infos_coord = $this->chercherInfosCommune('osm', $coordonnees['latitude'], $coordonnees['longitude']);
                        if ($infos_coord == null) {
                                $infos_coord = $this->chercherInfosCommune('lion1906', $coordonnees['latitude'], $coordonnees['longitude']);
                        }
                }
                return $infos_coord;
        }
        
        private function modifierInformationsGeo($coordonnee_a_traiter) {
                $this->modifierCodeInseeCalculePourCoordonnees($coordonnee_a_traiter);
                $this->modifierCodeInseeEtZoneGeo($coordonnee_a_traiter);
        }
        
        private function modifierCodeInseeCalculePourCoordonnees($coordonnee_a_traiter) {
                $this->dao->testerActiviteConnection();
                $this->dao->ajouterCodeInseeCalcule($coordonnee_a_traiter['latitude'], $coordonnee_a_traiter['longitude'], $coordonnee_a_traiter['code_insee']);
        }
                
        private function modifierCodeInseeEtZoneGeo($coordonnee_a_traiter) {
                        $this->dao->testerActiviteConnection();
                        $this->dao->modifierCodeInseeEtZoneGeo($coordonnee_a_traiter);
        }
        
        private function chercherInfosCommune($projet, $latitude, $longitude) {
                $url_service = "www.tela-botanica.org/service:eflore:0.1/{$projet}/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);
                
                $infos_coord = $this->traiterReponseServiceCommune($reponse);
                curl_close($ch);
                
                return $infos_coord;
        }

        private function traiterReponseServiceCommune($reponse) {
                $retour = null;
                $reponse = json_decode($reponse);
                // cas du service lion 1906 qui peut renvoyer plusieurs communes (on prend la première)
                if(is_array($reponse)) {
                        $reponse = $reponse[0];
                }
                if (isset($reponse->codeINSEE)) {
                        $retour = array('code_insee' => $reponse->codeINSEE,
                                                        'nom' => $reponse->nom);
                } 
                return $retour;
        }
        
        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;
        }
}
?>