Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
2452 aurelien 1
<?php
2
class CelRadiusPoints extends Cel {
3
 
2455 aurelien 4
	private $champs = array("id_observation", "nom_sel", "latitude", "longitude", "COUNT(id_observation) as nb_obs");
5
	private $champs_min = array("latitude", "longitude");
6
 
7
	private $champs_mode = null;
8
 
2452 aurelien 9
	/**
10
	 * Méthode appelée avec une requête de type GET.
11
	 */
2455 aurelien 12
	public function getRessource() {
13
		$this->champs_mode = $this->champs_min;
2452 aurelien 14
		return $this->getElement(array());
15
	}
16
 
17
	/**
18
	 * Méthode appelée avec une requête de type GET.
19
	 */
20
	public function getElement($params) {
21
 
2453 aurelien 22
		$lat_centre = str_replace(',', '.', round(floatval($_GET['lat']), 3));
23
		$lon_centre = str_replace(',', '.', round(floatval($_GET['lon']), 3));
2452 aurelien 24
		$radius = str_replace(',', '.', floatval($_GET['radius']/1000));
25
 
26
		$retour = array();
27
 
28
		$retour['points'] = $this->obtenirPointsPourCentreEtRadius($lat_centre, $lon_centre, $radius);
29
		if(empty($retour['points'])) {
30
			$retour['plus_proche'] = $this->obtenirPointPlusProche($lat_centre, $lon_centre);
31
		}
32
 
33
		$this->envoyerJson($retour);
34
	}
35
 
36
	public function obtenirPointsPourCentreEtRadius($lat_centre, $lon_centre, $radius) {
37
		$requete = "SELECT ".
2455 aurelien 38
			implode(", ", $this->champs_mode)." ".
2452 aurelien 39
			"FROM cel_obs ".
40
			"WHERE latitude != 0 AND longitude != 0 ".
2454 aurelien 41
			"AND ".$this->renvoyerDistanceSql($lat_centre, $lon_centre)." < ".$radius." ".
42
			"GROUP BY latitude, longitude ";
2452 aurelien 43
 
44
		$points = Cel::db()->requeter($requete);
45
		return $points;
46
	}
47
 
2454 aurelien 48
	private function renvoyerDistanceSql($lat_centre, $lon_centre) {
49
		$sous_requete =
50
				"( ".
51
					"6371 * acos ( ".
52
						"cos ( radians(".$lat_centre.") ) ".
53
						"* cos( radians( latitude ) ) ".
54
						"* cos( radians( longitude ) - radians(".$lon_centre.") ) ".
55
						"+ sin ( radians(".$lat_centre.") ) ".
56
						"* sin( radians( latitude ) ) ".
57
					") ".
58
				") ";
59
		return $sous_requete;
60
	}
61
 
2452 aurelien 62
	public function obtenirPointPlusProche($lat_centre, $lon_centre) {
2455 aurelien 63
		// TODO: faire moins moche et plus efficace
2452 aurelien 64
		$requete = "SELECT ".
2455 aurelien 65
				implode(", ", $this->champs_mode).", ".$this->renvoyerDistanceSql($lat_centre, $lon_centre)." AS distance ".
2452 aurelien 66
				"FROM cel_obs ".
67
				"WHERE latitude != 0 AND longitude != 0 ".
68
				"GROUP BY latitude, longitude ".
2455 aurelien 69
				"ORDER BY distance ".
70
				"LIMIT 1";
71
 
2452 aurelien 72
		$point = Cel::db()->requeterLigne($requete);
73
		return $point;
74
	}
75
 
76
 
77
}