Subversion Repositories eFlore/Applications.cel

Rev

Rev 2414 | Rev 2536 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2414 Rev 2533
Line 1... Line 1...
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Traitement des codes INSEE de la base de données CEL
4
 * Traitement des codes INSEE et des codes pays de la base de données CEL
5
 * Permet d'affecter des codes INSEE aux obs possédant des coordonnées mais pas de commune.
5
 * Permet d'affecter des codes INSEE et des codes pays aux obs possédant des coordonnées mais pas de commune ou de pays.
6
 *
6
 *
7
 * Utilisation :
7
 * Utilisation :
8
 * - Pour ? : <code>/opt/lamp/bin/php cli.php code_insee_commune -a tout</code>
8
 * - Pour ? : <code>/opt/lamp/bin/php cli.php code_zone_geo -a tout</code>
9
 * - Pour ? : <code>/opt/lamp/bin/php cli.php code_insee_commune -a colonne</code>
9
 * - Pour ? : <code>/opt/lamp/bin/php cli.php code_zone_geo -a colonne</code>
10
 * - Pour ? : <code>/opt/lamp/bin/php cli.php code_insee_commune -a sanscorrespondance</code>
10
 * - Pour ? : <code>/opt/lamp/bin/php cli.php code_zone_geo -a payssanscorrespondance</code>
11
 * - Pour ? : <code>/opt/lamp/bin/php cli.php code_insee_commune -a calculer</code>
11
 * - Pour ? : <code>/opt/lamp/bin/php cli.php code_zone_geo -a codeinseesanscorrespondance</code>
12
 *
12
 *
13
 * @category   CEL
13
 * @category   CEL
14
 * @package    Scripts
14
 * @package    Scripts
15
 * @subpackage Génération Images
15
 * @subpackage Zones Geo
16
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
16
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
17
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
-
 
18
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
17
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
19
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
18
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
20
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
19
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
21
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
20
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
22
 */
21
 */
23
include_once dirname(__FILE__).'/bibliotheque/Dao.php';
22
include_once dirname(__FILE__).'/bibliotheque/Dao.php';
Line 24... Line 23...
24
 
23
 
Line 25... Line 24...
25
class CodeInseeCommune extends Script {
24
class CodeZoneGeo extends Script {
26
 
25
 
27
	protected $tableauTaxon;
26
	protected $tableauTaxon;
-
 
27
	protected $dao;
-
 
28
	protected $observations;
-
 
29
	
Line 28... Line 30...
28
	protected $dao;
30
	protected $url_service_geo_tpl;
Line 29... Line 31...
29
	protected $observations;
31
	protected $url_service_pays_tpl;
30
 
32
 
31
	protected $mode_verbeux = false;
33
	protected $mode_verbeux = false;
Line 32... Line 34...
32
 
34
 
-
 
35
	// Paramêtres autorisées lors de l'appel au script en ligne de commande
-
 
36
	protected $parametres_autorises = array(
-
 
37
		'-n' => array(true, true, 'Nom du fichier ou du dossier à traiter'));
Line 33... Line 38...
33
	// Paramêtres autorisées lors de l'appel au script en ligne de commande
38
 
34
	protected $parametres_autorises = array(
39
	public function executer() {
35
		'-n' => array(true, true, 'Nom du fichier ou du dossier à traiter'));
40
		
36
 
41
		$this->url_service_geo_tpl = Config::get('urlZoneGeoTpl');
Line 44... Line 49...
44
 
49
 
45
		switch ($cmd) {
50
		switch ($cmd) {
46
			case 'tout' :
51
			case 'tout' :
47
				// à effectuer manuellement au premier lancement du script
52
				// à effectuer manuellement au premier lancement du script
48
				$this->creerColonne();
53
				$this->creerColonne();
49
				$this->calculerCodesInsee();
54
				$this->calculerToutSansCorrespondanceDepuisLeDebut();
50
				break;
55
				break;
51
			case 'colonne' :
56
			case 'colonne' :
52
				$this->creerColonne();
57
				$this->creerColonne();
53
				break;
58
				break;
54
			case 'sanscorrespondance' :
-
 
55
				// devrait être être l'option utilisée dans le cron quotidien (avec l'option -v 0)
59
			case 'codeinseesanscorrespondance' :
56
				$this->calculerCodesInseeSansCorrespondance();
60
				$this->calculerCodesInseeSansCorrespondance();
-
 
61
				break;
-
 
62
			case 'codeinseesanscorrespondancedepuisledebut' :
-
 
63
				$this->calculerCodesInseeSansCorrespondanceDepuisLeDebut();
57
				break;
64
				break;
-
 
65
			case 'payssanscorrespondance' :
-
 
66
				$this->calculerPaysSansCorrespondance();
-
 
67
				break;	
-
 
68
			case 'payssanscorrespondancedepuisledebut' :
-
 
69
				$this->calculerPaysSansCorrespondanceDepuisLeDebut();
-
 
70
				break;
-
 
71
			case 'toutsanscorrespondance' :
58
			case 'calculer' :
72
				// devrait être être l'option utilisée dans le cron quotidien (avec l'option -v 0)
-
 
73
				$this->calculerToutSansCorrespondance();
-
 
74
				break;
-
 
75
			case 'toutsanscorrespondancedepuisLeDebut' :
59
				$this->calculerCodesInsee();
76
				$this->calculerToutSansCorrespondanceDepuisLeDebut();
60
				break;
77
				break;
61
			default :
78
			default :
62
				$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
79
				$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
63
		}
80
		}
Line 64... Line 81...
64
	}
81
	}
65
 
82
 
66
	private function creerColonne() {
83
	protected function creerColonne() {
Line 67... Line 84...
67
		$this->dao->creerColonneCodeInseeCalcule();
84
		$this->dao->creerColonneCodeInseeCalcule();
68
	}
85
	}
-
 
86
 
-
 
87
	protected function calculerCodesInseeSansCorrespondance() {
-
 
88
		$liste_coordonnees = $this->dao->rechercherCoordonneesFrancaisesSansCorrespondances();
-
 
89
		$this->traiterCoordonnees($liste_coordonnees);
-
 
90
	}
-
 
91
	
-
 
92
	protected function calculerCodesInseeSansCorrespondanceDepuisLeDebut() {
-
 
93
		$liste_coordonnees = $this->dao->rechercherCoordonneesFrancaisesSansCorrespondanceDepuisLeDebut();
-
 
94
		$this->traiterCoordonnees($liste_coordonnees);
-
 
95
	}
-
 
96
	
-
 
97
	protected function calculerPaysSansCorrespondance() {
-
 
98
		$liste_coordonnees = $this->dao->rechercherPaysSansCorrespondance();
-
 
99
		$this->traiterCoordonnees($liste_coordonnees);
-
 
100
	}
-
 
101
	
-
 
102
	protected function calculerPaysSansCorrespondanceDepuisLeDebut() {
-
 
103
		$liste_coordonnees = $this->dao->rechercherPaysSansCorrespondanceDepuisLeDebut();
-
 
104
		$this->traiterCoordonnees($liste_coordonnees);
-
 
105
	}
69
 
106
	
70
	private function calculerCodesInseeSansCorrespondance() {
107
	protected function calculerToutSansCorrespondance() {
Line 71... Line 108...
71
		$liste_coordonnees = $this->dao->rechercherCoordonneesSansCorrespondances();
108
		$liste_coordonnees = $this->dao->rechercherToutSansCorrespondance();
72
		$this->traiterCoordonnees($liste_coordonnees);
109
		$this->traiterCoordonnees($liste_coordonnees);
73
	}
110
	}
74
 
111
 
Line 75... Line 112...
75
	private function calculerCodesInsee() {
112
	protected function calculerToutSansCorrespondanceDepuisLeDebut() {
76
		$liste_coordonnees = $this->dao->rechercherCoordonnees();
113
		$liste_coordonnees = $this->dao->rechercherSansCorrespondanceDepuisLeDebut();
Line 83... Line 120...
83
		$nb_coordonnees_ignorees = 0;
120
		$nb_coordonnees_ignorees = 0;
84
		$total = count($liste_coordonnees);
121
		$total = count($liste_coordonnees);
Line 85... Line 122...
85
 
122
 
86
		if ($this->mode_verbeux) {
123
		if ($this->mode_verbeux) {
87
			echo "-------------------------------------------------------------------\n";
124
			echo "-------------------------------------------------------------------\n";
88
			echo "  Calcul des codes INSEE et modification (".count($liste_coordonnees)." coordonnées en tout) ... \n";
125
			echo "  Calcul des codes INSEE, du code pays et modification (".count($liste_coordonnees)." coordonnées en tout) ... \n";
89
			echo "  Enrichissement des champs zone geo et ce_zone_geo vides ... \n";
126
			echo "  Enrichissement des champs zone geo et ce_zone_geo vides ... \n";
90
			echo "-------------------------------------------------------------------\n";
127
			echo "-------------------------------------------------------------------\n";
Line 91... Line 128...
91
		}
128
		}
92
 
129
 
93
		foreach ($liste_coordonnees as $coordonnees) {
130
		foreach ($liste_coordonnees as $coordonnees) {
-
 
131
			$infos_coord = $this->obtenirInfosPourCoordonnees($coordonnees);
-
 
132
			if ($infos_coord != null) {
-
 
133
				// Le type renvoyé permet de connaitre ce qu'on peut modifier
94
			$infos_coord = $this->obtenirInfosPourCoordonnees($coordonnees);
134
				if($infos_coord['type'] == 'france') {
95
			if ($infos_coord != null) {
135
					// Cas d'une commune française
96
				$coordonnee_a_traiter = array(
136
					$coordonnee_a_traiter = array(
97
					'latitude' => $coordonnees['latitude'],
137
						'latitude' => $coordonnees['latitude'],
98
					'longitude' => $coordonnees['longitude'],
138
						'longitude' => $coordonnees['longitude'],
99
					'code_insee' => $infos_coord['code_insee'],
139
						'code_insee' => $infos_coord['code_insee'],
100
					'nom' => $infos_coord['nom']
140
						'nom' => $infos_coord['nom']
-
 
141
					);
-
 
142
					$this->dao->modifierCodeInseeEtZoneGeo($coordonnee_a_traiter);
-
 
143
				} else if($infos_coord['type'] == 'pays') {
-
 
144
					// Cas d'un lieu à l'étranger
-
 
145
					$coordonnee_a_traiter = array(
-
 
146
							'latitude' => $coordonnees['latitude'],
-
 
147
							'longitude' => $coordonnees['longitude'],
-
 
148
							'code_pays' => $infos_coord['code_pays'],
-
 
149
							'nom' => $infos_coord['nom']
-
 
150
					);
101
				);
151
					$this->dao->modifierPays($coordonnee_a_traiter);
102
				$this->modifierInformationsGeo($coordonnee_a_traiter);
152
				}
103
				$nb_coordonnees_modifiees++;
153
				$nb_coordonnees_modifiees++;
104
			} else {
154
			} else {
105
				$nb_coordonnees_ignorees++;
155
				$nb_coordonnees_ignorees++;
Line 111... Line 161...
111
 
161
 
112
		$fin = microtime(true);
162
		$fin = microtime(true);
113
		if ($this->mode_verbeux) {
163
		if ($this->mode_verbeux) {
114
			echo "\n";
164
			echo "\n";
115
			echo "-------------------------------------------------------------------\n";
165
			echo "-------------------------------------------------------------------\n";
116
			echo "  Fin de la mise à jour des codes INSEE calculés et de l'enrichissement, \n";
166
			echo "  Fin de la mise à jour des codes INSEE calculés, du pays et de l'enrichissement, \n";
117
			echo "  ".($fin - $debut)." secondes écoulées \n";
167
			echo "  ".($fin - $debut)." secondes écoulées \n";
118
			echo "  ".$nb_coordonnees_modifiees." code insee calculés et modifiés \n";
168
			echo "  ".$nb_coordonnees_modifiees." code insee calculés et modifiés \n";
119
			echo "  ".$nb_coordonnees_ignorees." coordonnées ignorées \n";
169
			echo "  ".$nb_coordonnees_ignorees." coordonnées ignorées \n";
120
			echo "-------------------------------------------------------------------\n";
170
			echo "-------------------------------------------------------------------\n";
121
			echo "\n";
171
			echo "\n";
122
		}
172
		}
Line 123... Line 173...
123
	}
173
	}
124
 
174
 
-
 
175
	private function obtenirInfosPourCoordonnees($coordonnees) {
-
 
176
		$infos_coord = null;
125
	private function obtenirInfosPourCoordonnees($coordonnees) {
177
		// Test facile qui permet d'abord de tenter une localisation bien plus rapide si les coordonnées 
126
		$infos_coord = null;
178
		// sont dans la bounding box approximative de la France
127
		if ($this->testerCoordonneesWgsFrance($coordonnees['latitude'], $coordonnees['longitude'])) {
179
		if($this->testerCoordonneesWgsFrance($coordonnees['latitude'], $coordonnees['longitude'])) {
-
 
180
			$infos_coord = $this->chercherInfosCommune('osm', $coordonnees['latitude'], $coordonnees['longitude']);
128
			$infos_coord = $this->chercherInfosCommune('osm', $coordonnees['latitude'], $coordonnees['longitude']);
181
			if ($infos_coord == null) {
129
			if ($infos_coord == null) {
182
				// Sinon recherche par pays
-
 
183
				$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
-
 
184
			}
-
 
185
		} else {
130
				$infos_coord = $this->chercherInfosCommune('lion1906', $coordonnees['latitude'], $coordonnees['longitude']);
186
			// Recherche par pays immédiate si en dehors de la bouding box française
131
			}
187
			$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
132
		}
188
		}
Line 133... Line -...
133
		return $infos_coord;
-
 
134
	}
-
 
135
 
-
 
136
	private function modifierInformationsGeo($coordonnee_a_traiter) {
-
 
137
		$this->modifierCodeInseeCalculePourCoordonnees($coordonnee_a_traiter);
-
 
138
		$this->modifierCodeInseeEtZoneGeo($coordonnee_a_traiter);
-
 
139
	}
-
 
140
 
-
 
141
	private function modifierCodeInseeCalculePourCoordonnees($coordonnee_a_traiter) {
-
 
142
		$this->dao->testerActiviteConnection();
-
 
143
		$this->dao->ajouterCodeInseeCalcule($coordonnee_a_traiter['latitude'], $coordonnee_a_traiter['longitude'], $coordonnee_a_traiter['code_insee']);
-
 
144
	}
-
 
145
 
-
 
146
	private function modifierCodeInseeEtZoneGeo($coordonnee_a_traiter) {
-
 
147
		$this->dao->testerActiviteConnection();
-
 
148
		$this->dao->modifierCodeInseeEtZoneGeo($coordonnee_a_traiter);
189
		return $infos_coord;
-
 
190
	}
149
	}
191
 
150
 
192
	private function chercherInfosCommune($projet, $latitude, $longitude) {
151
	private function chercherInfosCommune($projet, $latitude, $longitude) {
193
		
-
 
194
		$noms_params = array('{projet}', '{latitude}', '{longitude}');
152
		$url_service = "www.tela-botanica.org/service:eflore:0.1/{$projet}/nom-commune".
195
		$valeurs_params = array($projet, $latitude, $longitude);
-
 
196
		
153
			"?lat={$latitude}&lon={$longitude}";
197
		$url_service = str_replace($noms_params, $valeurs_params, $this->url_service_geo_tpl);
154
 
198
		$url_service = str_replace(',', '.', $url_service);
155
		$url_service = str_replace(',', '.', $url_service);
199
 
Line 156... Line 200...
156
		$ch = curl_init($url_service);
200
		$ch = curl_init($url_service);
157
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
201
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
Line 158... Line 202...
158
		$reponse = curl_exec($ch);
202
		$reponse = curl_exec($ch);
159
 
203
 
-
 
204
		$infos_coord = $this->traiterReponseServiceCommune($reponse);
-
 
205
		curl_close($ch);
-
 
206
 
-
 
207
		return $infos_coord;
-
 
208
	}
-
 
209
	
-
 
210
	private function chercherInfosPays($latitude, $longitude) {
-
 
211
		$noms_params = array('{latitude}', '{longitude}');
-
 
212
		$valeurs_params = array($latitude, $longitude);
-
 
213
		$url_service = str_replace($noms_params, $valeurs_params, $this->url_service_pays_tpl);
-
 
214
		$url_service = str_replace(',', '.', $url_service);
-
 
215
 
-
 
216
		$ch = curl_init($url_service);
-
 
217
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-
 
218
		$reponse = curl_exec($ch);
-
 
219
		
-
 
220
		$res = json_decode($reponse, true);
-
 
221
		$retour = null;
-
 
222
		
-
 
223
		if(!empty($res)) {
-
 
224
			// Cas où l'on a recherché des coordonnées en France
-
 
225
			// On en profite pour remplir plus de données
-
 
226
			// que le simple pays si elles sont présentes
-
 
227
			if(isset($res[8]) && isset($res[8]['codeInsee'])) {
-
 
228
				$retour = array(
-
 
229
					'code_insee' => $res[8]['codeInsee'],
-
 
230
					'nom' => $res[8]['intitule'],
-
 
231
					'type' => 'france'
-
 
232
				);
-
 
233
			} else {
-
 
234
				// Cas de la recherche en dehors de France
-
 
235
				// La zone de plus haut niveau est toujours un pays 
-
 
236
				// (car le niveau de zone est limité à 2)
-
 
237
				$infos_pays = $res[min(array_keys($res))];
-
 
238
				// La zone de niveau le plus bas est la "localité"
-
 
239
				// la plus précise qu'on a pu trouver
-
 
240
				$infos_localite = $res[max(array_keys($res))];
-
 
241
	
-
 
242
				// Cas où l'on a trouvé un code pays
-
 
243
				if(!empty($infos_pays['codeIso31661'])) {
-
 
244
					$retour = array(
-
 
245
						'code_pays' => $infos_pays['codeIso31661'], 
-
 
246
						'nom' => ''
-
 
247
					);
-
 
248
				} elseif(!empty($infos_pays['codeIso31662'])) {
-
 
249
					// Quelquefois la zone de plus haut niveau est une région ou une province
-
 
250
					// heureusement son code est de forme XX-YY ou XX est le code iso du pays !
-
 
251
					$retour = array(
-
 
252
						'code_pays' => substr($infos_pays['codeIso31662'], 0, 2), 
-
 
253
						'nom' => ''
-
 
254
					);
-
 
255
				}
-
 
256
				
-
 
257
				// Pas de sens de prendre un nom de localité si on a pas de pays
-
 
258
				if(!empty($retour['code_pays'])) {
-
 
259
					// Type sert à savoir quelle fonction de mise à jour on appellera
-
 
260
					$retour['type'] = 'pays';
-
 
261
					$retour['nom'] = $infos_localite['intitule'];
Line 160... Line 262...
160
		$infos_coord = $this->traiterReponseServiceCommune($reponse);
262
				}
161
		curl_close($ch);
263
			}
162
 
264
		}
163
		return $infos_coord;
265
		return $retour;
164
	}
266
	}
165
 
267
 
166
	private function traiterReponseServiceCommune($reponse) {
268
	private function traiterReponseServiceCommune($reponse) {
167
		$retour = null;
269
		$retour = null;
-
 
270
		$reponse = json_decode($reponse);
168
		$reponse = json_decode($reponse);
271
		// cas du service lion 1906 qui peut renvoyer plusieurs communes (on prend la première)
169
		// cas du service lion 1906 qui peut renvoyer plusieurs communes (on prend la première)
272
		if (is_array($reponse)) {
-
 
273
			$reponse = $reponse[0];
170
		if (is_array($reponse)) {
274
		}
171
			$reponse = $reponse[0];
275
		if (isset($reponse->codeINSEE)) {
172
		}
276
			// Type sert à savoir quelle fonction de mise à jour on appellera
173
		if (isset($reponse->codeINSEE)) {
277
			$retour = array('code_insee' => $reponse->codeINSEE,
174
			$retour = array('code_insee' => $reponse->codeINSEE,
278
							'nom' => $reponse->nom,
175
							'nom' => $reponse->nom);
279
							'type' => 'france');
176
		}
280
		}
177
		return $retour;
281
		return $retour;
178
	}
282
	}
179
 
283
	
180
	private function testerCoordonneesWgsFrance($latitude, $longitude) {
284
	private function testerCoordonneesWgsFrance($latitude, $longitude) {
181
		$coord_france = false;
285
		$coord_france = false;
182
		if ($latitude != '' && $longitude != '') {
286
		if ($latitude != '' && $longitude != '') {
183
			if ($latitude < 51.071667 && $latitude > 41.316667) {
287
			if ($latitude < 51.071667 && $latitude > 41.316667) {
184
				if ($longitude < 9.513333 && $longitude > -5.140278) {
288
				if ($longitude < 9.513333 && $longitude > -5.140278) {
185
					$coord_france = true;
289
					$coord_france = true;
186
				}
290
				}