Subversion Repositories eFlore/Applications.cel

Rev

Rev 2523 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2523 Rev 2524
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 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 aux obs possédant des coordonnées mais pas de commune.
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_insee_commune -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_insee_commune -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_insee_commune -a sanscorrespondance</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_insee_commune -a calculer</code>
12
 *
12
 *
13
 * @category   CEL
13
 * @category   CEL
14
 * @package    Scripts
14
 * @package    Scripts
15
 * @subpackage Génération Images
15
 * @subpackage Génération Images
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>
17
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
18
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
18
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
19
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
19
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
20
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
20
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
21
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
21
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
22
 */
22
 */
23
include_once dirname(__FILE__).'/bibliotheque/Dao.php';
23
include_once dirname(__FILE__).'/bibliotheque/Dao.php';
24
 
24
 
25
class CodeInseeCommune extends Script {
25
class CodeInseeCommune extends Script {
26
 
26
 
27
	protected $tableauTaxon;
27
	protected $tableauTaxon;
28
	protected $dao;
28
	protected $dao;
29
	protected $observations;
29
	protected $observations;
30
	
30
	
31
	protected $url_service_geo_tpl;
31
	protected $url_service_geo_tpl;
32
 
32
 
33
	protected $mode_verbeux = false;
33
	protected $mode_verbeux = false;
34
 
34
 
35
	// Paramêtres autorisées lors de l'appel au script en ligne de commande
35
	// Paramêtres autorisées lors de l'appel au script en ligne de commande
36
	protected $parametres_autorises = array(
36
	protected $parametres_autorises = array(
37
		'-n' => array(true, true, 'Nom du fichier ou du dossier à traiter'));
37
		'-n' => array(true, true, 'Nom du fichier ou du dossier à traiter'));
38
 
38
 
39
	public function executer() {
39
	public function executer() {
40
		
40
		
41
		$this->url_service_geo_tpl = Config::get('urlZoneGeoTpl');
41
		$this->url_service_geo_tpl = Config::get('urlZoneGeoTpl');
42
 
42
 
43
		$this->dao = new Dao();
43
		$this->dao = new Dao();
44
		// Récupération de paramétres
44
		// Récupération de paramétres
45
		// Lancement de l'action demandée
45
		// Lancement de l'action demandée
46
		$cmd = $this->getParametre('a');
46
		$cmd = $this->getParametre('a');
47
		$this->mode_verbeux = $this->getParametre('v');
47
		$this->mode_verbeux = $this->getParametre('v');
48
 
48
 
49
		switch ($cmd) {
49
		switch ($cmd) {
50
			case 'tout' :
50
			case 'tout' :
51
				// à effectuer manuellement au premier lancement du script
51
				// à effectuer manuellement au premier lancement du script
52
				$this->creerColonne();
52
				$this->creerColonne();
53
				$this->calculerCodesInsee();
53
				$this->calculerCodesInsee();
54
				break;
54
				break;
55
			case 'colonne' :
55
			case 'colonne' :
56
				$this->creerColonne();
56
				$this->creerColonne();
57
				break;
57
				break;
58
			case 'sanscorrespondance' :
58
			case 'sanscorrespondance' :
59
				// devrait être être l'option utilisée dans le cron quotidien (avec l'option -v 0)
59
				// devrait être être l'option utilisée dans le cron quotidien (avec l'option -v 0)
60
				$this->calculerCodesInseeSansCorrespondance();
60
				$this->calculerCodesInseeSansCorrespondance();
61
				break;
61
				break;
62
			case 'sanscorrespondancedepuisledebut' :
62
			case 'sanscorrespondancedepuisledebut' :
63
				$this->calculerCodesInseeSansCorrespondance();
63
				$this->calculerCodesInseeSansCorrespondanceDepuisLeDebut();
64
				break;
64
				break;
65
			case 'calculer' :
65
			case 'calculer' :
66
				$this->calculerCodesInsee();
66
				$this->calculerCodesInsee();
67
				break;
67
				break;
68
			default :
68
			default :
69
				$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
69
				$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
70
		}
70
		}
71
	}
71
	}
72
 
72
 
73
	private function creerColonne() {
73
	private function creerColonne() {
74
		$this->dao->creerColonneCodeInseeCalcule();
74
		$this->dao->creerColonneCodeInseeCalcule();
75
	}
75
	}
76
 
76
 
77
	private function calculerCodesInseeSansCorrespondance() {
77
	private function calculerCodesInseeSansCorrespondance() {
78
		$liste_coordonnees = $this->dao->rechercherCoordonneesSansCorrespondances();
78
		$liste_coordonnees = $this->dao->rechercherCoordonneesSansCorrespondances();
79
		$this->traiterCoordonnees($liste_coordonnees);
79
		$this->traiterCoordonnees($liste_coordonnees);
80
	}
80
	}
81
	
81
	
82
	private function calculerCodesInseeSansCorrespondanceDepuisLeDebut() {
82
	private function calculerCodesInseeSansCorrespondanceDepuisLeDebut() {
83
		$liste_coordonnees = $this->dao->calculerCodesInseeSansCorrespondanceDepuisLeDebut();
83
		$liste_coordonnees = $this->dao->rechercherCoordonneesSansCorrespondanceDepuisLeDebut();
84
		$this->traiterCoordonnees($liste_coordonnees);
84
		$this->traiterCoordonnees($liste_coordonnees);
85
	}
85
	}
86
 
86
 
87
	private function calculerCodesInsee() {
87
	private function calculerCodesInsee() {
88
		$liste_coordonnees = $this->dao->rechercherCoordonnees();
88
		$liste_coordonnees = $this->dao->rechercherCoordonnees();
89
		$this->traiterCoordonnees($liste_coordonnees);
89
		$this->traiterCoordonnees($liste_coordonnees);
90
	}
90
	}
91
 
91
 
92
	private function traiterCoordonnees($liste_coordonnees) {
92
	private function traiterCoordonnees($liste_coordonnees) {
93
		$debut = microtime(true);
93
		$debut = microtime(true);
94
		$nb_coordonnees_modifiees = 0;
94
		$nb_coordonnees_modifiees = 0;
95
		$nb_coordonnees_ignorees = 0;
95
		$nb_coordonnees_ignorees = 0;
96
		$total = count($liste_coordonnees);
96
		$total = count($liste_coordonnees);
97
 
97
 
98
		if ($this->mode_verbeux) {
98
		if ($this->mode_verbeux) {
99
			echo "-------------------------------------------------------------------\n";
99
			echo "-------------------------------------------------------------------\n";
100
			echo "  Calcul des codes INSEE et modification (".count($liste_coordonnees)." coordonnées en tout) ... \n";
100
			echo "  Calcul des codes INSEE et modification (".count($liste_coordonnees)." coordonnées en tout) ... \n";
101
			echo "  Enrichissement des champs zone geo et ce_zone_geo vides ... \n";
101
			echo "  Enrichissement des champs zone geo et ce_zone_geo vides ... \n";
102
			echo "-------------------------------------------------------------------\n";
102
			echo "-------------------------------------------------------------------\n";
103
		}
103
		}
104
 
104
 
105
		foreach ($liste_coordonnees as $coordonnees) {
105
		foreach ($liste_coordonnees as $coordonnees) {
106
			$infos_coord = $this->obtenirInfosPourCoordonnees($coordonnees);
106
			$infos_coord = $this->obtenirInfosPourCoordonnees($coordonnees);
107
			if ($infos_coord != null) {
107
			if ($infos_coord != null) {
108
				$coordonnee_a_traiter = array(
108
				$coordonnee_a_traiter = array(
109
					'latitude' => $coordonnees['latitude'],
109
					'latitude' => $coordonnees['latitude'],
110
					'longitude' => $coordonnees['longitude'],
110
					'longitude' => $coordonnees['longitude'],
111
					'code_insee' => $infos_coord['code_insee'],
111
					'code_insee' => $infos_coord['code_insee'],
112
					'nom' => $infos_coord['nom']
112
					'nom' => $infos_coord['nom']
113
				);
113
				);
114
				$this->modifierInformationsGeo($coordonnee_a_traiter);
114
				$this->modifierInformationsGeo($coordonnee_a_traiter);
115
				$nb_coordonnees_modifiees++;
115
				$nb_coordonnees_modifiees++;
116
			} else {
116
			} else {
117
				$nb_coordonnees_ignorees++;
117
				$nb_coordonnees_ignorees++;
118
			}
118
			}
119
			if ($this->mode_verbeux) {
119
			if ($this->mode_verbeux) {
120
				$this->afficherAvancement('  Coordonnées traitées ', $nb_coordonnees_modifiees);
120
				$this->afficherAvancement('  Coordonnées traitées ', $nb_coordonnees_modifiees);
121
			}
121
			}
122
		}
122
		}
123
 
123
 
124
		$fin = microtime(true);
124
		$fin = microtime(true);
125
		if ($this->mode_verbeux) {
125
		if ($this->mode_verbeux) {
126
			echo "\n";
126
			echo "\n";
127
			echo "-------------------------------------------------------------------\n";
127
			echo "-------------------------------------------------------------------\n";
128
			echo "  Fin de la mise à jour des codes INSEE calculés et de l'enrichissement, \n";
128
			echo "  Fin de la mise à jour des codes INSEE calculés et de l'enrichissement, \n";
129
			echo "  ".($fin - $debut)." secondes écoulées \n";
129
			echo "  ".($fin - $debut)." secondes écoulées \n";
130
			echo "  ".$nb_coordonnees_modifiees." code insee calculés et modifiés \n";
130
			echo "  ".$nb_coordonnees_modifiees." code insee calculés et modifiés \n";
131
			echo "  ".$nb_coordonnees_ignorees." coordonnées ignorées \n";
131
			echo "  ".$nb_coordonnees_ignorees." coordonnées ignorées \n";
132
			echo "-------------------------------------------------------------------\n";
132
			echo "-------------------------------------------------------------------\n";
133
			echo "\n";
133
			echo "\n";
134
		}
134
		}
135
	}
135
	}
136
 
136
 
137
	private function obtenirInfosPourCoordonnees($coordonnees) {
137
	private function obtenirInfosPourCoordonnees($coordonnees) {
138
		$infos_coord = null;
138
		$infos_coord = null;
139
		if ($this->testerCoordonneesWgsFrance($coordonnees['latitude'], $coordonnees['longitude'])) {
139
		if ($this->testerCoordonneesWgsFrance($coordonnees['latitude'], $coordonnees['longitude'])) {
140
			$infos_coord = $this->chercherInfosCommune('osm', $coordonnees['latitude'], $coordonnees['longitude']);
140
			$infos_coord = $this->chercherInfosCommune('osm', $coordonnees['latitude'], $coordonnees['longitude']);
141
			if ($infos_coord == null) {
141
			if ($infos_coord == null) {
142
				$infos_coord = $this->chercherInfosCommune('lion1906', $coordonnees['latitude'], $coordonnees['longitude']);
142
				$infos_coord = $this->chercherInfosCommune('lion1906', $coordonnees['latitude'], $coordonnees['longitude']);
143
			}
143
			}
144
		}
144
		}
145
		return $infos_coord;
145
		return $infos_coord;
146
	}
146
	}
147
 
147
 
148
	private function modifierInformationsGeo($coordonnee_a_traiter) {
148
	private function modifierInformationsGeo($coordonnee_a_traiter) {
149
		$this->modifierCodeInseeCalculePourCoordonnees($coordonnee_a_traiter);
149
		$this->modifierCodeInseeCalculePourCoordonnees($coordonnee_a_traiter);
150
		$this->modifierCodeInseeEtZoneGeo($coordonnee_a_traiter);
150
		$this->modifierCodeInseeEtZoneGeo($coordonnee_a_traiter);
151
	}
151
	}
152
 
152
 
153
	private function modifierCodeInseeCalculePourCoordonnees($coordonnee_a_traiter) {
153
	private function modifierCodeInseeCalculePourCoordonnees($coordonnee_a_traiter) {
154
		$this->dao->testerActiviteConnection();
154
		$this->dao->testerActiviteConnection();
155
		$this->dao->ajouterCodeInseeCalcule($coordonnee_a_traiter['latitude'], $coordonnee_a_traiter['longitude'], $coordonnee_a_traiter['code_insee']);
155
		$this->dao->ajouterCodeInseeCalcule($coordonnee_a_traiter['latitude'], $coordonnee_a_traiter['longitude'], $coordonnee_a_traiter['code_insee']);
156
	}
156
	}
157
 
157
 
158
	private function modifierCodeInseeEtZoneGeo($coordonnee_a_traiter) {
158
	private function modifierCodeInseeEtZoneGeo($coordonnee_a_traiter) {
159
		$this->dao->testerActiviteConnection();
159
		$this->dao->testerActiviteConnection();
160
		$this->dao->modifierCodeInseeEtZoneGeo($coordonnee_a_traiter);
160
		$this->dao->modifierCodeInseeEtZoneGeo($coordonnee_a_traiter);
161
	}
161
	}
162
 
162
 
163
	private function chercherInfosCommune($projet, $latitude, $longitude) {
163
	private function chercherInfosCommune($projet, $latitude, $longitude) {
164
		
164
		
165
		$noms_params = array('{projet}', '{latitude}', '{longitude}');
165
		$noms_params = array('{projet}', '{latitude}', '{longitude}');
166
		$valeurs_params = array($projet, $latitude, $longitude);
166
		$valeurs_params = array($projet, $latitude, $longitude);
167
		
167
		
168
		$url_service = str_replace($noms_params, $valeurs_params, $this->url_service_geo_tpl);
168
		$url_service = str_replace($noms_params, $valeurs_params, $this->url_service_geo_tpl);
169
		$url_service = str_replace(',', '.', $url_service);
169
		$url_service = str_replace(',', '.', $url_service);
170
 
170
 
171
		$ch = curl_init($url_service);
171
		$ch = curl_init($url_service);
172
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
172
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
173
		$reponse = curl_exec($ch);
173
		$reponse = curl_exec($ch);
174
 
174
 
175
		$infos_coord = $this->traiterReponseServiceCommune($reponse);
175
		$infos_coord = $this->traiterReponseServiceCommune($reponse);
176
		curl_close($ch);
176
		curl_close($ch);
177
 
177
 
178
		return $infos_coord;
178
		return $infos_coord;
179
	}
179
	}
180
 
180
 
181
	private function traiterReponseServiceCommune($reponse) {
181
	private function traiterReponseServiceCommune($reponse) {
182
		$retour = null;
182
		$retour = null;
183
		$reponse = json_decode($reponse);
183
		$reponse = json_decode($reponse);
184
		// cas du service lion 1906 qui peut renvoyer plusieurs communes (on prend la première)
184
		// cas du service lion 1906 qui peut renvoyer plusieurs communes (on prend la première)
185
		if (is_array($reponse)) {
185
		if (is_array($reponse)) {
186
			$reponse = $reponse[0];
186
			$reponse = $reponse[0];
187
		}
187
		}
188
		if (isset($reponse->codeINSEE)) {
188
		if (isset($reponse->codeINSEE)) {
189
			$retour = array('code_insee' => $reponse->codeINSEE,
189
			$retour = array('code_insee' => $reponse->codeINSEE,
190
							'nom' => $reponse->nom);
190
							'nom' => $reponse->nom);
191
		}
191
		}
192
		return $retour;
192
		return $retour;
193
	}
193
	}
194
 
194
 
195
	private function testerCoordonneesWgsFrance($latitude, $longitude) {
195
	private function testerCoordonneesWgsFrance($latitude, $longitude) {
196
		$coord_france = false;
196
		$coord_france = false;
197
		if ($latitude != '' && $longitude != '') {
197
		if ($latitude != '' && $longitude != '') {
198
			if ($latitude < 51.071667 && $latitude > 41.316667) {
198
			if ($latitude < 51.071667 && $latitude > 41.316667) {
199
				if ($longitude < 9.513333 && $longitude > -5.140278) {
199
				if ($longitude < 9.513333 && $longitude > -5.140278) {
200
					$coord_france = true;
200
					$coord_france = true;
201
				}
201
				}
202
			}
202
			}
203
		}
203
		}
204
		return $coord_france;
204
		return $coord_france;
205
	}
205
	}
206
}
206
}