Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 1142 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1142 Rev 1150
Line 31... Line 31...
31
	private $bdd = null;
31
	private $bdd = null;
Line 32... Line 32...
32
 
32
 
33
	private $lat = null;
33
	private $lat = null;
34
	private $lon = null;
34
	private $lon = null;
-
 
35
	private $zone = null;
-
 
36
	private $niveaux = null;
-
 
37
	
-
 
38
	private $masque = null;
Line 35... Line 39...
35
	private $zone = null;
39
	private $limite = 1;
36
 
40
 
37
	public function __construct(Bdd $bdd) {
41
	public function __construct(Bdd $bdd) {
Line 38... Line 42...
38
		$this->bdd = $bdd;
42
		$this->bdd = $bdd;
39
	}
43
	}
40
 
44
 
-
 
45
	public function consulter($ressources, $parametres) {
-
 
46
		$this->parametres = $parametres;
41
	public function consulter($ressources, $parametres) {
47
		$this->verifierParametres();
42
		$this->parametres = $parametres;
48
		$this->masque = isset($this->parametres['masque']) ? $this->parametres['masque'] : null;
43
		$this->verifierParametres();
49
		$this->limite = isset($this->parametres['limite']) ? intval($this->parametres['limite']) : $this->limite;
-
 
50
		$this->lat = isset($this->parametres['lat']) ? $this->parametres['lat'] : null;
44
		$this->lat = $this->parametres['lat'];
51
		$this->lon = isset($this->parametres['lon']) ? $this->parametres['lon'] : null;
-
 
52
		$this->zone = isset($this->parametres['zone']) ? $this->parametres['zone'] : null;
-
 
53
		$this->niveaux = isset($this->parametres['niveau']) ? explode(',', $this->parametres['niveau']) : null;
-
 
54
		
45
		$this->lon = $this->parametres['lon'];
55
		if($this->masque != null) {
46
		$this->zone = isset($this->parametres['zone']) ? $this->parametres['zone'] : null;
56
			$corps = $this->rechercherZoneGeoParNom($this->masque, $this->niveaux, $this->limite);
-
 
57
		} else {
Line 47... Line 58...
47
 
58
			$zoneTrouveeInfos = $this->localiserPointLatLon();
48
		$zoneTrouveeInfos = $this->localiserPointLatLon();
59
			$corps = $this->formaterResultats($zoneTrouveeInfos);
49
		$corps = $this->formaterResultats($zoneTrouveeInfos);
60
		}
50
 
61
 
51
		$resultat = new ResultatService();
62
		$resultat = new ResultatService();
Line 52... Line 63...
52
		$resultat->mime = self::MIME_JSON;
63
		$resultat->mime = self::MIME_JSON;
53
		$resultat->corps = $corps;
64
		$resultat->corps = $corps;
54
		return $resultat;
65
		return $resultat;
-
 
66
	}
-
 
67
 
-
 
68
	private function verifierParametres() {
-
 
69
		extract($this->parametres);
-
 
70
		$messages = array();
-
 
71
		
55
	}
72
		if(array_key_exists('masque', $this->parametres)) {
56
 
73
			if (empty($masque)) {
57
	private function verifierParametres() {
74
				$messages[] = "S'il est présent le paramètre recherche ne peut pas être vide";
58
		extract($this->parametres);
75
			}
59
		$messages = array();
76
		} else {	
60
		if (! array_key_exists('lat', $this->parametres)) {
77
			if (! array_key_exists('lat', $this->parametres)) {
61
			$messages[] = "Vous devez indiquer une latitude en degré décimal à l'aide du paramètres d'url : lat";
78
				$messages[] = "Vous devez indiquer une latitude en degré décimal à l'aide du paramètres d'url : lat";
62
		} else if (!preg_match(self::PATTERN_LAT, $lat)) {
79
			} else if (!preg_match(self::PATTERN_LAT, $lat)) {
63
			$messages[] = "La valeur de latitude doit être un nombre décimal positif dont le séparateur décimal est un point. Ex. : 44 ou 43.03";
80
				$messages[] = "La valeur de latitude doit être un nombre décimal dont le séparateur décimal est un point. Ex. : 44 ou 43.03";
-
 
81
			}
64
		}
82
			if (! array_key_exists('lon', $this->parametres)) {
65
		if (! array_key_exists('lon', $this->parametres)) {
83
				$messages[] = "Vous devez indiquer une longitude en degré décimal à l'aide du paramètres d'url : lon";
66
			$messages[] = "Vous devez indiquer une longitude en degré décimal à l'aide du paramètres d'url : lon";
84
			} else if (!preg_match(self::PATTERN_LON, $lon)) {
67
		} else if (!preg_match(self::PATTERN_LON, $lon)) {
85
				$messages[] = "La valeur de longitude doit être un nombre décimal dont le séparateur décimal est un point. Ex. : -4.03 ou 3.256";
68
			$messages[] = "La valeur de longitude doit être un nombre décimal dont le séparateur décimal est un point. Ex. : -4.03 ou 3.256";
86
			}
Line 129... Line 147...
129
		return $osmIdsInClause;
147
		return $osmIdsInClause;
130
	}
148
	}
Line 131... Line 149...
131
 
149
 
132
	private function construireRequeteUnion() {
150
	private function construireRequeteUnion() {
-
 
151
		$zone = isset($this->zone) ? $this->bdd->proteger($this->zone) : null;
-
 
152
		$niveaux = isset($this->niveaux) ? $this->niveaux : null;
133
		$zone = isset($this->zone) ? $this->bdd->proteger($this->zone) : null;
153
		
134
		$requeteTpl = 'SELECT osm_id, '.
154
		$requeteTpl = 'SELECT osm_id, '.
135
			"(($this->lon - centre_lng) * ($this->lon -centre_lng) + ($this->lat - centre_lat) * ($this->lat - centre_lat)) AS distance ".
155
			"(($this->lon - centre_lng) * ($this->lon -centre_lng) + ($this->lat - centre_lat) * ($this->lat - centre_lat)) AS distance ".
136
			'FROM osm_zones_admin '.
156
			'FROM osm_zones_admin '.
137
			'WHERE niveau = %s '.
157
			'WHERE niveau = %s '.
138
			(isset($zone) ? "AND zone = $zone " : '').
158
			(isset($zone) ? "AND zone = $zone " : '').
139
			'ORDER BY distance ASC '.
159
			'ORDER BY distance ASC '.
140
			"LIMIT %s ";
160
			"LIMIT %s ";
141
		$niveaux = array(2,3,4,5,6,7,8);
161
		$niveaux = isset($niveaux) ? $niveaux : array(2,3,4,5,6,7,8);
142
		$requetesAUnir = array();
162
		$requetesAUnir = array();
143
		foreach ($niveaux as $niveau) {
163
		foreach ($niveaux as $niveau) {
144
			$requetesAUnir[] = sprintf($requeteTpl, $niveau, ($niveau * 2));
164
			$requetesAUnir[] = sprintf($requeteTpl, $this->bdd->proteger($niveau), ($niveau * 2));
145
		}
165
		}
146
		$requete = '('.implode(') UNION (', $requetesAUnir).') -- '.__FILE__.' : '.__LINE__;
166
		$requete = '('.implode(') UNION (', $requetesAUnir).') -- '.__FILE__.' : '.__LINE__;
147
		return $requete;
167
		return $requete;
Line 151... Line 171...
151
		list($lang, $page) = explode(':', $infoWikipedia);
171
		list($lang, $page) = explode(':', $infoWikipedia);
152
		$pageEncode = rawurlencode($page);
172
		$pageEncode = rawurlencode($page);
153
		$urlTpl = 'https://%s.wikipedia.org/wiki/%s';
173
		$urlTpl = 'https://%s.wikipedia.org/wiki/%s';
154
		return sprintf($urlTpl, $lang, $pageEncode);
174
		return sprintf($urlTpl, $lang, $pageEncode);
155
	}
175
	}
-
 
176
	
-
 
177
	public function rechercherZoneGeoParNom($masque, $niveaux = null, $limite = 1) {
-
 
178
		$masque_fmt = str_replace(array(' ', '-'), '_', $masque);
-
 
179
		// Cas d'une recherche pour autocompletion
-
 
180
		$masque_fmt = ($limite > 1) ? $masque_fmt.'%' : $masque_fmt;
-
 
181
		
-
 
182
		$champs = 'id_zone_geo, osm_id, intitule, centre_lat, centre_lng, '.
-
 
183
					'zone, niveau, code_iso_3166_1, code_iso_3166_2, code_insee, '.
-
 
184
					'nom, nom_fr, nom_en, nom_es, wikipedia';
-
 
185
		
-
 
186
		$champs_tri = 'IF(ISNULL(nom_fr), 0, 1) as nom_fr_present, '.
-
 
187
				'IF(ISNULL(nom_en), 0, 1) as nom_en_present, '.
-
 
188
				'IF(ISNULL(nom_es), 0, 1) as nom_es_present, '.
-
 
189
				'IF(ISNULL(intitule), 0, 1) as intitule_present, '.
-
 
190
				'IF(ISNULL(nom), 0, 1) as nom_present ';
-
 
191
		
-
 
192
		$ordre = 'nom_present DESC, nom_fr_present DESC, nom_fr_present DESC, '.
-
 
193
				 'nom_es_present DESC, intitule_present DESC, niveau DESC';
-
 
194
		
-
 
195
		$niveau_str = array();
-
 
196
		foreach ($niveaux as $niveau) {
-
 
197
			$niveau_str[] = $this->bdd->proteger($niveau);
-
 
198
		}
-
 
199
		
-
 
200
		$requete = "SELECT $champs, $champs_tri FROM osm_zones_admin ".
-
 
201
					"WHERE ".
-
 
202
						(!empty($niveau_str) ? ("niveau IN (".implode(',', $niveau_str).") AND ") : "").
-
 
203
						"(nom LIKE ".$this->bdd->proteger($masque_fmt).' OR '.
-
 
204
						"intitule LIKE ".$this->bdd->proteger($masque_fmt).' OR '.
-
 
205
						"nom_fr LIKE ".$this->bdd->proteger($masque_fmt).' OR '.
-
 
206
						"nom_en LIKE ".$this->bdd->proteger($masque_fmt).' OR '.
-
 
207
						"nom_es LIKE ".$this->bdd->proteger($masque_fmt).') '.
-
 
208
				"ORDER BY ".$ordre." LIMIT ".$limite;
-
 
209
 
-
 
210
		$resultat = $this->bdd->recupererTous($requete);
-
 
211
		if (empty($resultat)) {
-
 
212
			$msgTpl = "Service '%s' : aucune zone correspondant au nom : %s .";
-
 
213
			$msg = sprintf($msgTpl, get_class($this), $masque);
-
 
214
			throw new Exception($msg, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
-
 
215
		} else {
-
 
216
			$resultat = ($limite == 1) ? $resultat[0] : $resultat;
-
 
217
		}
-
 
218
		
-
 
219
		return $resultat;
-
 
220
	}
156
}
221
}
157
222