Subversion Repositories eFlore/Applications.cel

Rev

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

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