Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2018 Rev 2020
1
<?php
1
<?php
2
// Encodage : UTF-8
2
// Encodage : UTF-8
3
// +-------------------------------------------------------------------------------------------------------------------+
3
// +-------------------------------------------------------------------------------------------------------------------+
4
/**
4
/**
5
 * Traitement des observations sauvages pour les migrer vers des champs étendus
5
 * Traitement des observations sauvages pour les migrer vers des champs étendus
6
 *
6
 *
7
 * Description : classe permettant d'affecter des champs étendus aux observations sauvages
7
 * Description : classe permettant d'affecter des champs étendus aux observations sauvages. Elle permet aussi
-
 
8
 * d'exporter les données à migrer en CSV pour vérifier les informations avant la migration.
8
 * Utilisation :
9
 * Utilisation :
9
 * - Pour migrer les données : /opt/lamp/bin/php script.php migration_sauvages -a migrer -v 3
10
 * - Pour migrer : /opt/lamp/bin/php script.php migration_sauvages -a migrer -v 3
10
 * - Pour exporter les données : /opt/lamp/bin/php script.php migration_sauvages -a exporter -s chemin_vers_fichier_sortie
11
 * - Pour exporter : /opt/lamp/bin/php script.php migration_sauvages -a exporter -s chemin_vers_fichier_sortie
11
 *
12
 *
12
 * @category	PHP 5.3
13
 * @category	PHP 5.3
13
 * @package		scripts
14
 * @package		scripts
14
 //Auteur original :
15
 //Auteur original :
15
 * @author		Aurélien PERONNET <aurelien@tela-botanica.org>
16
 * @author		Aurélien PERONNET <aurelien@tela-botanica.org>
16
 * @copyright	Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
17
 * @copyright	Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
17
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
18
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
18
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
19
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
19
 * @version		$Id$
20
 * @version		$Id$
20
 */
21
 */
21
// +-------------------------------------------------------------------------------------------------------------------+
22
// +-------------------------------------------------------------------------------------------------------------------+
22
class MigrationSauvages extends Script {
23
class MigrationSauvages extends Script {
23
	protected $parametres_autorises = array(
24
	protected $parametres_autorises = array(
24
			'-s' => array(false, true, "Chemin vers le fichier de sortie pour l'export"));
25
			'-s' => array(false, true, "Chemin vers le fichier de sortie pour l'export"));
25
 
26
 
26
	// +-------------------------------------------------------------------------------------------------------------------+
27
	// +-------------------------------------------------------------------------------------------------------------------+
27
	public function executer() {
28
	public function executer() {
28
		include_once dirname(__FILE__).'/bibliotheque/Dao.php';
29
		include_once dirname(__FILE__).'/bibliotheque/Dao.php';
29
		$this->dao = new Dao();
30
		$this->dao = new Dao();
30
		// Récupération de paramétres
31
		// Récupération de paramétres
31
		// Lancement de l'action demandée
32
		// Lancement de l'action demandée
32
		$this->mode_verbeux = $this->getParametre('v');
33
		$this->mode_verbeux = $this->getParametre('v');
33
		$cmd = $this->getParametre('a');
34
		$cmd = $this->getParametre('a');
34
		try {
35
		try {
35
			switch ($cmd) {
36
			switch ($cmd) {
36
				case 'migrer' :
-
 
37
					$this->migrerObservationsSauvages();
-
 
38
					break;
-
 
39
				case 'exporter' :
37
				case 'exporter' :
40
					$this->exporterObservationsSauvagesAMigrer();
38
					$this->exporterObservationsSauvagesAMigrer();
41
					break;
39
					break;
-
 
40
				case 'migrer' :
-
 
41
					$this->migrerObservationsSauvages();
-
 
42
					break;
42
				default :
43
				default :
43
					$msg = "Erreur : la commande '$cmd' n'existe pas!\n".
44
					$msg = "Erreur : la commande '$cmd' n'existe pas!\n".
44
						"Commandes existantes : migrer, exporter";
45
						"Commandes existantes : exporter, migrer";
45
					throw new Exception($msg);
46
					throw new Exception($msg);
46
			}
47
			}
47
		} catch (Exception $e) {
48
		} catch (Exception $e) {
48
			$this->traiterErreur($e->getMessage());
49
			$this->traiterErreur($e->getMessage());
49
		}
50
		}
50
	}
51
	}
51
 
52
 
52
	private function exporterObservationsSauvagesAMigrer() {
53
	private function exporterObservationsSauvagesAMigrer() {
53
		$total = $this->dao->obtenirNbObservationsSauvages();
54
		$total = $this->dao->obtenirNbObservationsSauvages();
54
		$pas_liste_obs = 5000;
55
		$pas_liste_obs = 5000;
55
		echo " Traitement des $total observations par paquet de $pas_liste_obs \n";
56
		echo " Traitement des $total observations par paquet de $pas_liste_obs \n";
56
 
57
 
57
		$fichier = $this->getParametre('s');
58
		$fichier = $this->getParametre('s');
58
 
59
 
59
		$fp = fopen($fichier, 'w');
60
		$fp = fopen($fichier, 'w');
60
		$ecrireEntete = true;
61
		$ecrireEntete = true;
61
		for ($i = 0; $i <= $total; $i += $pas_liste_obs) {
62
		for ($i = 0; $i <= $total; $i += $pas_liste_obs) {
62
			$liste_observations = $this->dao->obtenirObservationsSauvages($i, $pas_liste_obs);
63
			$liste_observations = $this->dao->obtenirObservationsSauvages($i, $pas_liste_obs);
63
			foreach ($liste_observations as $observation) {
64
			foreach ($liste_observations as $observation) {
64
				if ($this->doitMigrerObservation($observation)) {
65
				if ($this->doitMigrerObservation($observation)) {
65
					$champs_etendus = $this->convertirChampsObsSauvagesEnChampsEtendus($observation);
66
					$champs_etendus = $this->convertirChampsObsSauvagesEnChampsEtendus($observation);
66
					$champs_etendus_fixes = array(
67
					$champs_etendus_fixes = array(
67
						'latitudeDebutRue', 'longitudeDebutRue', 'latitudeFinRue', 'longitudeFinRue',
68
						'latitudeDebutRue', 'longitudeDebutRue', 'latitudeFinRue', 'longitudeFinRue',
68
						'adresse', 'coteRue');
69
						'adresse', 'coteRue');
69
					foreach ($champs_etendus_fixes as $cle) {
70
					foreach ($champs_etendus_fixes as $cle) {
70
						$observation[$cle] = '';
71
						$observation[$cle] = '';
71
						foreach ($champs_etendus as $champs) {
72
						foreach ($champs_etendus as $champs) {
72
							if ($champs['cle'] == $cle) {
73
							if ($champs['cle'] == $cle) {
73
								$observation[$cle] = $champs['valeur'];
74
								$observation[$cle] = $champs['valeur'];
74
							}
75
							}
75
						}
76
						}
76
					}
77
					}
77
				}
78
				}
78
				if ($ecrireEntete) {
79
				if ($ecrireEntete) {
79
					fputcsv($fp, array_keys($observation));
80
					fputcsv($fp, array_keys($observation));
80
					$ecrireEntete = false;
81
					$ecrireEntete = false;
81
				}
82
				}
82
				fputcsv($fp, array_values($observation));
83
				fputcsv($fp, array_values($observation));
83
				$this->afficherAvancement("\tObs traitées : ", 1);
84
				$this->afficherAvancement("\tObs traitées : ", 1);
84
			}
85
			}
85
		}
86
		}
86
		fclose($fp);
87
		fclose($fp);
87
		echo "\nFin de l'export\n";
88
		echo "\nFin de l'export\n";
88
	}
89
	}
89
 
90
 
90
	private function migrerObservationsSauvages() {
91
	private function migrerObservationsSauvages() {
91
		if ($this->mode_verbeux) $debut = microtime(true);
92
		if ($this->mode_verbeux) $debut = microtime(true);
92
		$nb_obs_modifiees = 0;
93
		$nb_obs_modifiees = 0;
93
		$nb_obs_ignorees = 0;
94
		$nb_obs_ignorees = 0;
94
		$total = $this->dao->obtenirNbObservationsSauvages();
95
		$total = $this->dao->obtenirNbObservationsSauvages();
95
 
96
 
96
		if ($this->mode_verbeux) {
97
		if ($this->mode_verbeux) {
97
			echo "-------------------------------------------------------------------\n".
98
			echo "-------------------------------------------------------------------\n".
98
				" Début de la migration des observations sauvages vers les champs étendus \n".
99
				" Début de la migration des observations sauvages vers les champs étendus \n".
99
				" $total observations concernées\n".
100
				" $total observations concernées\n".
100
				"-------------------------------------------------------------------\n";
101
				"-------------------------------------------------------------------\n";
101
		}
102
		}
102
 
103
 
103
		$champs_etendus_a_inserer = array();
104
		$champs_etendus_a_inserer = array();
104
		$nb_champs_total = 0;
105
		$nb_champs_total = 0;
105
		$nb_champs_etendus_a_inserer = 0;
106
		$nb_champs_etendus_a_inserer = 0;
106
 
107
 
107
		$pas_liste_obs = 5000;
108
		$pas_liste_obs = 5000;
108
		echo " Traitement des observations par paquet de ".$pas_liste_obs." (5 champs étendus ajoutés par observation traitée) \n";
109
		echo " Traitement des observations par paquet de ".$pas_liste_obs." (5 champs étendus ajoutés par observation traitée) \n";
109
 
110
 
110
		for ($i = 0; $i <= $total; $i += $pas_liste_obs) {
111
		for ($i = 0; $i <= $total; $i += $pas_liste_obs) {
111
			$liste_observations = $this->dao->obtenirObservationsSauvages($i, $pas_liste_obs);
112
			$liste_observations = $this->dao->obtenirObservationsSauvages($i, $pas_liste_obs);
112
			$champs_etendus_a_inserer = array();
113
			$champs_etendus_a_inserer = array();
113
			$nb_champs_etendus_a_inserer = 0;
114
			$nb_champs_etendus_a_inserer = 0;
114
			foreach ($liste_observations as $observation) {
115
			foreach ($liste_observations as $observation) {
115
 
116
 
116
				// test si obs candidate est ok, i.e. si elle contient bien un champ station formate comme ceci
117
				// test si obs candidate est ok, i.e. si elle contient bien un champ station formate comme ceci
117
				// coordonnees_debut_de_rue;coordonnees_fin_de_rue;cote_de_la_rue
118
				// coordonnees_debut_de_rue;coordonnees_fin_de_rue;cote_de_la_rue
118
				if ($this->doitMigrerObservation($observation)) {
119
				if ($this->doitMigrerObservation($observation)) {
119
					$champs_etendus = $this->convertirChampsObsSauvagesEnChampsEtendus($observation);
120
					$champs_etendus = $this->convertirChampsObsSauvagesEnChampsEtendus($observation);
120
					$champs_etendus_a_inserer[] = $champs_etendus;
121
					$champs_etendus_a_inserer[] = $champs_etendus;
121
					$nb_champs = count($champs_etendus);
122
					$nb_champs = count($champs_etendus);
122
					$nb_obs_modifiees++;
123
					$nb_obs_modifiees++;
123
					$nb_champs_etendus_a_inserer += $nb_champs;
124
					$nb_champs_etendus_a_inserer += $nb_champs;
124
					$nb_champs_total += $nb_champs;
125
					$nb_champs_total += $nb_champs;
125
				} else {
126
				} else {
126
					$nb_obs_ignorees++;
127
					$nb_obs_ignorees++;
127
				}
128
				}
128
 
129
 
129
				// insertion par paquets de 100 champs ou bien à la fin du parcours de la liste s'il y a moins de
130
				// insertion par paquets de 100 champs ou bien à la fin du parcours de la liste s'il y a moins de
130
				// 20 observations à traiter (20 obs * 5 champs = 100 champs)
131
				// 20 observations à traiter (20 obs * 5 champs = 100 champs)
131
				if ($nb_champs_etendus_a_inserer >= 100) {
132
				if ($nb_champs_etendus_a_inserer >= 100) {
132
					$this->dao->ajouterChampsEtendusParLots($champs_etendus_a_inserer);
133
					$this->dao->ajouterChampsEtendusParLots($champs_etendus_a_inserer);
133
					$champs_etendus_a_inserer = array();
134
					$champs_etendus_a_inserer = array();
134
					$nb_champs_etendus_a_inserer = 0;
135
					$nb_champs_etendus_a_inserer = 0;
135
				}
136
				}
136
			}
137
			}
137
			echo " $nb_champs_total champs étendus insérés \n";
138
			echo " $nb_champs_total champs étendus insérés \n";
138
		}
139
		}
139
 
140
 
140
		// insertion des champs restants s'il en reste moins de 100 à la fin
141
		// insertion des champs restants s'il en reste moins de 100 à la fin
141
		if ($nb_champs_etendus_a_inserer > 0) {
142
		if ($nb_champs_etendus_a_inserer > 0) {
142
			$this->dao->ajouterChampsEtendusParLots($champs_etendus_a_inserer);
143
			$this->dao->ajouterChampsEtendusParLots($champs_etendus_a_inserer);
143
			$nb_champs_total += $nb_champs_etendus_a_inserer;
144
			$nb_champs_total += $nb_champs_etendus_a_inserer;
144
			echo " $nb_champs_total champs étendus insérés \n";
145
			echo " $nb_champs_total champs étendus insérés \n";
145
		}
146
		}
146
 
147
 
147
		if ($this->mode_verbeux) {
148
		if ($this->mode_verbeux) {
148
			$fin = microtime(true);
149
			$fin = microtime(true);
149
			$tps_ecoule = $fin - $debut;
150
			$tps_ecoule = $fin - $debut;
150
			echo "\n".
151
			echo "\n".
151
				"-------------------------------------------------------------------\n".
152
				"-------------------------------------------------------------------\n".
152
				"  Fin de la migration des observations sauvages, \n".
153
				"  Fin de la migration des observations sauvages, \n".
153
				"  $tps_ecoule secondes écoulées \n".
154
				"  $tps_ecoule secondes écoulées \n".
154
				"  $nb_champs_total champs étendus créées \n".
155
				"  $nb_champs_total champs étendus créées \n".
155
				"  $nb_obs_modifiees observations modifiées \n".
156
				"  $nb_obs_modifiees observations modifiées \n".
156
				"  $nb_obs_ignorees observations ignorées \n".
157
				"  $nb_obs_ignorees observations ignorées \n".
157
				"-------------------------------------------------------------------\n\n";
158
				"-------------------------------------------------------------------\n\n";
158
		}
159
		}
159
	}
160
	}
160
 
161
 
161
	private function doitMigrerObservation($observation) {
162
	private function doitMigrerObservation($observation) {
162
		return (!empty($observation['station']) && substr_count($observation['station'], ';') == 2);
163
		return (!empty($observation['station']) && substr_count($observation['station'], ';') == 2);
163
	}
164
	}
164
 
165
 
165
	private function convertirChampsObsSauvagesEnChampsEtendus($observation) {
166
	private function convertirChampsObsSauvagesEnChampsEtendus($observation) {
166
		list($coords_debut_rue, $coords_fin_rue, $cote_rue) = explode(';', $observation['station']);
167
		list($coords_debut_rue, $coords_fin_rue, $cote_rue) = explode(';', $observation['station']);
167
		$coords_debut_rue = explode(',', $coords_debut_rue);
168
		$coords_debut_rue = explode(',', $coords_debut_rue);
168
		$coords_fin_rue = explode(',', $coords_fin_rue);
169
		$coords_fin_rue = explode(',', $coords_fin_rue);
169
		$lieu_dit = (trim($observation['lieudit']) == 'non renseigné(e)') ? '' : $observation['lieudit'];
170
		$lieu_dit = (trim($observation['lieudit']) == 'non renseigné(e)') ? '' : $observation['lieudit'];
170
		$id = $observation['id_observation'];
171
		$id = $observation['id_observation'];
171
 
172
 
172
		if (!preg_match('/^(?:2cotes|pair|impair|)$/', $cote_rue)) {
173
		if (!preg_match('/^(?:2cotes|pair|impair|)$/', $cote_rue)) {
173
			$msg = "Obs #$id: erreur champ cote_rue contient : $cote_rue";
174
			$msg = "Obs #$id: erreur champ cote_rue contient : $cote_rue";
174
			$this->traiterErreur($msg);
175
			$this->traiterErreur($msg);
175
		}
176
		}
176
		$testCoords = array(
177
		$testCoords = array(
177
			'latitudeDebutRue' => $coords_debut_rue[0],
178
			'latitudeDebutRue' => $coords_debut_rue[0],
178
			'longitudeDebutRue' => $coords_debut_rue[1],
179
			'longitudeDebutRue' => $coords_debut_rue[1],
179
			'latitudeDebutRue' => $coords_fin_rue[0],
180
			'latitudeDebutRue' => $coords_fin_rue[0],
180
			'longitudeDebutRue' => $coords_fin_rue[1]
181
			'longitudeDebutRue' => $coords_fin_rue[1]
181
		);
182
		);
182
		foreach ($testCoords as $champ => $coord) {
183
		foreach ($testCoords as $champ => $coord) {
183
			if (!preg_match('/^(?:-|)[0-9]{1,2}[.][0-9]{5}$/', $coord)) {
184
			if (!preg_match('/^(?:-|)[0-9]{1,2}[.][0-9]{5}$/', $coord)) {
184
				$msg = "Obs #$id: erreur champ $champ contient : $coord";
185
				$msg = "Obs #$id: erreur champ $champ contient : $coord";
185
				$this->traiterErreur($msg);
186
				$this->traiterErreur($msg);
186
			}
187
			}
187
		}
188
		}
188
 
189
 
189
		$champs_etendus = array();
190
		$champs_etendus = array();
190
		if (count($coords_debut_rue) == 2) {
191
		if (count($coords_debut_rue) == 2) {
191
			$champs_etendus[] = array('id_observation' => $id,
192
			$champs_etendus[] = array('id_observation' => $id,
192
				'cle' => 'latitudeDebutRue',
193
				'cle' => 'latitudeDebutRue',
193
				'label' => 'Latitude du début de la rue',
194
				'label' => 'Latitude du début de la rue',
194
				'valeur' => $coords_debut_rue[0]);
195
				'valeur' => $coords_debut_rue[0]);
195
			$champs_etendus[] = array('id_observation' => $id,
196
			$champs_etendus[] = array('id_observation' => $id,
196
				'cle' => 'longitudeDebutRue',
197
				'cle' => 'longitudeDebutRue',
197
				'label' => 'Longitude du début de la rue',
198
				'label' => 'Longitude du début de la rue',
198
				'valeur' => $coords_debut_rue[1]);
199
				'valeur' => $coords_debut_rue[1]);
199
		}
200
		}
200
		if (count($coords_fin_rue) == 2) {
201
		if (count($coords_fin_rue) == 2) {
201
			$champs_etendus[] = array('id_observation' => $id,
202
			$champs_etendus[] = array('id_observation' => $id,
202
				'cle' => 'latitudeFinRue',
203
				'cle' => 'latitudeFinRue',
203
				'label' => 'Latitude de fin de la rue',
204
				'label' => 'Latitude de fin de la rue',
204
				'valeur' => $coords_fin_rue[0]);
205
				'valeur' => $coords_fin_rue[0]);
205
			$champs_etendus[] = array('id_observation' => $id,
206
			$champs_etendus[] = array('id_observation' => $id,
206
				'cle' => 'longitudeFinRue',
207
				'cle' => 'longitudeFinRue',
207
				'label' => 'Longitude de fin de la rue',
208
				'label' => 'Longitude de fin de la rue',
208
				'valeur' => $coords_fin_rue[1]);
209
				'valeur' => $coords_fin_rue[1]);
209
		}
210
		}
210
		if ($lieu_dit != '') {
211
		if ($lieu_dit != '') {
211
			$champs_etendus[] = array('id_observation' => $id,
212
			$champs_etendus[] = array('id_observation' => $id,
212
				'cle' => 'adresse',
213
				'cle' => 'adresse',
213
				'label' => 'Adresse',
214
				'label' => 'Adresse',
214
				'valeur' => $lieu_dit);
215
				'valeur' => $lieu_dit);
215
		}
216
		}
216
		if (preg_match('/^(?:2cotes|pair|impair)$/', $cote_rue)) {
217
		if (preg_match('/^(?:2cotes|pair|impair)$/', $cote_rue)) {
217
			$champs_etendus[] = array('id_observation' => $id,
218
			$champs_etendus[] = array('id_observation' => $id,
218
				'cle' => 'coteRue',
219
				'cle' => 'coteRue',
219
				'label' => 'Côté rue',
220
				'label' => 'Côté rue',
220
				'valeur' => $cote_rue);
221
				'valeur' => $cote_rue);
221
		}
222
		}
222
 
223
 
223
		return $champs_etendus;
224
		return $champs_etendus;
224
	}
225
	}
225
}
226
}
226
?>
227
?>