Subversion Repositories eFlore/Applications.cel

Rev

Rev 428 | Go to most recent revision | Details | 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;
28
		$parametres = $this->traiterParametres(array('carte', 'utilisateur', 'projet'), $params, false);
29
		extract($parametres);
30
 
31
		if (isset($carte)) {
32
			$methode = $this->traiterNomMethodeGet($carte);
33
			if (method_exists($this, $methode)) {
34
				$retour = $this->$methode($parametres);
35
			} else {
36
				$this->messages[] = "Ce type de carte '$methode' n'est pas disponible.";
37
			}
38
		} else {
39
			$this->messages[] = "Vous devez indiquer le type de carte.";
40
		}
41
 
42
		if (is_null($retour)) {
43
			$info = 'Un problème est survenu : '.print_r($this->messages, true);
44
			$this->envoyer($info);
45
		} else if ($retour['type'] == 'widget') {
46
			$squelette = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR.$retour['squelette'].'.tpl.html';
47
			$html = $this->traiterSquelettePhp($squelette, $retour['donnees']);
48
			$this->envoyer($html);
49
		} else if ($retour['type'] == 'json') {
50
			$this->envoyerJson($retour['variable_js'], $retour['donnees']);
51
		}
52
	}
53
 
54
	/**
55
	 * Carte par défaut
56
	 */
57
	public function getCarteDefaut($parametres) {
58
		$widget = null;
59
		extract($parametres);
60
 
61
		// Création url données json
62
		$url_json = sprintf($this->config['settings']['baseURLAbsoluDyn'], 'CelWidgetMap');
63
		$url_json .= '/carte-defaut-json/';
64
		$url_json .= (isset($utilisateur) ? $utilisateur : '*');
65
 
66
		$url_base = sprintf($this->config['settings']['baseURLAbsoluDyn'], '');
67
 
68
		// Création des infos du widget
69
		$widget['type'] = 'widget';
70
		$widget['donnees']['url_json'] = $url_json;
71
		$widget['donnees']['url_base'] = $url_base;
72
		$widget['squelette'] = 'carte_defaut';
73
 
74
		return $widget;
75
	}
76
 
77
	/**
78
	 * Données de la carte par défaut
79
	 */
80
	public function getCarteDefautJson($parametres) {
81
		$json = null;
82
		extract($parametres);
83
 
84
		$requete = 	'SELECT sector, x_utm, y_utm, coord_x, coord_y, ref_geo '.
85
					'FROM cel_inventory AS i '.
86
					'	LEFT JOIN locations AS l '.
87
					'		ON (l.name = i.location AND l.code = i.id_location) '.
88
					"WHERE transmission = '1' ".
89
					(isset($utilisateur) ? " AND identifiant = '$utilisateur' " : '');
90
					$resultats = $this->executerRequete($requete);
91
 
92
		// Traitement des résultats
93
		$mm = array('min_x' => 0,'max_x' => 0,'min_y' => 0,'max_y' => 0);
94
		$points = array();
95
		foreach ($resultats as $enrg) {
96
			if ($enrg['coord_x'] == '' && $enrg['coord_y'] == '' && $enrg['x_utm'] != '' && $enrg['y_utm'] != '') {
97
				$convertisseur = new gPoint();
98
				$convertisseur->setUTM($enrg['x_utm'], $enrg['y_utm'], $enrg['sector']);
99
				$convertisseur->convertTMtoLL();
100
				$enrg['coord_x'] = $convertisseur->Lat();
101
				$enrg['coord_y'] = $convertisseur->Long();
102
			}
103
 
104
 
105
			$id = $enrg['coord_x'].'-'.$enrg['coord_y'];
106
			if (!isset($points[$id])) {
107
				$points[$id] = $enrg;
108
				$points[$id]['nbre'] = 1;
109
			} else {
110
				$points[$id]['nbre']++;
111
			}
112
 
113
			// Détermination x et y min et max
114
			$mm['min_x'] = ($mm['min_x'] > $enrg['coord_x']) ? $enrg['coord_x'] : $mm['min_x'];
115
			$mm['min_y'] = ($mm['min_y'] > $enrg['coord_y']) ? $enrg['coord_y'] : $mm['min_y'];
116
			$mm['max_x'] = ($mm['max_x'] < $enrg['coord_x']) ? $enrg['coord_x'] : $mm['max_x'];
117
			$mm['max_y'] = ($mm['max_y'] < $enrg['coord_y']) ? $enrg['coord_y'] : $mm['max_y'];
118
		}
119
 
120
		// Post-traitement des résultats
121
		$x_moyen = str_replace(',', '.', ($mm['max_x'] - $mm['min_x']));
122
		$y_moyen = str_replace(',', '.', ($mm['max_y'] - $mm['min_y']));
123
		$points = array_values($points);
124
 
125
		// Création des infos du widget
126
		$json['type'] = 'json';
127
		$json['variable_js'] = 'obs';
128
		$json['donnees']['points'] = $points;
129
		$json['donnees']['nombre'] = count($points);
130
		$json['donnees']['centre_x'] = $x_moyen;
131
		$json['donnees']['centre_y'] = $y_moyen;
132
 
133
 
134
		//echo '<pre>'.print_r($json, true).'</pre>';
135
		return $json;
136
	}
137
}