Rev 2454 | Rev 2461 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?phpclass CelRadiusPoints extends Cel {private $champs = array("id_observation", "nom_sel", "latitude", "longitude", "COUNT(id_observation) as nb_obs");private $champs_min = array("latitude", "longitude");private $champs_mode = null;/*** Méthode appelée avec une requête de type GET.*/public function getRessource() {$this->champs_mode = $this->champs_min;return $this->getElement(array());}/*** Méthode appelée avec une requête de type GET.*/public function getElement($params) {$lat_centre = str_replace(',', '.', round(floatval($_GET['lat']), 3));$lon_centre = str_replace(',', '.', round(floatval($_GET['lon']), 3));$radius = str_replace(',', '.', floatval($_GET['radius']/1000));$retour = array();$retour['points'] = $this->obtenirPointsPourCentreEtRadius($lat_centre, $lon_centre, $radius);if(empty($retour['points'])) {$retour['plus_proche'] = $this->obtenirPointPlusProche($lat_centre, $lon_centre);}$this->envoyerJson($retour);}public function obtenirPointsPourCentreEtRadius($lat_centre, $lon_centre, $radius) {$requete = "SELECT ".implode(", ", $this->champs_mode)." "."FROM cel_obs "."WHERE latitude != 0 AND longitude != 0 "."AND ".$this->renvoyerDistanceSql($lat_centre, $lon_centre)." < ".$radius." "."GROUP BY latitude, longitude ";$points = Cel::db()->requeter($requete);return $points;}private function renvoyerDistanceSql($lat_centre, $lon_centre) {$sous_requete ="( "."6371 * acos ( "."cos ( radians(".$lat_centre.") ) "."* cos( radians( latitude ) ) "."* cos( radians( longitude ) - radians(".$lon_centre.") ) "."+ sin ( radians(".$lat_centre.") ) "."* sin( radians( latitude ) ) ".") ".") ";return $sous_requete;}public function obtenirPointPlusProche($lat_centre, $lon_centre) {// TODO: faire moins moche et plus efficace$requete = "SELECT ".implode(", ", $this->champs_mode).", ".$this->renvoyerDistanceSql($lat_centre, $lon_centre)." AS distance "."FROM cel_obs "."WHERE latitude != 0 AND longitude != 0 "."GROUP BY latitude, longitude "."ORDER BY distance "."LIMIT 1";$point = Cel::db()->requeterLigne($requete);return $point;}}