Subversion Repositories eFlore/Applications.coel

Rev

Rev 1714 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1714 Rev 1722
1
<?php
1
<?php
2
 
2
 
3
/**
3
/**
4
 * Exemple lancement:
4
 * Exemple lancement:
5
 * /opt/lampp/bin/php -d memory_limit=3500M cli.php communes -a majCoordonnees
5
 * /opt/lampp/bin/php -d memory_limit=3500M cli.php communes -a majCoordonnees
6
 */
6
 */
7
 
7
 
8
class Communes extends Script {
8
class Communes extends Script {
9
	
9
	
10
	private $bdd = null;
10
	private $bdd = null;
11
	private $structures = array();
11
	private $structures = array();
12
	private $communes = array();
12
	private $communes = array();
13
	private $nonTrouvees = array();
13
	private $nonTrouvees = array();
14
	
14
	
15
	public function __construct($script_nom, $parametres) {
15
	public function __construct($script_nom, $parametres) {
16
		parent::__construct($script_nom, $parametres);
16
		parent::__construct($script_nom, $parametres);
17
		$this->bdd = new Bdd();
17
		$this->bdd = new Bdd();
18
	}
18
	}
19
	
19
	
20
	public function executer() {
20
	public function executer() {
21
		try {
21
		try {
22
			$this->initialiserScript();
22
			$this->initialiserScript();
23
			$cmd = $this->getParametre('a');
23
			$cmd = $this->getParametre('a');
24
			switch ($cmd) {
24
			switch ($cmd) {
25
				case "majCoordonnees" :
25
				case "majCoordonnees" :
26
					$this->mettreAJourCoordonneesCommunes(); break;
26
					$this->mettreAJourCoordonneesCommunes(); break;
27
				default :
27
				default :
28
					$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
28
					$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
29
			}
29
			}
30
		} catch (Exception $erreur) {
30
		} catch (Exception $erreur) {
31
			$this->traiterErreur($erreur->getMessage());
31
			$this->traiterErreur($erreur->getMessage());
32
		}
32
		}
33
	}
33
	}
34
	
34
	
35
	private function initialiserScript() {
35
	private function initialiserScript() {
36
		$fichierIni = $this->getScriptChemin().'communes.ini';
36
		$fichierIni = $this->getScriptChemin().'communes.ini';
37
		if (file_exists($fichierIni)) {
37
		if (file_exists($fichierIni)) {
38
			Config::charger($fichierIni);
38
			Config::charger($fichierIni);
39
		} else {
39
		} else {
40
			$erreur = "Veuillez configurer le projet en créant le fichier 'communes.ini' ".
40
			$erreur = "Veuillez configurer le projet en créant le fichier 'communes.ini' ".
41
				"dans le dossier du module de script du projet à partir du fichier 'config.defaut.ini'.";
41
				"dans le dossier du module de script du projet à partir du fichier 'config.defaut.ini'.";
42
			throw new Exception($erreur);
42
			throw new Exception($erreur);
43
		}
43
		}
44
	}
44
	}
45
	
45
	
46
	private function mettreAJourCoordonneesCommunes() {
46
	private function mettreAJourCoordonneesCommunes() {
47
		$this->recupererStructures();
47
		$this->recupererStructures();
48
		$departements = $this->determinerDepartementsStructures();
48
		$departements = $this->determinerDepartementsStructures();
49
		$this->recupererCommunes($departements);
49
		$this->recupererCommunes($departements);
50
		$this->chercherCoordonneesVillesStructures();
50
		$this->chercherCoordonneesVillesStructures();
51
		$this->mettreAJourDonneesStructures();
51
		$this->mettreAJourDonneesStructures();
52
		$this->afficherResultatScript();
52
		$this->afficherResultatScript();
53
	}
53
	}
54
	
54
	
55
	private function recupererStructures() {
55
	private function recupererStructures() {
56
		$this->bdd->requeter("USE ".Config::get("tables.bdd_nom_coel"));
56
		$this->bdd->requeter("USE ".Config::get("tables.bdd_nom_coel"));
57
		$requete =
57
		$requete = sprintf(
58
		"SELECT cs_id_structure, cs_nom, cs_code_postal, cs_ville ".
58
            "SELECT cs_id_structure, cs_nom, cs_code_postal, cs_ville FROM %s"
59
		"FROM ".Config::get("tables.table_structures_coel")." ".
59
            . " JOIN coel_meta_liste_valeur ON cs_ce_truk_pays = cmlv_id_valeur"
-
 
60
            . " WHERE cmlv_abreviation IN ('FR', 'RE', 'YT', 'GP', 'MQ', 'GF', 'NC')"
60
		"WHERE (cs_latitude IS NULL OR cs_latitude='0' OR Length(Trim(cs_latitude)) = 0) ".
61
            . " AND (cs_latitude IS NULL OR cs_latitude='0' OR Length(Trim(cs_latitude)) = 0)"
61
		"AND (cs_longitude IS NULL OR cs_longitude='0' OR Length(Trim(cs_longitude)) = 0) ".
62
            . " AND (cs_longitude IS NULL OR cs_longitude='0' OR Length(Trim(cs_longitude)) = 0)"
62
		"AND cs_ce_truk_pays='2654' ORDER BY cs_ville;";
63
            . " ORDER BY cs_ville",
-
 
64
            Config::get("tables.table_structures_coel"));
-
 
65
 
63
		$this->structures = $this->bdd->recupererTous($requete);
66
		$this->structures = $this->bdd->recupererTous($requete);
64
	}
67
	}
65
	
68
	
66
	private function determinerDepartementsStructures() {
69
	private function determinerDepartementsStructures() {
67
		$departements = array();
70
		$departements = array();
68
		foreach ($this->structures as $index => $structure) {
71
		foreach ($this->structures as $index => $structure) {
69
			$codeDepartement = '';
72
			$codeDepartement = '';
70
			if (strlen($structure['cs_code_postal']) == 5) {
73
			if (strlen($structure['cs_code_postal']) == 5) {
71
				if (substr($structure['cs_code_postal'], 0, 2) > "95") {
74
				if (substr($structure['cs_code_postal'], 0, 2) > "95") {
72
					$codeDepartement = substr($structure['cs_code_postal'], 0, 3);
75
					$codeDepartement = substr($structure['cs_code_postal'], 0, 3);
73
				} else {
76
				} else {
74
					$codeDepartement = substr($structure['cs_code_postal'], 0, 2);
77
					$codeDepartement = substr($structure['cs_code_postal'], 0, 2);
75
				}
78
				}
76
			}
79
			}
77
			$this->structures[$index]['departement'] = $codeDepartement;
80
			$this->structures[$index]['departement'] = $codeDepartement;
78
			if (strlen($codeDepartement) > 0 && !in_array($codeDepartement, $departements)) {
81
			if (strlen($codeDepartement) > 0 && !in_array($codeDepartement, $departements)) {
79
				$departements[] = $codeDepartement;
82
				$departements[] = $codeDepartement;
80
			}
83
			}
81
		}
84
		}
82
		return $departements;
85
		return $departements;
83
	}
86
	}
84
	
87
	
85
	private function recupererCommunes($departements) {
88
	private function recupererCommunes($departements) {
86
		foreach ($departements as $index => $codeDepartement) {
89
		foreach ($departements as $index => $codeDepartement) {
87
			$departements[$index] = "'$codeDepartement'";
90
			$departements[$index] = "'$codeDepartement'";
88
		}
91
		}
89
		$listeDepartements = implode(',', $departements);
92
		$listeDepartements = implode(',', $departements);
90
		$this->bdd->requeter("USE ".Config::get("tables.bdd_nom_floradata"));
93
		$this->bdd->requeter("USE ".Config::get("tables.bdd_nom_floradata"));
91
		$requete = "SELECT code, nom, wgs84_latitude, wgs84_longitude FROM ".Config::get("tables.table_communes")." ".
94
		$requete = "SELECT code, nom, wgs84_latitude, wgs84_longitude FROM ".Config::get("tables.table_communes")." ".
92
		"ORDER BY code;";
95
		"ORDER BY code;";
93
		$communes = $this->bdd->recupererTous($requete);
96
		$communes = $this->bdd->recupererTous($requete);
94
		// reorganiser le tableau en series des tableaux contenant les communes par departement
97
		// reorganiser le tableau en series des tableaux contenant les communes par departement
95
		$communes[0]['recherche'] = self::transformerChainePourRecherche($communes[0]['nom']);
98
		$communes[0]['recherche'] = self::transformerChainePourRecherche($communes[0]['nom']);
96
		$communesDepartement = array($communes[0]);
99
		$communesDepartement = array($communes[0]);
97
		$numeroDepartement = substr($communes[0]['code'], 0, 2) > '95' ? substr($communes[0]['code'], 0, 3)
100
		$numeroDepartement = substr($communes[0]['code'], 0, 2) > '95' ? substr($communes[0]['code'], 0, 3)
98
			: substr($communes[0]['code'], 0, 2);
101
			: substr($communes[0]['code'], 0, 2);
99
		for ($index = 1; $index < count($communes); $index ++) {
102
		for ($index = 1; $index < count($communes); $index ++) {
100
			$numeroDept = substr($communes[$index]['code'],0,2) > '95' ? substr($communes[$index]['code'],0,3)
103
			$numeroDept = substr($communes[$index]['code'],0,2) > '95' ? substr($communes[$index]['code'],0,3)
101
				: substr($communes[$index]['code'],0,2);
104
				: substr($communes[$index]['code'],0,2);
102
			if ($numeroDept != $numeroDepartement) {
105
			if ($numeroDept != $numeroDepartement) {
103
				$this->communes[$numeroDepartement] = $communesDepartement;
106
				$this->communes[$numeroDepartement] = $communesDepartement;
104
				$communesDepartement = array();
107
				$communesDepartement = array();
105
				$numeroDepartement = $numeroDept;
108
				$numeroDepartement = $numeroDept;
106
			}
109
			}
107
			$communes[$index]['recherche'] = self::transformerChainePourRecherche($communes[$index]['nom']);
110
			$communes[$index]['recherche'] = self::transformerChainePourRecherche($communes[$index]['nom']);
108
			$communesDepartement[] = $communes[$index];
111
			$communesDepartement[] = $communes[$index];
109
		}
112
		}
110
		$this->communes[$numeroDepartement] = $communesDepartement;
113
		$this->communes[$numeroDepartement] = $communesDepartement;
111
	}
114
	}
112
	
115
	
113
	private static function transformerChainePourRecherche($chaine, $charset='utf-8') {
116
	private static function transformerChainePourRecherche($chaine, $charset='utf-8') {
114
		$str = htmlentities($chaine, ENT_NOQUOTES, $charset);
117
		$str = htmlentities($chaine, ENT_NOQUOTES, $charset);
115
		$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
118
		$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
116
		$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str);
119
		$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str);
117
		$str = preg_replace('#&[^;]+;#', '', $str);
120
		$str = preg_replace('#&[^;]+;#', '', $str);
118
		for ($position = 0; $position < strlen($str); $position ++) {
121
		for ($position = 0; $position < strlen($str); $position ++) {
119
			if ($str[$position] == "," || $str[$position] == "-" || $str[$position] == "'") {
122
			if ($str[$position] == "," || $str[$position] == "-" || $str[$position] == "'") {
120
				$str[$position] = " ";
123
				$str[$position] = " ";
121
			}
124
			}
122
		}
125
		}
123
		return strtolower($str);
126
		return strtolower($str);
124
	}
127
	}
125
	
128
	
126
	private function chercherCoordonneesVillesStructures() {
129
	private function chercherCoordonneesVillesStructures() {
127
		foreach ($this->structures as $index => $structure) {
130
		foreach ($this->structures as $index => $structure) {
128
			if (strlen(trim($structure['cs_ville'])) > 0) {
131
			if (strlen(trim($structure['cs_ville'])) > 0) {
129
				if (strlen(trim($structure['departement'])) > 0) {
132
				if (strlen(trim($structure['departement'])) > 0) {
130
					$this->structures[$index] = $this->retrouverCoordonneesDansDepartement($structure);
133
					$this->structures[$index] = $this->retrouverCoordonneesDansDepartement($structure);
131
				} else {
134
				} else {
132
					$this->structures[$index] = $this->retrouverCoordonneesDansListeCommunes($structure);
135
					$this->structures[$index] = $this->retrouverCoordonneesDansListeCommunes($structure);
133
				}
136
				}
134
			} else {
137
			} else {
135
				$this->nonTrouvees[] = $structure;
138
				$this->nonTrouvees[] = $structure;
136
			}
139
			}
137
		}
140
		}
138
	}
141
	}
139
	
142
	
140
	private function retrouverCoordonneesDansDepartement($structure) {
143
	private function retrouverCoordonneesDansDepartement($structure) {
141
		$villeRecherche = self::transformerChainePourRecherche(($structure['cs_ville']));
144
		$villeRecherche = self::transformerChainePourRecherche(($structure['cs_ville']));
142
		$communeTrouvee = null;
145
		$communeTrouvee = null;
143
		// comparaison dans un premier temps si les deux chaines de caracteres sont identiques
146
		// comparaison dans un premier temps si les deux chaines de caracteres sont identiques
144
		// dans un second temps on applique la recherche de sous chaines identiques
147
		// dans un second temps on applique la recherche de sous chaines identiques
145
		foreach ($this->communes[$structure['departement']] as $commune) {
148
		foreach ($this->communes[$structure['departement']] as $commune) {
146
			if ($commune['recherche'] == $villeRecherche) {
149
			if ($commune['recherche'] == $villeRecherche) {
147
				$communeTrouvee = $commune;
150
				$communeTrouvee = $commune;
148
				break;
151
				break;
149
			}
152
			}
150
		}
153
		}
151
		if (is_null($communeTrouvee)) {
154
		if (is_null($communeTrouvee)) {
152
			foreach ($this->communes[$structure['departement']] as $commune) {
155
			foreach ($this->communes[$structure['departement']] as $commune) {
153
				if (strstr($commune['recherche'], $villeRecherche) !== false) {
156
				if (strstr($commune['recherche'], $villeRecherche) !== false) {
154
					$communeTrouvee = $commune;
157
					$communeTrouvee = $commune;
155
					break;
158
					break;
156
				} else if (strstr($villeRecherche, $commune['recherche']) !== false) {
159
				} else if (strstr($villeRecherche, $commune['recherche']) !== false) {
157
					$communeTrouvee = $commune;
160
					$communeTrouvee = $commune;
158
					break;
161
					break;
159
				}
162
				}
160
			}
163
			}
161
		}
164
		}
162
		if (!is_null($communeTrouvee)) {
165
		if (!is_null($communeTrouvee)) {
163
			$structure['cs_ville']  = $communeTrouvee['nom'];
166
			$structure['cs_ville']  = $communeTrouvee['nom'];
164
			$structure['latitude']  = $communeTrouvee['wgs84_latitude'];
167
			$structure['latitude']  = $communeTrouvee['wgs84_latitude'];
165
			$structure['longitude'] = $communeTrouvee['wgs84_longitude'];
168
			$structure['longitude'] = $communeTrouvee['wgs84_longitude'];
166
		} else {
169
		} else {
167
			$this->nonTrouvees[] = $structure;
170
			$this->nonTrouvees[] = $structure;
168
		}
171
		}
169
		return $structure;
172
		return $structure;
170
	}
173
	}
171
	
174
	
172
	private function retrouverCoordonneesDansListeCommunes($structure) {
175
	private function retrouverCoordonneesDansListeCommunes($structure) {
173
		$villeRecherche = self::transformerChainePourRecherche(($structure['cs_ville']));
176
		$villeRecherche = self::transformerChainePourRecherche(($structure['cs_ville']));
174
		$communeTrouvee = null;
177
		$communeTrouvee = null;
175
		$codeDepartement = "";
178
		$codeDepartement = "";
176
		// meme comportement que la methode precedente, mais la recherche est etendue a toutes les communes
179
		// meme comportement que la methode precedente, mais la recherche est etendue a toutes les communes
177
		// si une commune est trouvee, on lui attribuera le code departement au code postal par defaut
180
		// si une commune est trouvee, on lui attribuera le code departement au code postal par defaut
178
		foreach ($this->communes as $departement => $communes) {
181
		foreach ($this->communes as $departement => $communes) {
179
			foreach ($communes as $commune) {
182
			foreach ($communes as $commune) {
180
				if ($commune['recherche'] == $villeRecherche) {
183
				if ($commune['recherche'] == $villeRecherche) {
181
					$communeTrouvee = $commune;
184
					$communeTrouvee = $commune;
182
					$codeDepartement = $departement;
185
					$codeDepartement = $departement;
183
					break;
186
					break;
184
				}
187
				}
185
			}
188
			}
186
			if (is_null($communeTrouvee)) {
189
			if (is_null($communeTrouvee)) {
187
				foreach ($communes as $commune) {
190
				foreach ($communes as $commune) {
188
					if (strstr($commune['recherche'], $villeRecherche) !== false) {
191
					if (strstr($commune['recherche'], $villeRecherche) !== false) {
189
						$communeTrouvee = $commune;
192
						$communeTrouvee = $commune;
190
						$codeDepartement = $departement;
193
						$codeDepartement = $departement;
191
						break;
194
						break;
192
					} else if (strstr($villeRecherche, $commune['recherche']) !== false) {
195
					} else if (strstr($villeRecherche, $commune['recherche']) !== false) {
193
						$communeTrouvee = $commune;
196
						$communeTrouvee = $commune;
194
						$codeDepartement = $departement;
197
						$codeDepartement = $departement;
195
						break;
198
						break;
196
					}
199
					}
197
				}
200
				}
198
			}
201
			}
199
		}
202
		}
200
		if (!is_null($communeTrouvee)) {
203
		if (!is_null($communeTrouvee)) {
201
			$structure['cs_ville']  = $communeTrouvee['nom'];
204
			$structure['cs_ville']  = $communeTrouvee['nom'];
202
			$structure['latitude']  = $communeTrouvee['wgs84_latitude'];
205
			$structure['latitude']  = $communeTrouvee['wgs84_latitude'];
203
			$structure['longitude'] = $communeTrouvee['wgs84_longitude'];
206
			$structure['longitude'] = $communeTrouvee['wgs84_longitude'];
204
			$structure['cs_code_postal'] = $codeDepartement;
207
			$structure['cs_code_postal'] = $codeDepartement;
205
		} else {
208
		} else {
206
			$this->nonTrouvees[] = $structure;
209
			$this->nonTrouvees[] = $structure;
207
		}
210
		}
208
		return $structure;
211
		return $structure;
209
	}
212
	}
210
	
213
	
211
	private function mettreAJourDonneesStructures() {
214
	private function mettreAJourDonneesStructures() {
212
		$this->bdd->requeter("USE ".Config::get("tables.bdd_nom_coel"));
215
		$this->bdd->requeter("USE ".Config::get("tables.bdd_nom_coel"));
213
		$updates = array();
216
		$updates = array();
214
		// pour faire une seule requete de mise a jour, on va pas utiliser l'ordre UPDATE qui n'accepte
217
		// pour faire une seule requete de mise a jour, on va pas utiliser l'ordre UPDATE qui n'accepte
215
		// qu'une seule condition, mais l'ordre INSERT en rajoutant a la fin ON DUPLICATE KEY UPDATE
218
		// qu'une seule condition, mais l'ordre INSERT en rajoutant a la fin ON DUPLICATE KEY UPDATE
216
		// avec les correspondances au niveau des codes postaux et villes
219
		// avec les correspondances au niveau des codes postaux et villes
217
		foreach ($this->structures as $structure) {
220
		foreach ($this->structures as $structure) {
218
			if (isset($structure['latitude']) && isset($structure['longitude'])) {
221
			if (isset($structure['latitude']) && isset($structure['longitude'])) {
219
				$updates[] = "({$structure['cs_id_structure']},'{$structure['cs_code_postal']}',".
222
				$updates[] = "({$structure['cs_id_structure']},'{$structure['cs_code_postal']}',".
220
					$this->bdd->proteger($structure['cs_ville']).",'{$structure['latitude']}',".
223
					$this->bdd->proteger($structure['cs_ville']).",'{$structure['latitude']}',".
221
					"'{$structure['longitude']}')";
224
					"'{$structure['longitude']}')";
222
			} 
225
			} 
223
		}
226
		}
-
 
227
 
-
 
228
        if(!$updates) return;
-
 
229
 
224
		$sql = "INSERT INTO ".Config::get("tables.table_structures_coel")." (cs_id_structure, cs_code_postal, ".
230
		$sql = "INSERT INTO ".Config::get("tables.table_structures_coel")." (cs_id_structure, cs_code_postal, ".
225
		"cs_ville, cs_latitude, cs_longitude) VALUES ".implode(",", $updates)." ".
231
		"cs_ville, cs_latitude, cs_longitude) VALUES ".implode(",", $updates)." ".
226
		"ON DUPLICATE KEY UPDATE cs_code_postal=VALUES(cs_code_postal), cs_ville=VALUES(cs_ville), ".
232
		"ON DUPLICATE KEY UPDATE cs_code_postal=VALUES(cs_code_postal), cs_ville=VALUES(cs_ville), ".
227
		"cs_latitude=VALUES(cs_latitude), cs_longitude=VALUES(cs_longitude);";
233
		"cs_latitude=VALUES(cs_latitude), cs_longitude=VALUES(cs_longitude);";
228
		$this->bdd->requeter($sql);
234
		$this->bdd->requeter($sql);
229
	}
235
	}
230
	
236
	
231
	private function afficherResultatScript() {
237
	private function afficherResultatScript() {
232
		$nombreUpdates = count($this->structures) - count($this->nonTrouvees);
238
		$nombreUpdates = count($this->structures) - count($this->nonTrouvees);
233
		$message = "Mise à jour des coordonnées des communes terminée. Les structures qui n'avaient pas de ".
239
		$message = "Mise à jour des coordonnées des communes terminée. Les structures qui n'avaient pas de ".
234
		"coordonnées se sont vues attribuer les coordonnées de la commune dans laquelle elles sont situées.\n\n".
240
		"coordonnées se sont vues attribuer les coordonnées de la commune dans laquelle elles sont situées.\n\n".
235
		"Mises à jour effectuées pour $nombreUpdates structures.\n";
241
		"Mises à jour effectuées pour $nombreUpdates structures.\n";
236
		if (count($this->nonTrouvees) > 0) {
242
		if (count($this->nonTrouvees) > 0) {
237
			$message .= "Des problèmes ont été rencontrées pour les structures suivantes : \n";
243
			$message .= "Des problèmes ont été rencontrées pour les structures suivantes : \n";
238
			foreach ($this->nonTrouvees as $structure) {
244
			foreach ($this->nonTrouvees as $structure) {
239
				$message .= "  - {$structure['cs_nom']} ({$structure['cs_ville']}, {$structure['cs_code_postal']})\n";
245
				$message .= "  - {$structure['cs_nom']} ({$structure['cs_ville']}, {$structure['cs_code_postal']})\n";
240
			}
246
			}
241
			$message .= "Veuillez vérifier le nom de la commune saisi ou aller dans la fiche structure ".
247
			$message .= "Veuillez vérifier le nom de la commune saisi ou aller dans la fiche structure ".
242
			"pour y rajouter les coordonnées longitude/latitude\n";
248
			"pour y rajouter les coordonnées longitude/latitude\n";
243
		} else {
249
		} else {
244
			$message .= "Vous pourrez toujours par la suite aller dans la fiche structure ".
250
			$message .= "Vous pourrez toujours par la suite aller dans la fiche structure ".
245
			"pour affiner la précision les coordonnées longitude/latitude au niveau des locaux.\n";
251
			"pour affiner la précision les coordonnées longitude/latitude au niveau des locaux.\n";
246
		}
252
		}
247
		print($message);
253
		print($message);
248
	}
254
	}
249
	
255
	
250
}
256
}
251
 
257
 
252
?>
258
?>