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 commandeprotected $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;}}?>