Subversion Repositories eFlore/Applications.cel

Rev

Rev 978 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 978 Rev 979
1
<?php
1
<?php
2
class CartoGroupage {
2
class CartoGroupage {
3
 
3
 
4
	private static $seuilClusterisation = 100;
4
	private static $seuilClusterisation = 100;
5
	private static $zoomDefaut = 3;
5
	private static $zoomDefaut = 3;
6
	private static $zoomMaxClustering = 12;
6
	private static $zoomMaxClustering = 12;
7
	private static $pasZoomDefaut = 1;
7
	private static $pasZoomDefaut = 1;
8
	private static $pasZoomMaxClustering = 0.05;
8
	private static $pasZoomMaxClustering = 0.05;
9
	private static $profondeurMin = 0;
9
	private static $profondeurMin = 0;
10
	private static $profondeurMax = 8;
10
	private static $profondeurMax = 8;
11
	
11
	
12
	private static $pasCorrectionCentre = null;
12
	private static $pasCorrectionCentre = null;
13
	private static $coefficientReductionPas = null;	
13
	private static $coefficientReductionPas = null;	
14
	private static $coefficientProfondeurMax = null;
14
	private static $coefficientProfondeurMax = null;
-
 
15
	
-
 
16
	private static $nbElements = array('stations' => 0,'communes' => 0, 'observations' => 0);
15
 
17
 
-
 
18
	private static $listeNoeudsSelectionnes = array();
-
 
19
	
16
	private static $listeNoeudsSelectionnes = array();
20
	private static $pointsDejaTraites = array();
17
 
21
 
18
	/*
22
	/*
19
	  +---------+---------+
23
	  +---------+---------+
20
	  |         |         |
24
	  |         |         |
21
	  |    A    |    B    |
25
	  |    A    |    B    |
22
	  |         |         |
26
	  |         |         |
23
	  +---------*---------+
27
	  +---------*---------+
24
	  |         |         |
28
	  |         |         |
25
	  |    D    |    C    |
29
	  |    D    |    C    |
26
	  |         |         |
30
	  |         |         |
27
	  +---------+---------+
31
	  +---------+---------+
28
	  
32
	  
29
	  Quatres cadrans sont considérés par le quad tree
33
	  Quatres cadrans sont considérés par le quad tree
30
	  * = centre de la fenetre 
34
	  * = centre de la fenetre 
31
	 */
35
	 */
32
	public static function creerGroupesQuadtree($markers, $neLat, $neLng, $swLat, $swLng, $zoom = 3) {
36
	public static function creerGroupesQuadtree(&$markers, $neLat, $neLng, $swLat, $swLng, $zoom = 3) {
33
		
37
		
34
		if(count($markers) > self::$seuilClusterisation) {
38
		if(count($markers) > self::$seuilClusterisation) {
35
						
39
						
36
			self::calculerProfondeurMax($zoom);
40
			self::calculerProfondeurMax($zoom);
37
			self::calculerPasCorrectionCentre($zoom);
41
			self::calculerPasCorrectionCentre($zoom);
38
 
42
 
39
			$noeudRacine = array('nbrePoints' => count($markers), 'points' => $markers);
43
			$noeudRacine = array('nbrePoints' => count($markers), 'points' => $markers);
40
			self::attribuerAuCadran($noeudRacine, $neLat, $neLng, $swLat, $swLng);	
44
			self::attribuerAuCadran($noeudRacine, $neLat, $neLng, $swLat, $swLng);	
41
			
45
			
42
		} else {
46
		} else {
43
			foreach($markers as $marker) {
47
			foreach($markers as $marker) {
44
				$points = array($marker);
48
				$points = array($marker);
45
				$noeudSimple = array('points' => $points, 'nbrePoints' => 1);
49
				$noeudSimple = array('points' => $points, 'nbrePoints' => 1);
46
				self::$listeNoeudsSelectionnes[] = self::ajouterGroupeOuPoint($noeudSimple);
50
				self::$listeNoeudsSelectionnes[] = self::ajouterGroupeOuPoint($noeudSimple);
47
			}
51
			}
48
		}
52
		}
49
			
53
			
50
		return self::$listeNoeudsSelectionnes;
54
		return self::$listeNoeudsSelectionnes;
51
	}
55
	}
52
	
56
	
53
	private function calculerCoefficientReductionPas() {
57
	private function calculerCoefficientReductionPas() {
54
		if(self::$coefficientReductionPas == null) {
58
		if(self::$coefficientReductionPas == null) {
55
			self::$coefficientReductionPas = (self::$pasZoomMaxClustering - self::$pasZoomDefaut)/(self::$zoomMaxClustering - self::$zoomDefaut);
59
			self::$coefficientReductionPas = (self::$pasZoomMaxClustering - self::$pasZoomDefaut)/(self::$zoomMaxClustering - self::$zoomDefaut);
56
		}
60
		}
57
		
61
		
58
		return self::$coefficientReductionPas;
62
		return self::$coefficientReductionPas;
59
	}
63
	}
60
	
64
	
61
	private function calculerPasCorrectionCentre($zoom) {
65
	private function calculerPasCorrectionCentre($zoom) {
62
		self::$pasCorrectionCentre = ($zoom - self::$zoomDefaut) * self::calculerCoefficientReductionPas() + self::$pasZoomDefaut;
66
		self::$pasCorrectionCentre = ($zoom - self::$zoomDefaut) * self::calculerCoefficientReductionPas() + self::$pasZoomDefaut;
63
	}
67
	}
64
	
68
	
65
	private function calculerCoefficientProfondeurMax() {
69
	private function calculerCoefficientProfondeurMax() {
66
		if(self::$coefficientProfondeurMax == null) {
70
		if(self::$coefficientProfondeurMax == null) {
67
			self::$coefficientProfondeurMax = (self::$profondeurMax - self::$profondeurMin)/(self::$zoomMaxClustering - self::$zoomDefaut);
71
			self::$coefficientProfondeurMax = (self::$profondeurMax - self::$profondeurMin)/(self::$zoomMaxClustering - self::$zoomDefaut);
68
		}
72
		}
69
		
73
		
70
		return self::$coefficientProfondeurMax;
74
		return self::$coefficientProfondeurMax;
71
	}
75
	}
72
	
76
	
73
	private function calculerProfondeurMax($zoom) {	
77
	private function calculerProfondeurMax($zoom) {	
74
		if($zoom > self::$zoomDefaut) {	
78
		if($zoom > self::$zoomDefaut) {	
75
			self::$profondeurMax = round(($zoom - self::$zoomDefaut) * self::calculerCoefficientProfondeurMax() + self::$profondeurMin,0);
79
			self::$profondeurMax = round(($zoom - self::$zoomDefaut) * self::calculerCoefficientProfondeurMax() + self::$profondeurMin,0);
76
		} else {
80
		} else {
77
			self::$profondeurMax = 1;
81
			self::$profondeurMax = 1;
78
		}
82
		}
79
	}
83
	}
-
 
84
	
-
 
85
	public static function getNbElements() {
-
 
86
		return self::$nbElements;
-
 
87
	}
80
	
88
	
81
	/**
89
	/**
82
	 * 
90
	 * 
83
	 * @param mixed $noeud Le noeud à traiter par le quadtree
91
	 * @param mixed $noeud Le noeud à traiter par le quadtree
84
	 * @param float $neLat Latitude du coin nord est de la fenetre 
92
	 * @param float $neLat Latitude du coin nord est de la fenetre 
85
	 * @param float $neLng Longitude du coin nord est de la fenetre 
93
	 * @param float $neLng Longitude du coin nord est de la fenetre 
86
	 * @param float $swLat Latitude du coin sud ouest de la fenetre 
94
	 * @param float $swLat Latitude du coin sud ouest de la fenetre 
87
	 * @param float $swLng Longitude du coin sud ouest de la fenetre 
95
	 * @param float $swLng Longitude du coin sud ouest de la fenetre 
88
	 * @param int $profondeur profondeur courante de l'arbre
96
	 * @param int $profondeur profondeur courante de l'arbre
89
	 */
97
	 */
90
	private static function attribuerAuCadran(&$noeud, $neLat, $neLng, $swLat, $swLng, $profondeur = 0) {
98
	private static function attribuerAuCadran(&$noeud, $neLat, $neLng, $swLat, $swLng, $profondeur = 0) {
91
			
99
			
92
		$latCentre = round((($neLat+$swLat)/2)/self::$pasCorrectionCentre,0)*self::$pasCorrectionCentre;
100
		$latCentre = round((($neLat+$swLat)/2)/self::$pasCorrectionCentre,0)*self::$pasCorrectionCentre;
93
		$lngCentre = round((($neLng+$swLng)/2)/self::$pasCorrectionCentre,0)*self::$pasCorrectionCentre;
101
		$lngCentre = round((($neLng+$swLng)/2)/self::$pasCorrectionCentre,0)*self::$pasCorrectionCentre;
94
						
102
						
95
		foreach ($noeud['points'] as &$point) {
103
		foreach ($noeud['points'] as &$point) {
-
 
104
				self::$nbElements['observations']++;
-
 
105
				self::$nbElements[$point['type_emplacement']]++;
-
 
106
				unset($point['type_emplacement']);
96
			$cadran = self::obtenirCadranPourPoint($latCentre, $lngCentre, $point);
107
				$cadran = self::obtenirCadranPourPoint($latCentre, $lngCentre, $point);
97
			self::ajouterFils($noeud,$cadran,$point);
108
				self::ajouterFils($noeud,$cadran,$point);
98
		}
109
		}
99
		
110
		
100
		$profondeur++;
111
		$profondeur++;
101
		
112
		
102
		if($profondeur <= self::$profondeurMax) {
113
		if($profondeur <= self::$profondeurMax) {
103
			($noeud['A'] != null) ? self::attribuerAuCadran($noeud['A'], $neLat, $lngCentre , $latCentre, $lngSw, $profondeur) : '';
114
			($noeud['A'] != null) ? self::attribuerAuCadran($noeud['A'], $neLat, $lngCentre , $latCentre, $lngSw, $profondeur) : '';
104
			($noeud['B'] != null) ? self::attribuerAuCadran($noeud['B'], $neLat, $neLng, $latCentre, $lngCentre, $profondeur) : '';
115
			($noeud['B'] != null) ? self::attribuerAuCadran($noeud['B'], $neLat, $neLng, $latCentre, $lngCentre, $profondeur) : '';
105
			($noeud['C'] != null) ? self::attribuerAuCadran($noeud['C'], $latCentre, $neLng, $swLat, $lngCentre, $profondeur) : '';
116
			($noeud['C'] != null) ? self::attribuerAuCadran($noeud['C'], $latCentre, $neLng, $swLat, $lngCentre, $profondeur) : '';
106
			($noeud['D'] != null) ? self::attribuerAuCadran($noeud['D'], $latCentre, $lngCentre, $swLat, $swLng, $profondeur) : '';
117
			($noeud['D'] != null) ? self::attribuerAuCadran($noeud['D'], $latCentre, $lngCentre, $swLat, $swLng, $profondeur) : '';
107
		}
118
		}
108
		
119
		
109
		if(self::estUnParentFeuilles($noeud)) {
120
		if(self::estUnParentFeuilles($noeud)) {
110
			self::$listeNoeudsSelectionnes[] = self::ajouterGroupeOuPoint($noeud);
121
			self::$listeNoeudsSelectionnes[] = self::ajouterGroupeOuPoint($noeud);
111
		}
122
		}
112
	}
123
	}
113
	
124
	
114
	private function obtenirCadranPourPoint($latCentre,$lngCentre, &$point) {
125
	private function obtenirCadranPourPoint($latCentre,$lngCentre, &$point) {
115
		if ($point['lng'] < $lngCentre) {
126
		if ($point['lng'] < $lngCentre) {
116
			if ($point['lat'] > $latCentre) {
127
			if ($point['lat'] > $latCentre) {
117
					$cadran = 'A';
128
					$cadran = 'A';
118
				} else {
129
				} else {
119
					$cadran = 'D';
130
					$cadran = 'D';
120
				}
131
				}
121
		} else {
132
		} else {
122
			if ($point['lat'] > $latCentre) {
133
			if ($point['lat'] > $latCentre) {
123
				$cadran = 'B';
134
				$cadran = 'B';
124
			} else {
135
			} else {
125
				$cadran = 'C';
136
				$cadran = 'C';
126
			}
137
			}
127
		}		
138
		}		
128
		return $cadran;
139
		return $cadran;
129
	}
140
	}
130
	
141
	
131
	private static function ajouterFils(&$noeud, $cadran, &$point) {	
142
	private static function ajouterFils(&$noeud, $cadran, &$point) {	
132
		$noeud[$cadran]['points'][] = $point;
143
		$noeud[$cadran]['points'][] = $point;
133
		$noeud[$cadran]['nbrePoints']++;
144
		$noeud[$cadran]['nbrePoints']++;
134
		$noeud[$cadran]['latMoyenne'] += $point['lat'];
145
		$noeud[$cadran]['latMoyenne'] += $point['lat'];
135
		$noeud[$cadran]['lngMoyenne'] += $point['lng'];
146
		$noeud[$cadran]['lngMoyenne'] += $point['lng'];
136
	}
147
	}
137
	
148
	
138
	private static function ajouterGroupeOuPoint($noeud) {
149
	private static function ajouterGroupeOuPoint(&$noeud) {
139
		$groupe = array();
150
		$groupe = array();
140
		if ($noeud['nbrePoints'] > 1) {
151
		if ($noeud['nbrePoints'] > 1) {
141
			$groupe['lat'] = $noeud['latMoyenne']/$noeud['nbrePoints'];
152
			$groupe['lat'] = $noeud['latMoyenne']/$noeud['nbrePoints'];
142
			$groupe['lng'] = $noeud['lngMoyenne']/$noeud['nbrePoints'];
153
			$groupe['lng'] = $noeud['lngMoyenne']/$noeud['nbrePoints'];
143
			$groupe['id'] = 'GROUPE:'.$groupe['lat'].';'.$groupe['lng'];
154
			$groupe['id'] = 'GROUPE:'.$groupe['lat'].';'.$groupe['lng'];
144
			$groupe['nbreMarqueur'] = $noeud['nbrePoints'];
155
			$groupe['nbreMarqueur'] = $noeud['nbrePoints'];
145
		} else {
156
		} else {
146
			$groupe = $noeud['points'][0];
157
			$groupe = $noeud['points'][0];
147
		}
158
		}
148
		return $groupe;
159
		return $groupe;
149
	}
160
	}
150
	
161
	
151
	private static function estUnParentFeuilles($noeud) {
162
	private static function estUnParentFeuilles(&$noeud) {
152
		return  self::estUneFeuille($noeud['A']) && 
163
		return  self::estUneFeuille($noeud['A']) && 
153
				self::estUneFeuille($noeud['B']) && 
164
				self::estUneFeuille($noeud['B']) && 
154
				self::estUneFeuille($noeud['C']) && 
165
				self::estUneFeuille($noeud['C']) && 
155
				self::estUneFeuille($noeud['D']);
166
				self::estUneFeuille($noeud['D']);
156
	}
167
	}
157
	
168
	
158
	private static function estUneFeuille($noeud) {		
169
	private static function estUneFeuille(&$noeud) {		
159
		return $noeud == null || ($noeud['A'] == null && $noeud['B'] == null && $noeud['C'] == null && $noeud['D'] == null);
170
		return $noeud == null || ($noeud['A'] == null && $noeud['B'] == null && $noeud['C'] == null && $noeud['D'] == null);
160
	}
171
	}
161
}
172
}
162
?>
173
?>