Subversion Repositories eFlore/Applications.cel

Rev

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