Subversion Repositories eFlore/Applications.cel

Rev

Rev 2414 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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