Subversion Repositories eFlore/Applications.cel

Rev

Rev 2454 | Rev 2461 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
class 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;
        }
        
        
}