Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
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
 
31
// +-------------------------------------------------------------------------------------------------------------------+
32
	public function executer() {
33
		include_once dirname(__FILE__).'/bibliotheque/Dao.php';
34
 
35
 
36
		$this->dao = new Dao();
37
		// Récupération de paramétres
38
		// Lancement de l'action demandée
39
		$cmd = $this->getParametre('a');
40
		switch ($cmd) {
41
			case 'tout' :
1517 aurelien 42
				// à effectuer manuellement au premier lancement du script
1500 delphine 43
				$this->creerColonne();
44
				$this->calculerCodeInsee();
1517 aurelien 45
				// modifierCodeInsee semble poser problème sur le serveur après beaucoup de requetes
46
				//$this->modifierCodeInsee();
1500 delphine 47
				break;
1517 aurelien 48
			case 'sanscorrespondance' :
49
				// devrait être être l'option utilisée dans le cron quotidien
50
				$this->calculerCodeInseeSansCorrespondance();
51
				// modifierCodeInsee semble poser problème sur le serveur après beaucoup de requetes
52
				//$this->modifierCodeInsee();
53
			break;
1500 delphine 54
			case 'colonne' :
55
				$this->creerColonne();
56
				break;
57
			case 'calculer' :
58
				$this->calculerCodeInsee();
59
				break;
60
			case 'modifier' :
61
				$this->modifierCodeInsee();
62
				break;
63
			default :
64
				$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
65
		}
66
	}
67
 
68
// +-------------------------------------------------------------------------------------------------------------------+
69
 
70
	private function creerColonne() {
71
		$this->dao->creerColonneCodeInseeCalculee();
72
	}
73
 
1517 aurelien 74
	private function calculerCodeInseeSansCorrespondance() {
75
		$liste_coordonnees = $this->dao->rechercherCoordonneesSansCorrespondances();
76
		$this->traiterCoordonnees($liste_coordonnees);
77
	}
78
 
1515 delphine 79
	private function calculerCodeInsee() {
1500 delphine 80
		$liste_coordonnees = $this->dao->rechercherCoordonnees();
1517 aurelien 81
		$this->traiterCoordonnees($liste_coordonnees);
82
	}
83
 
84
	private function traiterCoordonnees($liste_coordonnees) {
85
		echo "-------------------------------------------------------------------\n";
86
		echo "  Traitement et calcul des codes INSEE (".count($liste_coordonnees)." coordonnées en tout) ... \n";
87
		echo "-------------------------------------------------------------------\n";
88
		$debut = microtime(true);
89
		$i = 0;
90
		$total = count($liste_coordonnees);
1500 delphine 91
		foreach ($liste_coordonnees as $coordonnees) {
92
			if ($this->testerCoordonneesWgsFrance($coordonnees['latitude'], $coordonnees['longitude'])) {
93
				$code_insee = $this->chercherCodeCommune('osm', $coordonnees['latitude'], $coordonnees['longitude']);
94
				if ($code_insee != "") {
95
					$this->dao->ajouterCodeInseeCalculee($coordonnees['latitude'], $coordonnees['longitude'], $code_insee);
96
				} else {
97
					$code_insee = $this->chercherCodeCommune('lion1906', $coordonnees['latitude'], $coordonnees['longitude']);
98
					if ($code_insee != "") {
99
						$this->dao->ajouterCodeInseeCalculee($coordonnees['latitude'], $coordonnees['longitude'], $code_insee);
100
					}
101
				}
102
			}
1517 aurelien 103
			$i++;
104
			$this->afficherAvancement('  Lignes traitées ', $i);
1500 delphine 105
		}
1517 aurelien 106
		echo "\n";
107
		$fin = microtime(true);
108
		echo "-------------------------------------------------------------------\n";
109
		echo "  Fin du traitement, ".($fin - $debut)." secondes écoulées \n";
110
		echo "-------------------------------------------------------------------\n";
111
		echo "\n";
1500 delphine 112
	}
113
 
114
	private function modifierCodeInsee() {
115
		$this->dao->modifierCodeInsee();
116
	}
117
 
118
	private function chercherCodeCommune($projet, $latitude, $longitude) {
119
		$code_insee = '';
120
		$url_service = "www.tela-botanica.org/service:eflore:0.1/{$projet}/nom-commune".
121
					"?lat={$latitude}&lon={$longitude}";
1517 aurelien 122
 
1500 delphine 123
		$url_service = str_replace(',', '.', $url_service);
124
		$ch = curl_init($url_service);
125
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
126
		$reponse = curl_exec($ch);
127
		$reponse = json_decode($reponse);
128
		if (isset($reponse->codeINSEE)) {
129
			$code_insee = $reponse->codeINSEE;
130
		}
131
		curl_close($ch);
1517 aurelien 132
 
1500 delphine 133
		return $code_insee;
134
	}
135
 
136
	private function testerCoordonneesWgsFrance($latitude, $longitude) {
137
		$coord_france = false;
138
		if ($latitude != '' && $longitude != '') {
139
			if ($latitude < 51.071667 && $latitude > 41.316667) {
140
				if ($longitude < 9.513333 && $longitude > -5.140278) {
141
					$coord_france = true;
142
				}
143
			}
144
		}
145
		return $coord_france;
146
	}
147
	private function analyserCodeDeptComm($ligneDecoupe) {
148
		if (preg_match('/^\d{2}$/', $ligneDecoupe['codeDept'])) {
149
		} elseif (preg_match('/^\s{0,1}\d{1,2}\s{0,1}$/',$ligneDecoupe['codeDept'])) {
150
			$ligneDecoupe['codeDept'] = str_replace(' ', '0', $ligneDecoupe['codeDept']);
151
		} else {
152
			$ligneDecoupe['codeDept'] = null;
153
		}
154
		if (preg_match('/^\d{3}$/', $ligneDecoupe['codeCommune'])) {
155
		} elseif (preg_match('/^\s{0,2}\d{1,2,3}\s{0,2}$/', $ligneDecoupe['codeCommune'])) {
156
			$ligneDecoupe['codeCommune'] = str_replace(' ', '0', $ligneDecoupe['codeCommune']);
157
		} elseif ($ligneDecoupe['codeDept'] == null) {
158
			$ligneDecoupe['codeCommune'] = null;
159
		} else {
160
			$ligneDecoupe['codeCommune'] = '000';
161
		}
162
		return $ligneDecoupe;
163
	}
164
	private function analyserCoordGrdParis($ligneDecoupe, $ligne) {
165
		if (preg_match('/[\s0]0\.000/', $ligneDecoupe['latitude'], $match)) {
166
			$ligneDecoupe['latitude'] = null;
167
			$ligneDecoupe['longitude'] = null;
168
		} elseif (preg_match('/\d{1,2}\.\d{2,3}/', $ligneDecoupe['latitude'], $match)) {// format souhaité
169
			$ligneDecoupe['latitude_wgs'] = round($ligneDecoupe['latitude']*0.9, 7);
170
			$ligneDecoupe['longitude_wgs'] = round($ligneDecoupe['longitude']*0.9+2.3372291, 7);
171
		} elseif (preg_match('/(\d{2})[\d\s,](\d{3})/', $ligneDecoupe['latitude'], $match)) {//erreur de saisie
172
			$ligneDecoupe['latitude'] = $match[1].'.'.$match[2];
173
			$ligneDecoupe['latitude_wgs'] = round($ligneDecoupe['latitude']*0.9, 7);
174
			$ligneDecoupe['longitude_wgs'] = round($ligneDecoupe['longitude']*0.9 + 2.3372291, 7);
175
		} elseif (preg_match('/^[a-zA-Z\s]*[a-zA-Z][a-zA-Z\s]*$/', $ligneDecoupe['latitude'])) {// lat absente + nom long
176
			$ligneDecoupe['nomStation'] = rtrim(substr($ligne, 10, 48));
177
			$ligneDecoupe['latitude'] = null;
178
			$ligneDecoupe['longitude'] = null;
179
		} elseif (preg_match('/.[AO].123/', $ligneDecoupe['latitude'], $match)) {
180
			$ligneDecoupe['latitude'] = null;
181
			$ligneDecoupe['longitude'] = null;
182
		}  elseif ($ligneDecoupe['latitude'] != null) {
183
			$ligneDecoupe['latitude'] = null;
184
			$ligneDecoupe['longitude'] = null;
185
		}
186
		return $ligneDecoupe;
187
	}
188
}
189
?>