Rev 2454 | Rev 2462 | 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;
}
}