2,9 → 2,9 |
// Encodage : UTF-8 |
// +-------------------------------------------------------------------------------------------------------------------+ |
/** |
* Traitement des fichiers de la banque de données SOPHY pour insertion |
* Traitement des codes INSEE de la banque de données cel |
* |
* Description : classe permettant d'insérer les tableaux phytosociologiques de la banque de données SOPHY |
* 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 |
11,6 → 11,7 |
* @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 |
22,6 → 23,9 |
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')); |
34,27 → 38,24 |
// 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->calculerCodeInsee(); |
$this->modifierCodeInsee(); |
$this->calculerCodesInsee(); |
break; |
case 'sanscorrespondance' : |
// devrait être être l'option utilisée dans le cron quotidien |
$this->calculerCodeInseeSansCorrespondance(); |
$this->modifierCodeInsee(); |
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->calculerCodeInsee(); |
$this->calculerCodesInsee(); |
break; |
case 'modifier' : |
$this->modifierCodeInsee(); |
break; |
default : |
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd)); |
} |
63,55 → 64,92 |
// +-------------------------------------------------------------------------------------------------------------------+ |
|
private function creerColonne() { |
$this->dao->creerColonneCodeInseeCalculee(); |
$this->dao->creerColonneCodeInseeCalcule(); |
} |
|
private function calculerCodeInseeSansCorrespondance() { |
private function calculerCodesInseeSansCorrespondance() { |
$liste_coordonnees = $this->dao->rechercherCoordonneesSansCorrespondances(); |
$this->traiterCoordonnees($liste_coordonnees); |
} |
|
private function calculerCodeInsee() { |
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 " Traitement et calcul des codes INSEE (".count($liste_coordonnees)." coordonnées en tout) ... \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"; |
$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); |
$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 { |
$code_insee = $this->chercherCodeCommune('lion1906', $coordonnees['latitude'], $coordonnees['longitude']); |
if ($code_insee != "") { |
$this->dao->ajouterCodeInseeCalculee($coordonnees['latitude'], $coordonnees['longitude'], $code_insee); |
$nb_coordonnees_ignorees++; |
} |
if($this->mode_verbeux) { |
$this->afficherAvancement(' Coordonnées traitées ', $nb_coordonnees_modifiees); |
} |
} |
$i++; |
$this->afficherAvancement(' Lignes traitées ', $i); |
$this->dao->testerActiviteConnection(); |
} |
|
$fin = microtime(true); |
if($this->mode_verbeux) { |
echo "\n"; |
$fin = microtime(true); |
echo "-------------------------------------------------------------------\n"; |
echo " Fin du traitement, ".($fin - $debut)." secondes écoulées \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 modifierCodeInsee() { |
$this->dao->modifierCodeInsee(); |
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 chercherCodeCommune($projet, $latitude, $longitude) { |
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}"; |
|
119,14 → 157,15 |
$ch = curl_init($url_service); |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
$reponse = curl_exec($ch); |
$reponse = $this->traiterReponseServiceCommune($response); |
|
$infos_coord = $this->traiterReponseServiceCommune($reponse); |
curl_close($ch); |
|
return $code_insee; |
return $infos_coord; |
} |
|
private function traiterReponseServiceCommune($response) { |
$code_insee = ''; |
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)) { |
133,9 → 172,10 |
$reponse = $reponse[0]; |
} |
if (isset($reponse->codeINSEE)) { |
$code_insee = $reponse->codeINSEE; |
$retour = array('code_insee' => $reponse->codeINSEE, |
'nom' => $reponse->nom); |
} |
return $code_insee; |
return $retour; |
} |
|
private function testerCoordonneesWgsFrance($latitude, $longitude) { |
149,46 → 189,5 |
} |
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; |
} |
} |
?> |