1500 |
delphine |
1 |
<?php
|
|
|
2 |
// Encodage : UTF-8
|
|
|
3 |
// +-------------------------------------------------------------------------------------------------------------------+
|
|
|
4 |
/**
|
|
|
5 |
* Traitement des fichiers de la banque de données SOPHY pour insertion
|
|
|
6 |
*
|
|
|
7 |
* Description : classe permettant d'insérer les tableaux phytosociologiques de la banque de données SOPHY
|
|
|
8 |
* Utilisation : php script.php code -a codeInseeCommune
|
|
|
9 |
*
|
|
|
10 |
* @category PHP 5.3
|
|
|
11 |
* @package phytosocio
|
|
|
12 |
//Auteur original :
|
|
|
13 |
* @author Delphine CAUQUIL <delphine@tela-botanica.org>
|
|
|
14 |
* @copyright Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
|
|
|
15 |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
|
|
|
16 |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
|
|
|
17 |
* @version $Id$
|
|
|
18 |
*/
|
|
|
19 |
// +-------------------------------------------------------------------------------------------------------------------+
|
|
|
20 |
class Codeinseecommune extends Script {
|
|
|
21 |
|
|
|
22 |
protected $tableauTaxon;
|
|
|
23 |
protected $dao;
|
|
|
24 |
protected $observations;
|
|
|
25 |
// Paramêtres autorisées lors de l'appel au script en ligne de commande
|
|
|
26 |
protected $parametres_autorises = array(
|
|
|
27 |
'-n' => array(true, true, 'Nom du fichier ou du dossier à traiter'));
|
|
|
28 |
|
|
|
29 |
// +-------------------------------------------------------------------------------------------------------------------+
|
|
|
30 |
public function executer() {
|
|
|
31 |
include_once dirname(__FILE__).'/bibliotheque/Dao.php';
|
1520 |
aurelien |
32 |
|
1500 |
delphine |
33 |
$this->dao = new Dao();
|
|
|
34 |
// Récupération de paramétres
|
|
|
35 |
// Lancement de l'action demandée
|
|
|
36 |
$cmd = $this->getParametre('a');
|
|
|
37 |
switch ($cmd) {
|
|
|
38 |
case 'tout' :
|
1517 |
aurelien |
39 |
// à effectuer manuellement au premier lancement du script
|
1500 |
delphine |
40 |
$this->creerColonne();
|
|
|
41 |
$this->calculerCodeInsee();
|
1520 |
aurelien |
42 |
$this->modifierCodeInsee();
|
1500 |
delphine |
43 |
break;
|
1517 |
aurelien |
44 |
case 'sanscorrespondance' :
|
|
|
45 |
// devrait être être l'option utilisée dans le cron quotidien
|
|
|
46 |
$this->calculerCodeInseeSansCorrespondance();
|
1520 |
aurelien |
47 |
$this->modifierCodeInsee();
|
1517 |
aurelien |
48 |
break;
|
1500 |
delphine |
49 |
case 'colonne' :
|
|
|
50 |
$this->creerColonne();
|
|
|
51 |
break;
|
|
|
52 |
case 'calculer' :
|
|
|
53 |
$this->calculerCodeInsee();
|
|
|
54 |
break;
|
|
|
55 |
case 'modifier' :
|
|
|
56 |
$this->modifierCodeInsee();
|
|
|
57 |
break;
|
|
|
58 |
default :
|
|
|
59 |
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
|
|
|
60 |
}
|
|
|
61 |
}
|
|
|
62 |
|
|
|
63 |
// +-------------------------------------------------------------------------------------------------------------------+
|
|
|
64 |
|
|
|
65 |
private function creerColonne() {
|
|
|
66 |
$this->dao->creerColonneCodeInseeCalculee();
|
|
|
67 |
}
|
|
|
68 |
|
1517 |
aurelien |
69 |
private function calculerCodeInseeSansCorrespondance() {
|
|
|
70 |
$liste_coordonnees = $this->dao->rechercherCoordonneesSansCorrespondances();
|
|
|
71 |
$this->traiterCoordonnees($liste_coordonnees);
|
|
|
72 |
}
|
|
|
73 |
|
1515 |
delphine |
74 |
private function calculerCodeInsee() {
|
1500 |
delphine |
75 |
$liste_coordonnees = $this->dao->rechercherCoordonnees();
|
1517 |
aurelien |
76 |
$this->traiterCoordonnees($liste_coordonnees);
|
|
|
77 |
}
|
|
|
78 |
|
|
|
79 |
private function traiterCoordonnees($liste_coordonnees) {
|
|
|
80 |
echo "-------------------------------------------------------------------\n";
|
|
|
81 |
echo " Traitement et calcul des codes INSEE (".count($liste_coordonnees)." coordonnées en tout) ... \n";
|
|
|
82 |
echo "-------------------------------------------------------------------\n";
|
|
|
83 |
$debut = microtime(true);
|
|
|
84 |
$i = 0;
|
|
|
85 |
$total = count($liste_coordonnees);
|
1500 |
delphine |
86 |
foreach ($liste_coordonnees as $coordonnees) {
|
|
|
87 |
if ($this->testerCoordonneesWgsFrance($coordonnees['latitude'], $coordonnees['longitude'])) {
|
|
|
88 |
$code_insee = $this->chercherCodeCommune('osm', $coordonnees['latitude'], $coordonnees['longitude']);
|
|
|
89 |
if ($code_insee != "") {
|
|
|
90 |
$this->dao->ajouterCodeInseeCalculee($coordonnees['latitude'], $coordonnees['longitude'], $code_insee);
|
|
|
91 |
} else {
|
|
|
92 |
$code_insee = $this->chercherCodeCommune('lion1906', $coordonnees['latitude'], $coordonnees['longitude']);
|
|
|
93 |
if ($code_insee != "") {
|
|
|
94 |
$this->dao->ajouterCodeInseeCalculee($coordonnees['latitude'], $coordonnees['longitude'], $code_insee);
|
|
|
95 |
}
|
|
|
96 |
}
|
|
|
97 |
}
|
1517 |
aurelien |
98 |
$i++;
|
|
|
99 |
$this->afficherAvancement(' Lignes traitées ', $i);
|
1520 |
aurelien |
100 |
$this->dao->testerActiviteConnection();
|
1500 |
delphine |
101 |
}
|
1517 |
aurelien |
102 |
echo "\n";
|
|
|
103 |
$fin = microtime(true);
|
|
|
104 |
echo "-------------------------------------------------------------------\n";
|
|
|
105 |
echo " Fin du traitement, ".($fin - $debut)." secondes écoulées \n";
|
|
|
106 |
echo "-------------------------------------------------------------------\n";
|
|
|
107 |
echo "\n";
|
1500 |
delphine |
108 |
}
|
1520 |
aurelien |
109 |
|
1500 |
delphine |
110 |
private function modifierCodeInsee() {
|
|
|
111 |
$this->dao->modifierCodeInsee();
|
|
|
112 |
}
|
|
|
113 |
|
|
|
114 |
private function chercherCodeCommune($projet, $latitude, $longitude) {
|
|
|
115 |
$url_service = "www.tela-botanica.org/service:eflore:0.1/{$projet}/nom-commune".
|
|
|
116 |
"?lat={$latitude}&lon={$longitude}";
|
1517 |
aurelien |
117 |
|
1500 |
delphine |
118 |
$url_service = str_replace(',', '.', $url_service);
|
|
|
119 |
$ch = curl_init($url_service);
|
|
|
120 |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
|
121 |
$reponse = curl_exec($ch);
|
1518 |
aurelien |
122 |
$reponse = $this->traiterReponseServiceCommune($response);
|
|
|
123 |
curl_close($ch);
|
|
|
124 |
|
|
|
125 |
return $code_insee;
|
|
|
126 |
}
|
|
|
127 |
|
|
|
128 |
private function traiterReponseServiceCommune($response) {
|
|
|
129 |
$code_insee = '';
|
1500 |
delphine |
130 |
$reponse = json_decode($reponse);
|
1518 |
aurelien |
131 |
// cas du service lion 1906 qui peut renvoyer plusieurs communes (on prend la première)
|
|
|
132 |
if(is_array($reponse)) {
|
|
|
133 |
$reponse = $reponse[0];
|
|
|
134 |
}
|
1500 |
delphine |
135 |
if (isset($reponse->codeINSEE)) {
|
|
|
136 |
$code_insee = $reponse->codeINSEE;
|
|
|
137 |
}
|
|
|
138 |
return $code_insee;
|
|
|
139 |
}
|
|
|
140 |
|
|
|
141 |
private function testerCoordonneesWgsFrance($latitude, $longitude) {
|
|
|
142 |
$coord_france = false;
|
|
|
143 |
if ($latitude != '' && $longitude != '') {
|
|
|
144 |
if ($latitude < 51.071667 && $latitude > 41.316667) {
|
|
|
145 |
if ($longitude < 9.513333 && $longitude > -5.140278) {
|
|
|
146 |
$coord_france = true;
|
|
|
147 |
}
|
|
|
148 |
}
|
|
|
149 |
}
|
|
|
150 |
return $coord_france;
|
|
|
151 |
}
|
|
|
152 |
private function analyserCodeDeptComm($ligneDecoupe) {
|
|
|
153 |
if (preg_match('/^\d{2}$/', $ligneDecoupe['codeDept'])) {
|
|
|
154 |
} elseif (preg_match('/^\s{0,1}\d{1,2}\s{0,1}$/',$ligneDecoupe['codeDept'])) {
|
|
|
155 |
$ligneDecoupe['codeDept'] = str_replace(' ', '0', $ligneDecoupe['codeDept']);
|
|
|
156 |
} else {
|
|
|
157 |
$ligneDecoupe['codeDept'] = null;
|
|
|
158 |
}
|
|
|
159 |
if (preg_match('/^\d{3}$/', $ligneDecoupe['codeCommune'])) {
|
|
|
160 |
} elseif (preg_match('/^\s{0,2}\d{1,2,3}\s{0,2}$/', $ligneDecoupe['codeCommune'])) {
|
|
|
161 |
$ligneDecoupe['codeCommune'] = str_replace(' ', '0', $ligneDecoupe['codeCommune']);
|
|
|
162 |
} elseif ($ligneDecoupe['codeDept'] == null) {
|
|
|
163 |
$ligneDecoupe['codeCommune'] = null;
|
|
|
164 |
} else {
|
|
|
165 |
$ligneDecoupe['codeCommune'] = '000';
|
|
|
166 |
}
|
|
|
167 |
return $ligneDecoupe;
|
|
|
168 |
}
|
|
|
169 |
private function analyserCoordGrdParis($ligneDecoupe, $ligne) {
|
|
|
170 |
if (preg_match('/[\s0]0\.000/', $ligneDecoupe['latitude'], $match)) {
|
|
|
171 |
$ligneDecoupe['latitude'] = null;
|
|
|
172 |
$ligneDecoupe['longitude'] = null;
|
|
|
173 |
} elseif (preg_match('/\d{1,2}\.\d{2,3}/', $ligneDecoupe['latitude'], $match)) {// format souhaité
|
|
|
174 |
$ligneDecoupe['latitude_wgs'] = round($ligneDecoupe['latitude']*0.9, 7);
|
|
|
175 |
$ligneDecoupe['longitude_wgs'] = round($ligneDecoupe['longitude']*0.9+2.3372291, 7);
|
|
|
176 |
} elseif (preg_match('/(\d{2})[\d\s,](\d{3})/', $ligneDecoupe['latitude'], $match)) {//erreur de saisie
|
|
|
177 |
$ligneDecoupe['latitude'] = $match[1].'.'.$match[2];
|
|
|
178 |
$ligneDecoupe['latitude_wgs'] = round($ligneDecoupe['latitude']*0.9, 7);
|
|
|
179 |
$ligneDecoupe['longitude_wgs'] = round($ligneDecoupe['longitude']*0.9 + 2.3372291, 7);
|
|
|
180 |
} elseif (preg_match('/^[a-zA-Z\s]*[a-zA-Z][a-zA-Z\s]*$/', $ligneDecoupe['latitude'])) {// lat absente + nom long
|
|
|
181 |
$ligneDecoupe['nomStation'] = rtrim(substr($ligne, 10, 48));
|
|
|
182 |
$ligneDecoupe['latitude'] = null;
|
|
|
183 |
$ligneDecoupe['longitude'] = null;
|
|
|
184 |
} elseif (preg_match('/.[AO].123/', $ligneDecoupe['latitude'], $match)) {
|
|
|
185 |
$ligneDecoupe['latitude'] = null;
|
|
|
186 |
$ligneDecoupe['longitude'] = null;
|
|
|
187 |
} elseif ($ligneDecoupe['latitude'] != null) {
|
|
|
188 |
$ligneDecoupe['latitude'] = null;
|
|
|
189 |
$ligneDecoupe['longitude'] = null;
|
|
|
190 |
}
|
|
|
191 |
return $ligneDecoupe;
|
|
|
192 |
}
|
|
|
193 |
}
|
1518 |
aurelien |
194 |
?>
|