Subversion Repositories eFlore/Applications.cel

Rev

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

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