Subversion Repositories eFlore/Applications.cel

Rev

Rev 2455 | Rev 2462 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2455 Rev 2461
Line 1... Line 1...
1
<?php
1
<?php
-
 
2
// declare(encoding='UTF-8');
-
 
3
/**
-
 
4
 * Service renvoyant les observations présentent au sein d'un cercle de rayon donné.
-
 
5
 *
-
 
6
 * @internal   Mininum PHP version : 5.2
-
 
7
 * @category   CEL
-
 
8
 * @package    Services
-
 
9
 * @subpackage Bibliothèques
-
 
10
 * @version    0.1
-
 
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
-
 
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
-
 
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
-
 
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
-
 
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
-
 
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
-
 
17
 */
2
class CelRadiusPoints extends Cel {
18
class CelRadiusPoints extends Cel {
3
	
19
 
4
	private $champs = array("id_observation", "nom_sel", "latitude", "longitude", "COUNT(id_observation) as nb_obs");
20
	private $champs = array('id_observation', 'nom_sel', 'latitude', 'longitude', 'COUNT(id_observation) AS nb_obs');
5
	private $champs_min = array("latitude", "longitude");
21
	private $champs_min = array('latitude', 'longitude');
6
	
22
 
7
	private $champs_mode = null;
23
	private $champs_mode = null;
8
	
24
 
9
	/**
25
	/**
10
	 * Méthode appelée avec une requête de type GET.
26
	 * Méthode appelée avec une requête de type GET.
11
	 */
27
	 */
12
	public function getRessource() {
28
	public function getRessource() {
13
		$this->champs_mode = $this->champs_min;
29
		$this->champs_mode = $this->champs_min;
14
		return $this->getElement(array());
30
		return $this->getElement(array());
15
	}
31
	}
16
	
-
 
17
	/**
-
 
18
	 * Méthode appelée avec une requête de type GET.
-
 
19
	 */
-
 
20
	public function getElement($params) {
-
 
Line -... Line 32...
-
 
32
 
-
 
33
	/**
-
 
34
	 * Méthode appelée avec une requête de type GET.
-
 
35
	 */
21
 
36
	public function getElement($params) {
22
		$lat_centre = str_replace(',', '.', round(floatval($_GET['lat']), 3));
37
		$lat_centre = str_replace(',', '.', round(floatval($_GET['lat']), 3));
23
		$lon_centre = str_replace(',', '.', round(floatval($_GET['lon']), 3));
38
		$lon_centre = str_replace(',', '.', round(floatval($_GET['lon']), 3));
24
		$radius = str_replace(',', '.', floatval($_GET['radius']/1000));
39
		$radius = str_replace(',', '.', floatval($_GET['radius']/1000));
25
		
40
 
26
		$retour = array();
41
		$retour = array();
27
		
42
 
28
		$retour['points'] = $this->obtenirPointsPourCentreEtRadius($lat_centre, $lon_centre, $radius);
43
		$retour['points'] = $this->obtenirPointsPourCentreEtRadius($lat_centre, $lon_centre, $radius);
29
		if(empty($retour['points'])) {
44
		if (empty($retour['points'])) {
30
			$retour['plus_proche'] = $this->obtenirPointPlusProche($lat_centre, $lon_centre);
45
			$retour['plus_proche'] = $this->obtenirPointPlusProche($lat_centre, $lon_centre);
31
		}
-
 
32
 
46
		}
33
		$this->envoyerJson($retour);
47
		$this->envoyerJson($retour);
Line 34... Line 48...
34
	}
48
	}
35
 
-
 
36
	public function obtenirPointsPourCentreEtRadius($lat_centre, $lon_centre, $radius) {
49
 
37
		$requete = "SELECT ".
50
	public function obtenirPointsPourCentreEtRadius($lat_centre, $lon_centre, $radius) {
38
			implode(", ", $this->champs_mode)." ".
51
		$requete = 'SELECT '.implode(', ', $this->champs_mode).' '.
39
			"FROM cel_obs ".
52
			'FROM cel_obs '.
40
			"WHERE latitude != 0 AND longitude != 0 ".
53
			'WHERE latitude != 0 AND longitude != 0 '.
41
			"AND ".$this->renvoyerDistanceSql($lat_centre, $lon_centre)." < ".$radius." ".
-
 
-
 
54
			'AND '.$this->renvoyerDistanceSql($lat_centre, $lon_centre)." < $radius ".
42
			"GROUP BY latitude, longitude ";
55
			'GROUP BY latitude, longitude '.
43
 
56
			' -- '.__FILE__.':'.__LINE__;
44
		$points = Cel::db()->requeter($requete);
57
		$points = Cel::db()->requeter($requete);
45
		return $points;
58
		return $points;
46
	}
59
	}
47
	
60
 
48
	private function renvoyerDistanceSql($lat_centre, $lon_centre) {
61
	private function renvoyerDistanceSql($lat_centre, $lon_centre) {
49
		$sous_requete = 
62
		$sous_requete =
50
				"( ".
63
			"( ".
51
					"6371 * acos ( ".
64
				"6371 * acos ( ".
52
						"cos ( radians(".$lat_centre.") ) ".
65
					"cos ( radians($lat_centre) ) ".
53
						"* cos( radians( latitude ) ) ".
66
					"* cos( radians( latitude ) ) ".
54
						"* cos( radians( longitude ) - radians(".$lon_centre.") ) ".
67
					"* cos( radians( longitude ) - radians($lon_centre) ) ".
55
						"+ sin ( radians(".$lat_centre.") ) ".
68
					"+ sin ( radians($lat_centre) ) ".
56
						"* sin( radians( latitude ) ) ".
69
					"* sin( radians( latitude ) ) ".
57
					") ".
70
				") ".
58
				") ";
71
			") ";
59
		return $sous_requete;
72
		return $sous_requete;
60
	}
73
	}
61
	
74
 
62
	public function obtenirPointPlusProche($lat_centre, $lon_centre) {
75
	public function obtenirPointPlusProche($lat_centre, $lon_centre) {
63
		// TODO: faire moins moche et plus efficace
76
		// TODO: faire moins moche et plus efficace
64
		$requete = "SELECT ".
77
		$requete = 'SELECT '.
65
				implode(", ", $this->champs_mode).", ".$this->renvoyerDistanceSql($lat_centre, $lon_centre)." AS distance ".
78
			implode(", ", $this->champs_mode).", ".$this->renvoyerDistanceSql($lat_centre, $lon_centre)." AS distance ".
66
				"FROM cel_obs ".
79
			'FROM cel_obs '.
67
				"WHERE latitude != 0 AND longitude != 0 ".
80
			'WHERE latitude != 0 AND longitude != 0 '.
68
				"GROUP BY latitude, longitude ".
81
			'GROUP BY latitude, longitude '.
69
				"ORDER BY distance ".
-
 
-
 
82
			'ORDER BY distance '.
70
				"LIMIT 1";
83
			'LIMIT 1 '.
71
 
84
			' -- '.__FILE__.':'.__LINE__;
72
		$point = Cel::db()->requeterLigne($requete);
85
		$point = Cel::db()->requeterLigne($requete);
73
		return $point;
-
 
74
	}
-
 
75
	
86
		return $point;
76
	
87
	}