Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Details | 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
	 */
30
	public function getElement($params) {
31
		$retour = null;
474 jpm 32
		$parametres = $this->traiterParametres(array('carte'), $params, false);
416 aurelien 33
		extract($parametres);
485 delphine 34
 
416 aurelien 35
		if (isset($carte)) {
36
			$methode = $this->traiterNomMethodeGet($carte);
37
			if (method_exists($this, $methode)) {
474 jpm 38
				array_shift($params);
39
				$retour = $this->$methode($params);
416 aurelien 40
			} else {
41
				$this->messages[] = "Ce type de carte '$methode' n'est pas disponible.";
42
			}
43
		} else {
44
			$this->messages[] = "Vous devez indiquer le type de carte.";
45
		}
46
 
47
		if (is_null($retour)) {
48
			$info = 'Un problème est survenu : '.print_r($this->messages, true);
49
			$this->envoyer($info);
50
		} else if ($retour['type'] == 'json') {
694 jpm 51
			$this->envoyerJsonVar($retour['variable_js'], $retour['donnees']);
489 jpm 52
		}  else if ($retour['type'] == 'jsonp') {
584 jpm 53
			$this->envoyerJsonp($retour['donnees']);
474 jpm 54
		} else {
55
			$this->envoyer($retour, null, null, true);
416 aurelien 56
		}
57
	}
58
 
59
	/**
60
	 * Données de la carte par défaut
61
	 */
474 jpm 62
	public function getCarteDefautJson($params) {
416 aurelien 63
		$json = null;
487 jpm 64
		$parametres = $this->traiterParametres(array('utilisateur', 'projet', 'dept', 'num_taxon'), $params, false);
416 aurelien 65
		extract($parametres);
600 jpm 66
		$dept = $this->traiterValeursMultiples($dept);
485 delphine 67
 
487 jpm 68
		$requete =  'SELECT sector, x_utm, y_utm '.
485 delphine 69
                    'FROM cel_inventory AS i '.
70
                    '   LEFT JOIN locations AS l '.
604 jpm 71
                    "       ON (l.name = i.location AND l.code = i.id_location) ".
485 delphine 72
                    "WHERE transmission = '1' ".
73
                    (isset($utilisateur) ? " AND identifiant = '$utilisateur' " : '' ).
600 jpm 74
                    (isset($dept) ? " AND l.code IN ($dept) " : '').
485 delphine 75
                    (isset($num_taxon) ? " AND num_taxon = '$num_taxon' " : '' ).
487 jpm 76
                    (isset($projet) ? ' AND ('.$this->getSqlWhereProjet($projet).') ' : '' );
485 delphine 77
                    $resultats = $this->executerRequete($requete);
78
 
416 aurelien 79
		// Traitement des résultats
499 jpm 80
		$mm = null;
416 aurelien 81
		$points = array();
82
		foreach ($resultats as $enrg) {
499 jpm 83
			if ($enrg['x_utm'] != null && $enrg['y_utm'] != null) {
84
				$convertisseur = new gPoint();
85
				$convertisseur->setUTM($enrg['x_utm'], $enrg['y_utm'], $enrg['sector']);
86
				$convertisseur->convertTMtoLL();
87
				$enrg['coord_x'] = $convertisseur->Lat();
88
				$enrg['coord_y'] = $convertisseur->Long();
89
				$enrg['id'] = 'UTM:'.$enrg['x_utm'].'-'.$enrg['y_utm'].'-'.$enrg['sector'];
90
 
91
				$id = $enrg['coord_x'].'-'.$enrg['coord_y'];
92
				if (!isset($points[$id])) {
93
					$points[$id] = $enrg;
94
					$points[$id]['nbre'] = 1;
95
				} else {
96
					$points[$id]['nbre']++;
97
				}
98
 
99
				// Détermination x et y min et max
100
				if (is_null($mm)) {
101
					$mm = array('min_x' => $enrg['coord_x'],
102
						'max_x' => $enrg['coord_x'],
103
						'min_y' => $enrg['coord_y'],
104
						'max_y' => $enrg['coord_y']);
105
				} else {
106
					$mm['min_x'] = ($mm['min_x'] > $enrg['coord_x']) ? $enrg['coord_x'] : $mm['min_x'];
107
					$mm['min_y'] = ($mm['min_y'] > $enrg['coord_y']) ? $enrg['coord_y'] : $mm['min_y'];
108
					$mm['max_x'] = ($mm['max_x'] < $enrg['coord_x']) ? $enrg['coord_x'] : $mm['max_x'];
109
					$mm['max_y'] = ($mm['max_y'] < $enrg['coord_y']) ? $enrg['coord_y'] : $mm['max_y'];
110
				}
416 aurelien 111
			}
112
		}
113
		$points = array_values($points);
114
 
115
		// Création des infos du widget
489 jpm 116
		$json['type'] = (isset($this->formatRetour)) ? $this->formatRetour : 'json';
416 aurelien 117
		$json['variable_js'] = 'obs';
489 jpm 118
 
416 aurelien 119
		$json['donnees']['points'] = $points;
120
		$json['donnees']['nombre'] = count($points);
499 jpm 121
		$json['donnees']['centre_x'] = $mm['min_x'].'-'.$mm['max_x'];
122
		$json['donnees']['centre_y'] = $mm['min_y'].'-'.$mm['max_y'];
416 aurelien 123
 
124
 
125
		//echo '<pre>'.print_r($json, true).'</pre>';
126
		return $json;
127
	}
474 jpm 128
 
129
	/**
130
	 * Données pour l'affichage des obs d'une station
131
	 */
132
	public function getObservations($params) {
133
		$json = null;
487 jpm 134
		$parametres = $this->traiterParametres(array('station', 'utilisateur', 'projet', 'dept', 'num_taxon'), $params, false);
474 jpm 135
		extract($parametres);
600 jpm 136
		$dept = $this->traiterValeursMultiples($dept);
474 jpm 137
 
487 jpm 138
		// Récupération des coordonnées depuis l'id station
474 jpm 139
		//$this->debug[] = $station;
140
		list($type, $coord) = explode(':', $station);
141
		if ($type == 'UTM') {
142
			list($x_utm, $y_utm, $secteur) = explode('-', $coord);
143
		} else if ($type == 'LngLat') {
144
			list($coord_y, $coord_x) = explode('-', $coord);
145
		}
487 jpm 146
 
147
		// Récupération du filtre where pour les mots clés "projet"
148
		if (isset($projet)) {
149
			$projet_sql = $this->getSqlWhereProjet($projet);
150
		}
474 jpm 151
 
550 jpm 152
		$requete = 	'SELECT id, identifiant, nom_sel, nom_ret, num_nom_sel, num_nom_ret, num_taxon, famille, '.
474 jpm 153
					'	lieudit, location, date_observation, milieu, commentaire, '.
487 jpm 154
					'	sector, x_utm, y_utm, insee_code '.
474 jpm 155
					'FROM cel_inventory AS i '.
156
					'	LEFT JOIN locations AS l '.
604 jpm 157
					"		ON (l.name = i.location AND l.code = i.id_location) ".
474 jpm 158
					"WHERE transmission = '1' ".
159
					(($type == 'UTM') ? "	AND (sector = '$secteur' AND x_utm = '$x_utm' AND y_utm = '$y_utm' ) " : '').
160
					(($type == 'LngLat') ? "	AND (coord_x = '$coord_x' AND coord_y = '$coord_y' ) " : '').
487 jpm 161
					(isset($utilisateur) ? " AND identifiant = '$utilisateur' " : '').
600 jpm 162
					(isset($dept) ? " AND l.code IN ($dept) " : '').
487 jpm 163
                    (isset($num_taxon) ? " AND num_taxon = '$num_taxon' " : '' ).
520 jpm 164
                    ((isset($projet) && $projet_sql != '') ? " AND ($projet_sql) " : '' ).
165
                    'ORDER BY nom_sel ASC ';
166
 
474 jpm 167
		//$this->debug[] = $requete;
487 jpm 168
 
474 jpm 169
		$resultats = $this->executerRequete($requete);
170
 
171
		// Post-traitement
487 jpm 172
		if (is_array($resultats)) {
173
			$resultats = $this->nettoyerTableau($resultats);
174
		}
474 jpm 175
 
176
		return $resultats;
177
	}
478 jpm 178
 
179
	/**
180
	 * Liste des taxons présents sur la carte
181
	 */
182
	public function getTaxons($params) {
489 jpm 183
		$json = null;
184
		$parametres = $this->traiterParametres(array('utilisateur', 'projet', 'dept', 'num_taxon'), $params, false);
185
		extract($parametres);
600 jpm 186
		$dept = $this->traiterValeursMultiples($dept);
489 jpm 187
		// Récupération du filtre where pour les mots clés "projet"
188
		if (isset($projet)) {
189
			$projet_sql = $this->getSqlWhereProjet($projet);
190
		}
191
 
533 jpm 192
		$requete = 	'SELECT DISTINCT nom_sel, num_nom_sel, nom_ret, num_nom_ret, num_taxon, famille '.
489 jpm 193
					'FROM cel_inventory AS i '.
194
					'	LEFT JOIN locations AS l '.
604 jpm 195
					"		ON (l.name = i.location AND l.code = i.id_location) ".
489 jpm 196
					"WHERE transmission = '1' ".
197
					(isset($utilisateur) ? " AND identifiant = '$utilisateur' " : '').
600 jpm 198
					(isset($dept) ? " AND l.code IN ($dept) " : '').
489 jpm 199
                    (isset($num_taxon) ? " AND num_taxon = '$num_taxon' " : '' ).
499 jpm 200
                    ((isset($projet) && $projet_sql != '') ? " AND ($projet_sql) " : '' ).
201
                    'ORDER BY nom_ret ASC ';
489 jpm 202
		//$this->debug[] = $requete;
203
 
204
		$resultats = $this->executerRequete($requete);
205
 
206
		// Post-traitement
207
		if (is_array($resultats)) {
208
			$resultats = $this->nettoyerTableau($resultats);
209
		}
210
 
211
		return $resultats;
478 jpm 212
	}
213
 
487 jpm 214
	/**
215
	 * Traitement de $projet pour construction du filtre dans la requête
216
	 */
217
	private function getSqlWhereProjet($projet) {
218
		$mot_cle_encode = $this->bdd->quote($this->encoderMotCle($projet));
219
 
220
		// Construction de la requête
221
		$requete = 	'SELECT * '.
222
					'FROM cel_mots_cles_obs '.
223
					"WHERE cmc_id_mot_cle_general = $mot_cle_encode ";
224
		$elements_projet = $this->executerRequete($requete);
225
 
226
		$requete_projet = array();
227
		if ($elements_projet != false && count($elements_projet) > 0) {
228
			// Pré-construction du where de la requête
229
			$tpl_where = '(mots_cles LIKE "%%%s%%" AND identifiant = %s )';
230
 
231
			foreach ($elements_projet as $occurence) {
232
				$requete_projet[] = sprintf($tpl_where, $occurence['cmc_id_mot_cle_utilisateur'], $this->bdd->quote($occurence['cmc_id_proprietaire']));
233
			}
234
		} else {
235
			$this->messages[] = "Aucune observation ne correspond à ce mot clé.";
236
		}
237
 
238
		$sql = implode(" \nOR ", $requete_projet);
239
		return $sql;
600 jpm 240
	}
416 aurelien 241
}