Subversion Repositories eFlore/Applications.cel

Rev

Rev 478 | Rev 487 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 478 Rev 485
1
<?php
1
<?php
2
/**
2
/**
3
 * Service fournissant une carte dynamique des obsertions publiques du CEL.
3
 * Service fournissant une carte dynamique des obsertions publiques du CEL.
4
 * Encodage en entrée : utf8
4
 * Encodage en entrée : utf8
5
 * Encodage en sortie : utf8
5
 * Encodage en sortie : utf8
6
 *
6
 *
7
 * Cas d'utilisation :
7
 * Cas d'utilisation :
8
 * /CelWidgetMap/Carte/Utilisateur : carte des observations publiques d'un utilisateur.
8
 * /CelWidgetMap/Carte/Utilisateur : carte des observations publiques d'un utilisateur.
9
 * /CelWidgetMap/Carte/Utilisateur/Projet : carte des observations publiques d'un utilisateur pour un projet.
9
 * /CelWidgetMap/Carte/Utilisateur/Projet : carte des observations publiques d'un utilisateur pour un projet.
-
 
10
 * /CelWidgetMap/Carte/Utilisateur/Projet/dept : carte des observations publiques d'un utilisateur pour un projet sur un département.
-
 
11
 * /CelWidgetMap/Carte/Utilisateur/Projet/dept/num_taxon : carte des observations publiques d'un utilisateur pour un projet sur un département pour un taxon.
10
 *
12
 *
11
 * Carte = Type de carte. Valeurs possible : defaut,
13
 * Carte = Type de carte. Valeurs possible : defaut,
12
 * Utilisateur = identifiant (= courriel) de l'utilisateur ou * pour tous les utilisateurs.
14
 * Utilisateur = identifiant (= courriel) de l'utilisateur ou * pour tous les utilisateurs.
13
 * Projet = mot-clé du projet
15
 * Projet = mot-clé du projet
14
 *
16
 *
15
 * @author Jean-Pascal MILCENT <jpm@clapas.org>
17
 * @author Jean-Pascal MILCENT <jpm@clapas.org>
16
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
18
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
17
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
19
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
18
 * @version $Id$
20
 * @version $Id$
19
 * @copyright © 2010, Jean-Pascal MILCENT
21
 * @copyright © 2010, Jean-Pascal MILCENT
20
 */
22
 */
21
class CelWidgetMap extends Cel {
23
class CelWidgetMap extends Cel {
22
 
24
	
23
	/**
25
	/**
24
	 * Méthode appelée avec une requête de type GET.
26
	 * Méthode appelée avec une requête de type GET.
25
	 */
27
	 */
26
	public function getElement($params) {
28
	public function getElement($params) {
27
		$retour = null;
29
		$retour = null;
28
		$parametres = $this->traiterParametres(array('carte'), $params, false);
30
		$parametres = $this->traiterParametres(array('carte'), $params, false);
29
		extract($parametres);
31
		extract($parametres);
30
 
32
		
31
		if (isset($carte)) {
33
		if (isset($carte)) {
32
			$methode = $this->traiterNomMethodeGet($carte);
34
			$methode = $this->traiterNomMethodeGet($carte);
33
			if (method_exists($this, $methode)) {
35
			if (method_exists($this, $methode)) {
34
				array_shift($params);
36
				array_shift($params);
35
				$retour = $this->$methode($params);
37
				$retour = $this->$methode($params);
36
			} else {
38
			} else {
37
				$this->messages[] = "Ce type de carte '$methode' n'est pas disponible.";
39
				$this->messages[] = "Ce type de carte '$methode' n'est pas disponible.";
38
			}
40
			}
39
		} else {
41
		} else {
40
			$this->messages[] = "Vous devez indiquer le type de carte.";
42
			$this->messages[] = "Vous devez indiquer le type de carte.";
41
		}
43
		}
42
 
44
 
43
		if (is_null($retour)) {
45
		if (is_null($retour)) {
44
			$info = 'Un problème est survenu : '.print_r($this->messages, true);
46
			$info = 'Un problème est survenu : '.print_r($this->messages, true);
45
			$this->envoyer($info);
47
			$this->envoyer($info);
46
		} else if ($retour['type'] == 'json') {
48
		} else if ($retour['type'] == 'json') {
47
			$this->envoyerJson($retour['variable_js'], $retour['donnees']);
49
			$this->envoyerJson($retour['variable_js'], $retour['donnees']);
48
		} else {
50
		} else {
49
			$this->envoyer($retour, null, null, true);
51
			$this->envoyer($retour, null, null, true);
50
		}
52
		}
51
	}
53
	}
52
 
54
 
53
	/**
55
	/**
54
	 * Données de la carte par défaut
56
	 * Données de la carte par défaut
55
	 */
57
	 */
56
	public function getCarteDefautJson($params) {
58
	public function getCarteDefautJson($params) {
57
		$json = null;
59
		$json = null;
58
		$parametres = $this->traiterParametres(array('utilisateur', 'projet'), $params, false);
60
		$parametres = $this->traiterParametres(array('utilisateur','projet','dept','num_taxon'), $params, false);
59
		extract($parametres);
61
		extract($parametres);
60
 
62
		
-
 
63
		// Traitement de $projet pour construction de filtre dans la requête
-
 
64
		if (isset($projet)) {
-
 
65
			$mot_cle_encode = $this->bdd->quote($this->encoderMotCle($projet));
-
 
66
			// Construction de la requête
-
 
67
			$requete = 	'SELECT * '.
-
 
68
				'FROM cel_mots_cles_obs '.
-
 
69
				"WHERE cmc_id_mot_cle_general = $mot_cle_encode ";
-
 
70
			$elements_projet = $this->executerRequete($requete);
-
 
71
			
-
 
72
			if ($elements_projet != false && count($elements_projet) > 0) {
-
 
73
				// Pré-construction du where de la requête
-
 
74
				$tpl_where = '(mots_cles LIKE "%%%s%%" AND identifiant = %s )';
-
 
75
				$requete_projet = array();
-
 
76
				foreach ($elements_projet as $occurence) {
-
 
77
					$requete_projet[] = sprintf($tpl_where, $occurence['cmc_id_mot_cle_utilisateur'], $this->bdd->quote($occurence['cmc_id_proprietaire']));
-
 
78
				}
-
 
79
			} else {
-
 
80
				$this->messages[] = "Aucune observation ne correspond à ce mot clé.";
-
 
81
			}
-
 
82
		}
-
 
83
		
-
 
84
		
61
		$requete = 	'SELECT sector, x_utm, y_utm, coord_x, coord_y, ref_geo '.
85
		$requete =  'SELECT sector, x_utm, y_utm, coord_x, coord_y, ref_geo '.
62
					'FROM cel_inventory AS i '.
86
                    'FROM cel_inventory AS i '.
63
					'	LEFT JOIN locations AS l '.
87
                    '   LEFT JOIN locations AS l '.
64
					'		ON (l.name = i.location AND l.code = i.id_location) '.
88
                    '       ON (l.name = i.location AND l.code = i.id_location) '.
65
					"WHERE transmission = '1' ".
89
                    "WHERE transmission = '1' ".
66
					(isset($utilisateur) ? " AND identifiant = '$utilisateur' " : '');
90
                    (isset($utilisateur) ? " AND identifiant = '$utilisateur' " : '' ).
-
 
91
                    (isset($dept) ? " AND l.insee_code LIKE '$dept%' " : '').
-
 
92
                    (isset($num_taxon) ? " AND num_taxon = '$num_taxon' " : '' ).
-
 
93
                    (isset($projet) ? ' AND '.implode(" \nOR ", $requete_projet) : '' );
67
					$resultats = $this->executerRequete($requete);
94
                    $resultats = $this->executerRequete($requete);
68
 
95
		
69
		// Traitement des résultats
96
		// Traitement des résultats
70
		$mm = array('min_x' => 0,'max_x' => 0,'min_y' => 0,'max_y' => 0);
97
		$mm = array('min_x' => 0,'max_x' => 0,'min_y' => 0,'max_y' => 0);
71
		$points = array();
98
		$points = array();
72
		foreach ($resultats as $enrg) {
99
		foreach ($resultats as $enrg) {
73
			$enrg['id'] = 'LngLat:'.$enrg['coord_y'].'-'.$enrg['coord_x'];
100
			$enrg['id'] = 'LngLat:'.$enrg['coord_y'].'-'.$enrg['coord_x'];
74
			if ($enrg['coord_x'] == '' && $enrg['coord_y'] == '' && $enrg['x_utm'] != '' && $enrg['y_utm'] != '') {
101
			if ($enrg['coord_x'] == '' && $enrg['coord_y'] == '' && $enrg['x_utm'] != '' && $enrg['y_utm'] != '') {
75
				$enrg['id'] = 'UTM:'.$enrg['x_utm'].'-'.$enrg['y_utm'].'-'.$enrg['sector'];
102
				$enrg['id'] = 'UTM:'.$enrg['x_utm'].'-'.$enrg['y_utm'].'-'.$enrg['sector'];
76
				
103
				
77
				$convertisseur = new gPoint();
104
				$convertisseur = new gPoint();
78
				$convertisseur->setUTM($enrg['x_utm'], $enrg['y_utm'], $enrg['sector']);
105
				$convertisseur->setUTM($enrg['x_utm'], $enrg['y_utm'], $enrg['sector']);
79
				$convertisseur->convertTMtoLL();
106
				$convertisseur->convertTMtoLL();
80
				$enrg['coord_x'] = $convertisseur->Lat();
107
				$enrg['coord_x'] = $convertisseur->Lat();
81
				$enrg['coord_y'] = $convertisseur->Long();
108
				$enrg['coord_y'] = $convertisseur->Long();
82
			}
109
			}
83
 
110
 
84
 
111
 
85
			$id = $enrg['coord_x'].'-'.$enrg['coord_y'];
112
			$id = $enrg['coord_x'].'-'.$enrg['coord_y'];
86
			if (!isset($points[$id])) {
113
			if (!isset($points[$id])) {
87
				$points[$id] = $enrg;
114
				$points[$id] = $enrg;
88
				$points[$id]['nbre'] = 1;
115
				$points[$id]['nbre'] = 1;
89
			} else {
116
			} else {
90
				$points[$id]['nbre']++;
117
				$points[$id]['nbre']++;
91
			}
118
			}
92
 
119
 
93
			// Détermination x et y min et max
120
			// Détermination x et y min et max
94
			$mm['min_x'] = ($mm['min_x'] > $enrg['coord_x']) ? $enrg['coord_x'] : $mm['min_x'];
121
			$mm['min_x'] = ($mm['min_x'] > $enrg['coord_x']) ? $enrg['coord_x'] : $mm['min_x'];
95
			$mm['min_y'] = ($mm['min_y'] > $enrg['coord_y']) ? $enrg['coord_y'] : $mm['min_y'];
122
			$mm['min_y'] = ($mm['min_y'] > $enrg['coord_y']) ? $enrg['coord_y'] : $mm['min_y'];
96
			$mm['max_x'] = ($mm['max_x'] < $enrg['coord_x']) ? $enrg['coord_x'] : $mm['max_x'];
123
			$mm['max_x'] = ($mm['max_x'] < $enrg['coord_x']) ? $enrg['coord_x'] : $mm['max_x'];
97
			$mm['max_y'] = ($mm['max_y'] < $enrg['coord_y']) ? $enrg['coord_y'] : $mm['max_y'];
124
			$mm['max_y'] = ($mm['max_y'] < $enrg['coord_y']) ? $enrg['coord_y'] : $mm['max_y'];
98
		}
125
		}
99
 
126
 
100
		// Post-traitement des résultats
127
		// Post-traitement des résultats
101
		$x_moyen = str_replace(',', '.', ($mm['max_x'] - $mm['min_x']));
128
		$x_moyen = str_replace(',', '.', ($mm['max_x'] - $mm['min_x']));
102
		$y_moyen = str_replace(',', '.', ($mm['max_y'] - $mm['min_y']));
129
		$y_moyen = str_replace(',', '.', ($mm['max_y'] - $mm['min_y']));
103
		$points = array_values($points);
130
		$points = array_values($points);
104
 
131
 
105
		// Création des infos du widget
132
		// Création des infos du widget
106
		$json['type'] = 'json';
133
		$json['type'] = 'json';
107
		$json['variable_js'] = 'obs';
134
		$json['variable_js'] = 'obs';
108
		$json['donnees']['points'] = $points;
135
		$json['donnees']['points'] = $points;
109
		$json['donnees']['nombre'] = count($points);
136
		$json['donnees']['nombre'] = count($points);
110
		$json['donnees']['centre_x'] = $x_moyen;
137
		$json['donnees']['centre_x'] = $x_moyen;
111
		$json['donnees']['centre_y'] = $y_moyen;
138
		$json['donnees']['centre_y'] = $y_moyen;
112
 
139
 
113
 
140
 
114
		//echo '<pre>'.print_r($json, true).'</pre>';
141
		//echo '<pre>'.print_r($json, true).'</pre>';
115
		return $json;
142
		return $json;
116
	}
143
	}
117
	
144
	
118
	/**
145
	/**
119
	 * Données pour l'affichage des obs d'une station
146
	 * Données pour l'affichage des obs d'une station
120
	 */
147
	 */
121
	public function getObservations($params) {
148
	public function getObservations($params) {
122
		$json = null;
149
		$json = null;
123
		$parametres = $this->traiterParametres(array('station', 'utilisateur'), $params, false);
150
		$parametres = $this->traiterParametres(array('station', 'utilisateur'), $params, false);
124
		extract($parametres);
151
		extract($parametres);
125
		
152
		
126
		//$this->debug[] = $station;
153
		//$this->debug[] = $station;
127
		list($type, $coord) = explode(':', $station);
154
		list($type, $coord) = explode(':', $station);
128
		if ($type == 'UTM') {
155
		if ($type == 'UTM') {
129
			list($x_utm, $y_utm, $secteur) = explode('-', $coord);
156
			list($x_utm, $y_utm, $secteur) = explode('-', $coord);
130
		} else if ($type == 'LngLat') {
157
		} else if ($type == 'LngLat') {
131
			list($coord_y, $coord_x) = explode('-', $coord);
158
			list($coord_y, $coord_x) = explode('-', $coord);
132
		}
159
		}
133
 
160
 
134
		$requete = 	'SELECT identifiant, nom_sel, nom_ret, num_nom_sel, num_nom_ret, num_taxon, famille, '.
161
		$requete = 	'SELECT identifiant, nom_sel, nom_ret, num_nom_sel, num_nom_ret, num_taxon, famille, '.
135
					'	lieudit, location, date_observation, milieu, commentaire, '.
162
					'	lieudit, location, date_observation, milieu, commentaire, '.
136
					'	sector, x_utm, y_utm, coord_x, coord_y, ref_geo '.
163
					'	sector, x_utm, y_utm, coord_x, coord_y, ref_geo '.
137
					'FROM cel_inventory AS i '.
164
					'FROM cel_inventory AS i '.
138
					'	LEFT JOIN locations AS l '.
165
					'	LEFT JOIN locations AS l '.
139
					'		ON (l.name = i.location AND l.code = i.id_location) '.
166
					'		ON (l.name = i.location AND l.code = i.id_location) '.
140
					"WHERE transmission = '1' ".
167
					"WHERE transmission = '1' ".
141
					(($type == 'UTM') ? "	AND (sector = '$secteur' AND x_utm = '$x_utm' AND y_utm = '$y_utm' ) " : '').
168
					(($type == 'UTM') ? "	AND (sector = '$secteur' AND x_utm = '$x_utm' AND y_utm = '$y_utm' ) " : '').
142
					(($type == 'LngLat') ? "	AND (coord_x = '$coord_x' AND coord_y = '$coord_y' ) " : '').
169
					(($type == 'LngLat') ? "	AND (coord_x = '$coord_x' AND coord_y = '$coord_y' ) " : '').
143
					(isset($utilisateur) ? " AND identifiant = '$utilisateur' " : '');
170
					(isset($utilisateur) ? " AND identifiant = '$utilisateur' " : '');
144
		//$this->debug[] = $requete;
171
		//$this->debug[] = $requete;
145
		$resultats = $this->executerRequete($requete);
172
		$resultats = $this->executerRequete($requete);
146
		
173
		
147
		// Post-traitement
174
		// Post-traitement
148
		$resultats = $this->nettoyerTableau($resultats);
175
		$resultats = $this->nettoyerTableau($resultats);
149
		
176
		
150
		return $resultats;
177
		return $resultats;
151
	}
178
	}
152
	
179
	
153
	/**
180
	/**
154
	 * Liste des taxons présents sur la carte
181
	 * Liste des taxons présents sur la carte
155
	 */
182
	 */
156
	public function getTaxons($params) {
183
	public function getTaxons($params) {
157
		
184
		
158
	}
185
	}
159
	
186
	
160
}
187
}