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 |
|