Subversion Repositories eFlore/Applications.cel

Rev

Rev 2557 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2538 aurelien 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Classe recherchant des infos sur une zone géo ou bien des coordonnées.
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
 */
18
class RechercheInfosZoneGeo extends Cel {
19
 
20
	//TODO: migrer tout ce qui concerne la zone géo dans cette classe
21
	public function obtenirInfosPourCoordonnees($coordonnees) {
22
		$infos_coord = null;
23
		// Test facile qui permet d'abord de tenter une localisation bien plus rapide si les coordonnées
24
		// sont dans la bounding box approximative de la France
25
		if($this->testerCoordonneesWgsFrance($coordonnees['latitude'], $coordonnees['longitude'])) {
26
			$infos_coord = $this->chercherInfosCommune('osm', $coordonnees['latitude'], $coordonnees['longitude']);
27
			if ($infos_coord == null) {
28
				// Sinon recherche par pays
29
				$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
30
			}
31
		} else {
32
			// Recherche par pays immédiate si en dehors de la bouding box française
33
			$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
34
		}
35
		return $infos_coord;
36
	}
37
 
38
	public function chercherInfosCommune($projet, $latitude, $longitude) {
39
 
40
		$valeurs_params = '?lat='.$latitude.'&lon='.$longitude;
41
		$url_service = $this->config['cel']['url_service_geo_local'].$valeurs_params;
42
		$url_service = str_replace(',', '.', $url_service);
43
 
44
		$ch = curl_init($url_service);
45
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
46
		$reponse = curl_exec($ch);
47
 
48
		$infos_coord = $this->traiterReponseServiceCommune($reponse);
49
		curl_close($ch);
50
 
51
		return $infos_coord;
52
	}
53
 
54
	public function chercherInfosPays($latitude, $longitude) {
55
 
56
		$valeurs_params = '?lat='.$latitude.'&lon='.$longitude;
57
		$url_service = $this->config['cel']['url_service_geo_mondial'].$valeurs_params;
58
		$url_service = str_replace(',', '.', $url_service);
59
 
60
		$ch = curl_init($url_service);
61
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
62
		$reponse = curl_exec($ch);
63
 
64
		$res = json_decode($reponse, true);
65
		$retour = null;
66
 
67
		if(!empty($res)) {
68
			// Cas où l'on a recherché des coordonnées en France
69
			// On en profite pour remplir plus de données
70
			// que le simple pays si elles sont présentes
71
			if(isset($res[8]) && isset($res[8]['codeInsee'])) {
72
				$retour = array(
73
						'code_insee' => $res[8]['codeInsee'],
74
						'nom' => $res[8]['intitule'],
75
						'type' => 'france'
76
				);
77
			} else {
78
				// Cas de la recherche en dehors de France
79
				// La zone de plus haut niveau est toujours un pays
80
				// (car le niveau de zone est limité à 2)
81
				$infos_pays = $res[min(array_keys($res))];
82
				// La zone de niveau le plus bas est la "localité"
83
				// la plus précise qu'on a pu trouver
84
				$infos_localite = $res[max(array_keys($res))];
85
 
86
				// Cas où l'on a trouvé un code pays
87
				if(!empty($infos_pays['codeIso31661'])) {
88
					$retour = array(
89
							'code_pays' => $infos_pays['codeIso31661'],
90
							'nom' => ''
91
					);
92
				} elseif(!empty($infos_pays['codeIso31662'])) {
93
					// Quelquefois la zone de plus haut niveau est une région ou une province
94
					// heureusement son code est de forme XX-YY ou XX est le code iso du pays !
95
					$retour = array(
96
							'code_pays' => substr($infos_pays['codeIso31662'], 0, 2),
97
							'nom' => ''
98
					);
99
				}
100
 
101
				// Pas de sens de prendre un nom de localité si on a pas de pays
102
				if(!empty($retour['code_pays'])) {
103
					// Type sert à savoir quelle fonction de mise à jour on appellera
104
					$retour['type'] = 'pays';
105
					$retour['nom'] = $infos_localite['intitule'];
106
				}
107
			}
108
		}
109
		return $retour;
110
	}
111
 
112
	public function traiterReponseServiceCommune($reponse) {
113
		$retour = null;
114
		$reponse = json_decode($reponse);
115
		// cas du service lion 1906 qui peut renvoyer plusieurs communes (on prend la première)
116
		if (is_array($reponse)) {
117
			$reponse = $reponse[0];
118
		}
119
		if (isset($reponse->codeINSEE)) {
120
			// Type sert à savoir quelle fonction de mise à jour on appellera
121
			$retour = array('code_insee' => $reponse->codeINSEE,
122
					'nom' => $reponse->nom,
123
					'type' => 'france');
124
		}
125
		return $retour;
126
	}
127
 
128
	private function testerCoordonneesWgsFrance($latitude, $longitude) {
129
		$coord_france = false;
130
		if ($latitude != '' && $longitude != '') {
131
			if ($latitude < 51.071667 && $latitude > 41.316667) {
132
				if ($longitude < 9.513333 && $longitude > -5.140278) {
133
					$coord_france = true;
134
				}
135
			}
136
		}
137
		return $coord_france;
138
	}
139
}