Subversion Repositories eFlore/Applications.cel

Rev

Rev 1515 | Rev 1518 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
 * Traitement des fichiers de la banque de données SOPHY pour insertion
 *
 * Description : classe permettant d'insérer les tableaux phytosociologiques de la banque de données SOPHY
 * Utilisation : php script.php code -a codeInseeCommune
 *
 * @category            PHP 5.3
 * @package             phytosocio
 //Auteur original :
 * @author              Delphine CAUQUIL <delphine@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;
        // 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');
                switch ($cmd) {
                        case 'tout' :
                                // à effectuer manuellement au premier lancement du script
                                $this->creerColonne();
                                $this->calculerCodeInsee();
                                // modifierCodeInsee semble poser problème sur le serveur après beaucoup de requetes
                                //$this->modifierCodeInsee();
                                break;
                        case 'sanscorrespondance' :
                                // devrait être être l'option utilisée dans le cron quotidien
                                $this->calculerCodeInseeSansCorrespondance();
                                // modifierCodeInsee semble poser problème sur le serveur après beaucoup de requetes
                                //$this->modifierCodeInsee();
                        break;
                        case 'colonne' :
                                $this->creerColonne();
                                break;
                        case 'calculer' :
                                $this->calculerCodeInsee();
                                break;
                        case 'modifier' :
                                $this->modifierCodeInsee();
                                break;
                        default :
                                $this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
                }
        }

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

        private function creerColonne() {
                $this->dao->creerColonneCodeInseeCalculee();
        }
        
        private function calculerCodeInseeSansCorrespondance() {
                $liste_coordonnees = $this->dao->rechercherCoordonneesSansCorrespondances();
                $this->traiterCoordonnees($liste_coordonnees);
        }
        
        private function calculerCodeInsee() {
                $liste_coordonnees = $this->dao->rechercherCoordonnees();
                $this->traiterCoordonnees($liste_coordonnees);
        }
        
        private function traiterCoordonnees($liste_coordonnees) {
                echo "-------------------------------------------------------------------\n";
                echo "  Traitement et calcul des codes INSEE (".count($liste_coordonnees)." coordonnées en tout) ... \n";
                echo "-------------------------------------------------------------------\n";
                $debut = microtime(true);
                $i = 0;
                $total = count($liste_coordonnees);
                foreach ($liste_coordonnees as $coordonnees) {
                        if ($this->testerCoordonneesWgsFrance($coordonnees['latitude'], $coordonnees['longitude'])) {
                                $code_insee = $this->chercherCodeCommune('osm', $coordonnees['latitude'], $coordonnees['longitude']);
                                if ($code_insee != "") {
                                        $this->dao->ajouterCodeInseeCalculee($coordonnees['latitude'], $coordonnees['longitude'], $code_insee);
                                } else {
                                        $code_insee = $this->chercherCodeCommune('lion1906', $coordonnees['latitude'], $coordonnees['longitude']);
                                        if ($code_insee != "") {
                                                $this->dao->ajouterCodeInseeCalculee($coordonnees['latitude'], $coordonnees['longitude'], $code_insee);
                                        }
                                }
                        }
                        $i++;
                        $this->afficherAvancement('  Lignes traitées ', $i);
                }
                echo "\n";
                $fin = microtime(true);
                echo "-------------------------------------------------------------------\n";
                echo "  Fin du traitement, ".($fin - $debut)." secondes écoulées \n";
                echo "-------------------------------------------------------------------\n";
                echo "\n";
        }
        
        private function modifierCodeInsee() {
                $this->dao->modifierCodeInsee();
        }
        
        private function chercherCodeCommune($projet, $latitude, $longitude) {
                $code_insee = '';
                $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);
                $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 analyserCodeDeptComm($ligneDecoupe) {
                if (preg_match('/^\d{2}$/', $ligneDecoupe['codeDept'])) {
                } elseif (preg_match('/^\s{0,1}\d{1,2}\s{0,1}$/',$ligneDecoupe['codeDept'])) {
                        $ligneDecoupe['codeDept'] = str_replace(' ', '0', $ligneDecoupe['codeDept']);
                } else {
                        $ligneDecoupe['codeDept'] = null;
                }
                if (preg_match('/^\d{3}$/', $ligneDecoupe['codeCommune'])) {
                } elseif (preg_match('/^\s{0,2}\d{1,2,3}\s{0,2}$/', $ligneDecoupe['codeCommune'])) {
                        $ligneDecoupe['codeCommune'] = str_replace(' ', '0', $ligneDecoupe['codeCommune']);
                } elseif ($ligneDecoupe['codeDept'] == null) {
                        $ligneDecoupe['codeCommune'] = null;
                } else {
                        $ligneDecoupe['codeCommune'] = '000';
                }
                return $ligneDecoupe;
        }
        private function analyserCoordGrdParis($ligneDecoupe, $ligne) {
                if (preg_match('/[\s0]0\.000/', $ligneDecoupe['latitude'], $match)) {
                        $ligneDecoupe['latitude'] = null;
                        $ligneDecoupe['longitude'] = null;
                } elseif (preg_match('/\d{1,2}\.\d{2,3}/', $ligneDecoupe['latitude'], $match)) {// format souhaité
                        $ligneDecoupe['latitude_wgs'] = round($ligneDecoupe['latitude']*0.9, 7);
                        $ligneDecoupe['longitude_wgs'] = round($ligneDecoupe['longitude']*0.9+2.3372291, 7);
                } elseif (preg_match('/(\d{2})[\d\s,](\d{3})/', $ligneDecoupe['latitude'], $match)) {//erreur de saisie
                        $ligneDecoupe['latitude'] = $match[1].'.'.$match[2];
                        $ligneDecoupe['latitude_wgs'] = round($ligneDecoupe['latitude']*0.9, 7);
                        $ligneDecoupe['longitude_wgs'] = round($ligneDecoupe['longitude']*0.9 + 2.3372291, 7);
                } elseif (preg_match('/^[a-zA-Z\s]*[a-zA-Z][a-zA-Z\s]*$/', $ligneDecoupe['latitude'])) {// lat absente + nom long
                        $ligneDecoupe['nomStation'] = rtrim(substr($ligne, 10, 48));
                        $ligneDecoupe['latitude'] = null;
                        $ligneDecoupe['longitude'] = null;
                } elseif (preg_match('/.[AO].123/', $ligneDecoupe['latitude'], $match)) {
                        $ligneDecoupe['latitude'] = null;
                        $ligneDecoupe['longitude'] = null;
                }  elseif ($ligneDecoupe['latitude'] != null) {
                        $ligneDecoupe['latitude'] = null;
                        $ligneDecoupe['longitude'] = null;
                }
                return $ligneDecoupe;
        }
}
?>