Subversion Repositories eFlore/Applications.cel

Rev

Rev 2022 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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