Subversion Repositories eFlore/Applications.cel

Rev

Rev 792 | Rev 938 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
416 aurelien 1
<?php
550 jpm 2
// declare(encoding='UTF-8');
416 aurelien 3
/**
4
 * Service fournissant une carte dynamique des obsertions publiques du CEL.
5
 * Encodage en entrée : utf8
6
 * Encodage en sortie : utf8
7
 *
8
 * Cas d'utilisation :
9
 * /CelWidgetMap/Carte/Utilisateur : carte des observations publiques d'un utilisateur.
10
 * /CelWidgetMap/Carte/Utilisateur/Projet : carte des observations publiques d'un utilisateur pour un projet.
485 delphine 11
 * /CelWidgetMap/Carte/Utilisateur/Projet/dept : carte des observations publiques d'un utilisateur pour un projet sur un département.
12
 * /CelWidgetMap/Carte/Utilisateur/Projet/dept/num_taxon : carte des observations publiques d'un utilisateur pour un projet sur un département pour un taxon.
416 aurelien 13
 *
14
 * Carte = Type de carte. Valeurs possible : defaut,
15
 * Utilisateur = identifiant (= courriel) de l'utilisateur ou * pour tous les utilisateurs.
16
 * Projet = mot-clé du projet
17
 *
18
 * @author Jean-Pascal MILCENT <jpm@clapas.org>
19
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
20
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
21
 * @version $Id$
22
 * @copyright © 2010, Jean-Pascal MILCENT
23
 */
519 jpm 24
// TODO : supprimer le TRIM quand les obs seront reliées correctements aux localisations (sur le code INSEE par exemple)
416 aurelien 25
class CelWidgetMap extends Cel {
485 delphine 26
 
416 aurelien 27
	/**
28
	 * Méthode appelée avec une requête de type GET.
29
	 */
840 jpm 30
	public function getElement($ressources) {
416 aurelien 31
		$retour = null;
840 jpm 32
		extract($this->parametres);
485 delphine 33
 
840 jpm 34
		$action = array_shift($ressources);
35
		if (isset($action)) {
36
			$methode = $this->traiterNomMethodeGet($action);
416 aurelien 37
			if (method_exists($this, $methode)) {
840 jpm 38
				$retour = $this->$methode($ressources);
416 aurelien 39
			} else {
840 jpm 40
				$this->messages[] = "Ce type de ressource '$methode' n'est pas disponible.";
416 aurelien 41
			}
42
		} else {
840 jpm 43
			$this->messages[] = "Vous devez indiquer le type de ressource.";
416 aurelien 44
		}
45
 
46
		if (is_null($retour)) {
47
			$info = 'Un problème est survenu : '.print_r($this->messages, true);
48
			$this->envoyer($info);
49
		} else if ($retour['type'] == 'json') {
694 jpm 50
			$this->envoyerJsonVar($retour['variable_js'], $retour['donnees']);
489 jpm 51
		}  else if ($retour['type'] == 'jsonp') {
584 jpm 52
			$this->envoyerJsonp($retour['donnees']);
474 jpm 53
		} else {
54
			$this->envoyer($retour, null, null, true);
416 aurelien 55
		}
56
	}
57
 
58
	/**
59
	 * Données de la carte par défaut
60
	 */
474 jpm 61
	public function getCarteDefautJson($params) {
416 aurelien 62
		$json = null;
840 jpm 63
		extract($this->parametres);
600 jpm 64
		$dept = $this->traiterValeursMultiples($dept);
485 delphine 65
 
840 jpm 66
		$clause_from = 	'cel_inventory AS i '.
67
                    	'   LEFT JOIN locations AS l '.
68
                    	'       ON (l.name = i.location AND l.code = i.id_location)';
69
		$clause_where = "transmission = '1' ".
70
                    (!$this->etreNull($utilisateur) ? " AND identifiant = |$utilisateur| " : '' ).
71
                    (!$this->etreNull($dept) ? " AND l.code IN ($dept) " : '').
72
                    (!$this->etreNull($num_taxon) ? " AND num_taxon = |$num_taxon| " : '' ).
73
                    (!$this->etreNull($commune) ? " AND location LIKE |$commune| " : '' ).
74
                    (!$this->etreNull($projet) ? ' AND ('.$this->getSqlWhereProjet($projet).') ' : '' );
75
 
487 jpm 76
		$requete =  'SELECT sector, x_utm, y_utm '.
840 jpm 77
                    "FROM $clause_from ".
78
                    "WHERE $clause_where";
79
		$resultats = $this->requeter($requete);
485 delphine 80
 
416 aurelien 81
		// Traitement des résultats
499 jpm 82
		$mm = null;
840 jpm 83
		$stations = array();
84
		if ($resultats !== false) {
85
			foreach ($resultats as $enrg) {
86
				if ($enrg['x_utm'] != null && $enrg['y_utm'] != null) {
87
					$convertisseur = new gPoint();
88
					$convertisseur->setUTM($enrg['x_utm'], $enrg['y_utm'], $enrg['sector']);
89
					$convertisseur->convertTMtoLL();
90
					$enrg['coord_x'] = $convertisseur->Lat();
91
					$enrg['coord_y'] = $convertisseur->Long();
92
					$enrg['id'] = 'UTM:'.$enrg['x_utm'].'-'.$enrg['y_utm'].'-'.$enrg['sector'];
93
 
94
					$id = $enrg['coord_x'].'-'.$enrg['coord_y'];
95
					if (!isset($stations[$id])) {
96
						$stations[$id] = $enrg;
97
						$stations[$id]['nbre'] = 1;
98
					} else {
99
						$stations[$id]['nbre']++;
100
					}
101
 
102
					// Détermination x et y min et max
103
					if (is_null($mm)) {
104
						$mm = array('min_x' => $enrg['coord_x'],
105
							'max_x' => $enrg['coord_x'],
106
							'min_y' => $enrg['coord_y'],
107
							'max_y' => $enrg['coord_y']);
108
					} else {
109
						$mm['min_x'] = ($mm['min_x'] > $enrg['coord_x']) ? $enrg['coord_x'] : $mm['min_x'];
110
						$mm['min_y'] = ($mm['min_y'] > $enrg['coord_y']) ? $enrg['coord_y'] : $mm['min_y'];
111
						$mm['max_x'] = ($mm['max_x'] < $enrg['coord_x']) ? $enrg['coord_x'] : $mm['max_x'];
112
						$mm['max_y'] = ($mm['max_y'] < $enrg['coord_y']) ? $enrg['coord_y'] : $mm['max_y'];
113
					}
499 jpm 114
				}
416 aurelien 115
			}
116
		}
840 jpm 117
		$stations = array_values($stations);
118
 
119
		$requete =  'SELECT COUNT(id) AS nbre '.
120
                    "FROM $clause_from ".
121
                    "WHERE $clause_where ";
122
		$obs_nbre = (int) $this->requeter($requete, Cel::SQL_RETOUR_COLONNE);
416 aurelien 123
 
124
		// Création des infos du widget
489 jpm 125
		$json['type'] = (isset($this->formatRetour)) ? $this->formatRetour : 'json';
416 aurelien 126
		$json['variable_js'] = 'obs';
489 jpm 127
 
840 jpm 128
		$json['donnees']['points'] = $stations;
129
		$json['donnees']['stats']['communes'] = count($stations);
130
		$json['donnees']['stats']['observations'] = $obs_nbre;
499 jpm 131
		$json['donnees']['centre_x'] = $mm['min_x'].'-'.$mm['max_x'];
132
		$json['donnees']['centre_y'] = $mm['min_y'].'-'.$mm['max_y'];
416 aurelien 133
		return $json;
134
	}
474 jpm 135
 
136
	/**
137
	 * Données pour l'affichage des obs d'une station
138
	 */
139
	public function getObservations($params) {
140
		$json = null;
840 jpm 141
		extract($this->parametres);
600 jpm 142
		$dept = $this->traiterValeursMultiples($dept);
474 jpm 143
 
487 jpm 144
		// Récupération des coordonnées depuis l'id station
840 jpm 145
		$this->debug[] = $station;
474 jpm 146
		list($type, $coord) = explode(':', $station);
147
		if ($type == 'UTM') {
148
			list($x_utm, $y_utm, $secteur) = explode('-', $coord);
149
		} else if ($type == 'LngLat') {
150
			list($coord_y, $coord_x) = explode('-', $coord);
151
		}
487 jpm 152
 
153
		// Récupération du filtre where pour les mots clés "projet"
154
		if (isset($projet)) {
155
			$projet_sql = $this->getSqlWhereProjet($projet);
156
		}
474 jpm 157
 
550 jpm 158
		$requete = 	'SELECT id, identifiant, nom_sel, nom_ret, num_nom_sel, num_nom_ret, num_taxon, famille, '.
474 jpm 159
					'	lieudit, location, date_observation, milieu, commentaire, '.
487 jpm 160
					'	sector, x_utm, y_utm, insee_code '.
474 jpm 161
					'FROM cel_inventory AS i '.
162
					'	LEFT JOIN locations AS l '.
604 jpm 163
					"		ON (l.name = i.location AND l.code = i.id_location) ".
474 jpm 164
					"WHERE transmission = '1' ".
840 jpm 165
					(($type == 'UTM') ? "	AND (sector = |$secteur| AND x_utm = |$x_utm| AND y_utm = |$y_utm| ) " : '').
166
					(($type == 'LngLat') ? "	AND (coord_x = |$coord_x| AND coord_y = |$coord_y| ) " : '').
167
					(isset($utilisateur) ? " AND identifiant = |$utilisateur| " : '').
168
                    (isset($num_taxon) ? " AND num_taxon = |$num_taxon| " : '' ).
520 jpm 169
                    ((isset($projet) && $projet_sql != '') ? " AND ($projet_sql) " : '' ).
840 jpm 170
                    'ORDER BY nom_sel ASC '.
171
                    "LIMIT {$this->start},{$this->limit} ";
172
		$this->debug[] = $requete;
173
		$resultats = $this->requeter($requete);
474 jpm 174
 
175
		// Post-traitement
487 jpm 176
		if (is_array($resultats)) {
177
			$resultats = $this->nettoyerTableau($resultats);
178
		}
474 jpm 179
 
180
		return $resultats;
181
	}
478 jpm 182
 
183
	/**
840 jpm 184
	 * Nombre d'obs d'une station
185
	 */
186
	public function getObservationsNombre($params) {
187
		$json = null;
188
		extract($this->parametres);
189
		$dept = $this->traiterValeursMultiples($dept);
190
 
191
		// Récupération des coordonnées depuis l'id station
192
		$this->debug[] = $station;
193
		list($type, $coord) = explode(':', $station);
194
		if ($type == 'UTM') {
195
			list($x_utm, $y_utm, $secteur) = explode('-', $coord);
196
		} else if ($type == 'LngLat') {
197
			list($coord_y, $coord_x) = explode('-', $coord);
198
		}
199
 
200
		// Récupération du filtre where pour les mots clés "projet"
201
		if (isset($projet)) {
202
			$projet_sql = $this->getSqlWhereProjet($projet);
203
		}
204
 
205
		$requete = 	'SELECT COUNT(id) AS nbre '.
206
					'FROM cel_inventory AS i '.
207
					'	LEFT JOIN locations AS l '.
208
					'		ON (l.name = i.location AND l.code = i.id_location) '.
209
					"WHERE transmission = '1' ".
210
					(($type == 'UTM') ? "	AND (sector = |$secteur| AND x_utm = |$x_utm| AND y_utm = |$y_utm| ) " : '').
211
					(($type == 'LngLat') ? "	AND (coord_x = |$coord_x| AND coord_y = |$coord_y| ) " : '').
212
					(isset($utilisateur) ? " AND identifiant = |$utilisateur| " : '').
213
                    (isset($num_taxon) ? " AND num_taxon = |$num_taxon| " : '' ).
214
                    ((isset($projet) && $projet_sql != '') ? " AND ($projet_sql) " : '' );
215
 
216
		$nbre = $this->requeter($requete, Cel::SQL_RETOUR_COLONNE);
217
 
218
		return $nbre;
219
	}
220
 
221
	/**
478 jpm 222
	 * Liste des taxons présents sur la carte
223
	 */
224
	public function getTaxons($params) {
489 jpm 225
		$json = null;
840 jpm 226
		extract($this->parametres);
600 jpm 227
		$dept = $this->traiterValeursMultiples($dept);
489 jpm 228
		// Récupération du filtre where pour les mots clés "projet"
229
		if (isset($projet)) {
230
			$projet_sql = $this->getSqlWhereProjet($projet);
231
		}
232
 
533 jpm 233
		$requete = 	'SELECT DISTINCT nom_sel, num_nom_sel, nom_ret, num_nom_ret, num_taxon, famille '.
489 jpm 234
					'FROM cel_inventory AS i '.
235
					'	LEFT JOIN locations AS l '.
604 jpm 236
					"		ON (l.name = i.location AND l.code = i.id_location) ".
489 jpm 237
					"WHERE transmission = '1' ".
840 jpm 238
					(!$this->etreNull($utilisateur) ? " AND identifiant = '$utilisateur' " : '').
239
					(!$this->etreNull($num_taxon) ? " AND num_taxon = '$num_taxon' " : '' ).
240
					(!$this->etreNull($dept) ? " AND l.code IN ($dept) " : '').
241
					(!$this->etreNull($commune) ? " AND location LIKE |$commune| " : '' ).
242
                    ((!$this->etreNull($projet) && $projet_sql != '') ? " AND ($projet_sql) " : '' ).
499 jpm 243
                    'ORDER BY nom_ret ASC ';
840 jpm 244
		$this->debug[] = $requete;
489 jpm 245
 
246
		$resultats = $this->executerRequete($requete);
247
 
248
		// Post-traitement
249
		if (is_array($resultats)) {
250
			$resultats = $this->nettoyerTableau($resultats);
251
		}
252
 
253
		return $resultats;
478 jpm 254
	}
255
 
487 jpm 256
	/**
257
	 * Traitement de $projet pour construction du filtre dans la requête
258
	 */
259
	private function getSqlWhereProjet($projet) {
260
		$mot_cle_encode = $this->bdd->quote($this->encoderMotCle($projet));
261
 
262
		// Construction de la requête
263
		$requete = 	'SELECT * '.
264
					'FROM cel_mots_cles_obs '.
265
					"WHERE cmc_id_mot_cle_general = $mot_cle_encode ";
266
		$elements_projet = $this->executerRequete($requete);
267
 
268
		$requete_projet = array();
269
		if ($elements_projet != false && count($elements_projet) > 0) {
270
			// Pré-construction du where de la requête
271
			$tpl_where = '(mots_cles LIKE "%%%s%%" AND identifiant = %s )';
272
 
273
			foreach ($elements_projet as $occurence) {
274
				$requete_projet[] = sprintf($tpl_where, $occurence['cmc_id_mot_cle_utilisateur'], $this->bdd->quote($occurence['cmc_id_proprietaire']));
275
			}
276
		} else {
277
			$this->messages[] = "Aucune observation ne correspond à ce mot clé.";
278
		}
279
 
280
		$sql = implode(" \nOR ", $requete_projet);
281
		return $sql;
840 jpm 282
	}
283
 
416 aurelien 284
}