Subversion Repositories eFlore/Applications.cel

Rev

Rev 2415 | Details | Compare with Previous | Last modification | View Log | RSS feed

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