* @author Aurélien PERONNET * @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; } } ?>