Rev 880 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Classe permettant d'obtenir le nom et le code INSEE des communes les plus proches d'un point (latitude et longitude).* La latitude et longitude doivent être exprimée par un nombre décimal.* Ce service fonctionne uniquement sur les communes des DROM-COM présentent* sur Wikipedia FR à cette adrese : http://fr.wikipedia.org/* Source des données : Wikipedia http://fr.wikipedia.org/* Paramètres du service :* - lat : latitude* - lon : longitude* Exemple :* http://localhost/service:eflore:0.1/wikipedia/nom-commune?lat=44.71546&lon=3.84216** @category php 5.2* @package lion1906* @author Mohcen BENMOUNAH <mohcen@tela-botanica.org>* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL* @version $Id$*/class NomCommune {const PATTERN_LAT = '/^[0-9]+(?:[.][0-9]+|)$/';const PATTERN_LON = '/^[-]?[0-9]+(?:[.][0-9]+|)$/';const NBRE_COMMUNE_PAR_DEFAUT = 10;const NBRE_COMMUNE_MAX = 100;const MIME_JSON = 'application/json';private $bdd = null;public function __construct(Bdd $bdd) {$this->bdd = $bdd;}public function consulter($ressources, $parametres) {$this->parametres = $parametres;$this->ressources = $ressources;$this->definirParametresParDefaut();$this->verifierParametres();$nomINSEEs = $this->trouverCommunesProches();$corps = $this->formaterResultats($nomINSEEs);$resultat = new ResultatService();$resultat->mime = self::MIME_JSON;$resultat->corps = $corps;return $resultat;}private function definirParametresParDefaut() {if (array_key_exists('nbre', $this->parametres) === false) {$this->parametres['nbre'] = self::NBRE_COMMUNE_PAR_DEFAUT;}}private function verifierParametres() {extract($this->parametres);$messages = array();if (! array_key_exists('lat', $this->parametres)) {$messages[] = "Vous devez indiquer une latitude en degré décimal à l'aide du paramètres d'url : lat";} else if (!preg_match(self::PATTERN_LAT, $lat)) {$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";}if (! array_key_exists('lon', $this->parametres)) {$messages[] = "Vous devez indiquer une longitude en degré décimal à l'aide du paramètres d'url : lon";} else if (!preg_match(self::PATTERN_LON, $lon)) {$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";}if (array_key_exists('nbre', $this->parametres)) {if (!preg_match('/^[0-9]+$/', $nbre)) {$messages[] = "Le nombre de commune le plus proche à retourner doit être un entier positif. Ex. : 10";} else if ($nbre > self::NBRE_COMMUNE_MAX) {$messages[] = "Le nombre de commune le plus proche à retourner doit être un entier positif inférieur à {self::NBRE_COMMUNE_MAX}. Ex. : 10";}}if (count($messages) != 0) {$message = implode('<br />', $messages);$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE;throw new Exception($message, $code);}}private function formaterResultats($nomINSEEs) {$communes_trouvees = null;if (isset($nomINSEEs) && !empty($nomINSEEs)) {foreach ($nomINSEEs as $nomINSEE) {$communes_trouvees[] = array('nom' => $nomINSEE['nom'], 'codeINSEE' => $nomINSEE['code_insee']);}if (!is_null($communes_trouvees)) {if ($this->parametres['nbre'] == 1 && count($communes_trouvees) == 1) {$communes_trouvees = $communes_trouvees[0];}} else {$message = "Le service '".get_class($this)."' n'a trouvé aucune commune correspondant aux coordonnées : {$parametres['lat']}, {$parametres['lon']}.";$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;throw new Exception($message, $code);}} else {$message = "Le service '".get_class($this)."' n'a trouvé aucune commune dont le centroïde correspond aux coordonnées : {$parametres['lat']}, {$parametres['lon']}.";$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;throw new Exception($message, $code);}return $communes_trouvees;}/*** requête qui récupère les 20 communes les plus proches du point recherché* La distance(AB = \sqrt{(x_B-x_A)^2 + (y_B-y_A)^2}) est calculée sans la racine* (calcul en plus qui change pas le résultat).*/private function trouverCommunesProches() {$lat = $this->parametres['lat'];$lon = $this->parametres['lon'];$requete = "SELECT (({$lat} - X(centroide)) * ({$lat} - X(centroide)) + ({$lon} - Y(centroide)) * ({$lon} - Y(centroide))) AS distance, "."code_insee, nom ".'FROM wikipedia_communes_v2011 '.'ORDER BY distance '."LIMIT {$this->parametres['nbre']} ";$resultat = $this->bdd->recupererTous($requete);return $resultat;}}?>