Subversion Repositories eFlore/Applications.cel

Rev

Rev 2565 | Rev 2915 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2565 Rev 2914
Line 72... Line 72...
72
			$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
72
			$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
73
		}
73
		}
74
		return $infos_coord;
74
		return $infos_coord;
75
	}
75
	}
Line -... Line 76...
-
 
76
 
-
 
77
	// gère aussi les id_zone_geo @TODO renommer la méthode et internationaliser
76
	
78
	// la gestion des codes
77
	public function obtenirInfosPourNoms($nom, $pays, $code) {
-
 
78
		
79
	public function obtenirInfosPourNom($nom, $pays, $code_departement=null, $id_zone=null) {
79
		$nom = trim($nom);
80
		$nom = trim($nom);
80
		$pays = trim($pays);
81
		$pays = trim($pays);
Line 81... Line 82...
81
		$code = trim($code);
82
		$code_departement = trim($code_departement);
82
		
83
 
83
		$retour = false;
84
		$retour = false;
84
		// Dans le cas de la france on possède directement une table 
85
		// Dans le cas de la france on possède directement une table 
85
		// avec les centroïdes des communes
86
		// avec les centroïdes des communes
86
		if($pays == 'FR' || $code != "") {
87
		if($pays == 'FR' || $code_departement != "") {
87
			$retour = $this->chercherCentroideCommuneBdd($nom, $code);
88
			$retour = $this->chercherCentroideCommuneBdd($nom, $code_departement, $id_zone);
88
		} else {
89
		} else {
-
 
90
			// Sinon méthode habituelle, un test simple suivi d'un test plus complexe
89
			// Sinon méthode habituelle, un test simple suivi d'un test plus complexe
91
			// On cherche donc d'abord en France
90
			// On cherche donc d'abord en France
92
			// @TODO c'est quoi ce if() mal ordonné ?
91
			if($pays == "") {
93
			if($pays == "") {
92
				$retour = $this->chercherCentroideCommuneBdd($nom, $code);
-
 
93
			}
94
				$retour = $this->chercherCentroideCommuneBdd($nom, $code_departement, $id_zone);
94
			
95
			}
95
			// Si on ne trouve rien on teste dans le monde entier
96
			// Si on ne trouve rien on teste dans le monde entier
96
			if($retour == false) {
97
			if($retour == false) {
97
				$retour = $this->effectuerRequeteGeocodingMondiale($nom, '2,3,4,5,6,7,8', 1, $pays);
98
				$retour = $this->effectuerRequeteGeocodingMondiale($nom, '2,3,4,5,6,7,8', 1, $pays, $id_zone);
Line 98... Line 99...
98
			}
99
			}
99
		}
100
		}
Line -... Line 101...
-
 
101
		
-
 
102
		return $retour;
-
 
103
	}
-
 
104
 
-
 
105
	/**
-
 
106
	 * Renvoie tous les codes de zones pour le groupe $groupe
-
 
107
	 */
-
 
108
	protected function obtenirZonesDuGroupe($groupe) {
-
 
109
		$requete = 'SELECT valeur as id_zone FROM cel_groupes_zones '
-
 
110
			. 'WHERE id_groupe = ' . Cel::db()->proteger($groupe)
-
 
111
			. ' -- '.__FILE__.':'.__LINE__;
-
 
112
 
-
 
113
		$liste_zones = Cel::db()->requeter($requete);
-
 
114
		return $liste_zones;
-
 
115
	}
-
 
116
 
-
 
117
	/**
-
 
118
	 * Renvoie des infos pour un groupes de zones, déclaré dans la table
-
 
119
	 * cel_groupe_zones : toutes les infos des zones concernées, plus le carré
-
 
120
	 * englobant (bounding box) et le centroïde de l'union des zones
-
 
121
	 */
-
 
122
	public function obtenirInfosPourGroupeZonesFrance($groupe) {
-
 
123
		$groupe = trim($groupe);
-
 
124
		$retour = false;
-
 
125
 
-
 
126
		$zones = $this->obtenirZonesDuGroupe($groupe);
-
 
127
		$retour = array(
-
 
128
			'groupe' => array(),
-
 
129
			'zones' => array()
-
 
130
		);
-
 
131
		foreach ($zones as $zone) {
-
 
132
			$idZone = $zone['id_zone'];
-
 
133
			$retour['zones'][] = $this->obtenirInfosPourNom(null, null, null, $idZone);
-
 
134
		}
-
 
135
 
-
 
136
		// recherche bbox (de Bouygues Telecom) @TODO faire ça au dessus, en une passe ?
-
 
137
		$lngmin = 99999;
-
 
138
		$latmin = 99999;
-
 
139
		$lngmax = -99999;
-
 
140
		$latmax = -99999;
-
 
141
		foreach ($retour['zones'] as $zone) {
-
 
142
			$lat = $zone['lat'];
-
 
143
			$lng = $zone['lng'];
-
 
144
			if ($lat < $latmin) { $latmin = $lat; }
-
 
145
			if ($lat > $latmax) { $latmax = $lat; }
-
 
146
			if ($lng < $lngmin) { $lngmin = $lng; }
-
 
147
			if ($lng > $lngmax) { $lngmax = $lng; }
-
 
148
		}
-
 
149
		$retour['groupe']['bbox'] = array(
-
 
150
			'lat_min' => $latmin,
-
 
151
			'lat_max' => $latmax,
-
 
152
			'lon_min' => $lngmin,
-
 
153
			'lon_max' => $lngmax
-
 
154
		);
-
 
155
		$retour['groupe']['centroide'] = array(
-
 
156
			'lat' => ($latmin + $latmax) / 2,
-
 
157
			'lon' => ($lngmin + $lngmax) / 2
-
 
158
		);
100
		
159
 
Line 101... Line 160...
101
		return $retour;
160
		return $retour;
102
	}
161
	}
103
	
162
	
Line 202... Line 261...
202
					);
261
					);
203
		}
262
		}
204
		return $retour;
263
		return $retour;
205
	}
264
	}
Line -... Line 265...
-
 
265
 
206
	
266
	// @TODO gérer $id_zone (inactif pour l'instant)
207
	private function effectuerRequeteGeocodingMondiale($nom, $niveau = '2,3,4,5,6,7,8', $limite = 1, $pays = null) {
267
	protected function effectuerRequeteGeocodingMondiale($nom, $niveau = '2,3,4,5,6,7,8', $limite = 1, $pays = null, $id_zone=null) {
208
		$url_sans_pays = $this->config['cel']['url_service_geo_mondial'].'?masque='.urlencode($nom).'&niveau='.$niveau.'&limite='.$limite;
268
		$url_sans_pays = $this->config['cel']['url_service_geo_mondial'].'?masque='.urlencode($nom).'&niveau='.$niveau.'&limite='.$limite;
Line 209... Line 269...
209
		$url = $url_sans_pays.(!empty($pays) ? '&pays='.urlencode($pays) : '');
269
		$url = $url_sans_pays.(!empty($pays) ? '&pays='.urlencode($pays) : '');
210
 
270
 
Line 241... Line 301...
241
		}
301
		}
Line 242... Line 302...
242
	
302
	
243
		return $retour;
303
		return $retour;
Line -... Line 304...
-
 
304
	}
-
 
305
 
-
 
306
	/**
-
 
307
	 * Renvoie les infos d'une commune, incluant les coordonnées du centroïde,
244
	}
308
	 * en fonction du nom et/ou du département, et/ou de l'id_zone (plus fiable)
245
		
309
	 */
-
 
310
	protected function chercherCentroideCommuneBdd($commune, $departement=null, $id_zone=null) {
-
 
311
		$commune_formatee = str_replace(array(' ', '-'), '_', trim($commune));
-
 
312
		// clauses
-
 
313
		$clauses = array();
246
	private function chercherCentroideCommuneBdd($commune, $departement) {
314
		if ($commune != null) {
-
 
315
			$clauses[] = 'nom LIKE '.Cel::db()->proteger($commune_formatee);
247
		$commune_formatee = str_replace(array(' ', '-'), '_', trim($commune));
316
		}
248
		
317
		if ($departement != null) {
-
 
318
			$departement = trim($departement, "*");
-
 
319
			if (strlen($departement) > 2) {
249
		$departement = trim($departement, "*");
320
				// @TODO piège : si deux communes ont le même nom dans deux
250
		if (strlen($departement) > 2) {
321
				// DROM-COM, la troncature à 2 chiffres sera insuffisante
251
			$departement = substr($departement, 0, 2);
322
				$departement = substr($departement, 0, 2);
-
 
323
			}
-
 
324
			$clauses[] = 'code LIKE '.Cel::db()->proteger($departement.'%');
252
		}
325
		}
-
 
326
		if ($id_zone != null) {
-
 
327
			$clauses[] = 'id_zone_geo = '.Cel::db()->proteger($id_zone);
-
 
328
		}
253
		$requete = 'SELECT utm_x, utm_y, utm_secteur, code FROM cel_zones_geo '.
329
		$clauses = implode(' AND ', $clauses);
-
 
330
 
254
				'WHERE nom LIKE '.Cel::db()->proteger($commune_formatee).' '.
331
		$requete = 'SELECT utm_x, utm_y, utm_secteur, code FROM cel_zones_geo '
Line 255... Line 332...
255
				'AND code LIKE '.Cel::db()->proteger($departement.'%').' '.
332
				. 'WHERE ' . $clauses
Line 256... Line 333...
256
				' -- '.__FILE__.':'.__LINE__;
333
				. ' -- '.__FILE__.':'.__LINE__;
257
		
334
 
Line 315... Line 392...
315
	/**
392
	/**
316
	 * Fonctions utilitaires
393
	 * Fonctions utilitaires
317
	 * 
394
	 * 
318
	*/
395
	*/
Line 319... Line 396...
319
	
396
	
320
	private function reduireListeLieux($tableau) {
397
	protected function reduireListeLieux($tableau) {
321
		$index = array();
398
		$index = array();
322
		foreach($tableau as $ligne) {
399
		foreach($tableau as $ligne) {
323
			$index_loc = trim(preg_replace("/\([a-zA-Z0-9]{2}\)$/", "", $ligne[0])); 
400
			$index_loc = trim(preg_replace("/\([a-zA-Z0-9]{2}\)$/", "", $ligne[0])); 
324
			if(!isset($index[$index_loc])) {
401
			if(!isset($index[$index_loc])) {
Line 335... Line 412...
335
		}
412
		}
Line 336... Line 413...
336
		
413
		
337
		return array_values($index);
414
		return array_values($index);
Line 338... Line 415...
338
	}
415
	}
339
	
416
	
340
	private function trierListeLieux($a, $b) {
417
	protected function trierListeLieux($a, $b) {
Line 341... Line 418...
341
		return strcmp($a[0], $b[0]);
418
		return strcmp($a[0], $b[0]);
342
	}
419
	}
343
	
420
	
344
	private function testerCoordonneesWgsFrance($latitude, $longitude) {
421
	protected function testerCoordonneesWgsFrance($latitude, $longitude) {
345
		$coord_france = false;
422
		$coord_france = false;
346
		if ($latitude != '' && $longitude != '') {
423
		if ($latitude != '' && $longitude != '') {
Line 351... Line 428...
351
			}
428
			}
352
		}
429
		}
353
		return $coord_france;
430
		return $coord_france;
354
	}
431
	}
Line 355... Line 432...
355
	
432
	
Line 356... Line 433...
356
	private function traiterLigneResultatRequeteGeocodingMondiale($res) {
433
	protected function traiterLigneResultatRequeteGeocodingMondiale($res) {
357
	
434
	
358
		$lat = "";
435
		$lat = "";
359
		$lon = "";
436
		$lon = "";
Line 381... Line 458...
381
		}
458
		}
Line 382... Line 459...
382
	
459
	
383
		return $retour;
460
		return $retour;
Line 384... Line 461...
384
	}
461
	}
385
	
462
	
386
	private function convertirUtmVersLatLong($x, $y, $sector) {
463
	protected function convertirUtmVersLatLong($x, $y, $sector) {
387
		$convertisseur = new gPoint();
464
		$convertisseur = new gPoint();
Line 388... Line 465...
388
		$convertisseur->setUTM($x, $y, $sector);
465
		$convertisseur->setUTM($x, $y, $sector);
389
		$convertisseur->convertTMtoLL();
466
		$convertisseur->convertTMtoLL();
390
	
467
	
391
		$lat_long = array();
468
		$lat_long = array();
392
		$lat_long['lat'] = str_replace(',','.',$convertisseur->Lat());
469
		$lat_long['lat'] = str_replace(',','.',$convertisseur->Lat());
Line 393... Line 470...
393
		$lat_long['lng'] = str_replace(',','.',$convertisseur->Long());
470
		$lat_long['lng'] = str_replace(',','.',$convertisseur->Long());
394
		return $lat_long;
471
		return $lat_long;
395
	}
472
	}
396
	
473
	
397
	private function extraireCodePays($infos_pays) {
474
	protected function extraireCodePays($infos_pays) {
398
		$code = "";
475
		$code = "";
Line 404... Line 481...
404
			$code = substr($infos_pays['codeIso31662'], 0, 2);
481
			$code = substr($infos_pays['codeIso31662'], 0, 2);
405
		}
482
		}
406
		return $code;
483
		return $code;
407
	}
484
	}
Line 408... Line 485...
408
	
485
	
409
	private function estUneChaineRequeteValide($lieu) {
486
	protected function estUneChaineRequeteValide($lieu) {
410
		return (strlen($lieu) > 0) && ($lieu != '%');
487
		return (strlen($lieu) > 0) && ($lieu != '%');
Line 411... Line 488...
411
	}
488
	}
412
		
489
		
413
	private function formaterLigneResultat($ligne) {
490
	protected function formaterLigneResultat($ligne) {
414
		if(empty($ligne['code']) || $ligne['code'] == null) {
491
		if(empty($ligne['code']) || $ligne['code'] == null) {
415
			$res = array($ligne['nom'], '');
492
			$res = array($ligne['nom'], '');
416
		} else {
493
		} else {
Line 424... Line 501...
424
	 * Remplace les + par _ (nginx envoie des "+" dans l'URL à la place des espaces)
501
	 * Remplace les + par _ (nginx envoie des "+" dans l'URL à la place des espaces)
425
	 * Remplace les espaces et les - par _ car les noms de communes peuvent avoir des espaces ou des tirets
502
	 * Remplace les espaces et les - par _ car les noms de communes peuvent avoir des espaces ou des tirets
426
	 * @param string $lieu
503
	 * @param string $lieu
427
	 * @return string le lieu formaté pour la recherche
504
	 * @return string le lieu formaté pour la recherche
428
	 */
505
	 */
429
	private function formaterChaineLieuPourRequete($lieu) {
506
	protected function formaterChaineLieuPourRequete($lieu) {
430
		$lieu = ltrim($lieu);
507
		$lieu = ltrim($lieu);
431
		$lieu = preg_replace('/\*+/', '%', $lieu);
508
		$lieu = preg_replace('/\*+/', '%', $lieu);
432
		$lieu = str_replace(['+', ' ', '-'], '_', $lieu);
509
		$lieu = str_replace(['+', ' ', '-'], '_', $lieu);
433
		return $lieu;
510
		return $lieu;
434
	}
511
	}