Subversion Repositories eFlore/Applications.cel

Rev

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