Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
416 aurelien 1
<?php
766 aurelien 2
/**
3
 * Service recherche de commune par coordonnées et vice versa
4
 * Encodage en entrée : utf8
5
 * Encodage en sortie : utf8
6
 *
7
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
9
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
10
 * @version $Id$
11
 */
772 aurelien 12
class CoordSearch extends Cel {
766 aurelien 13
 
14
	private $adresse_service_geonames = null;
15
	private $adresse_service_local = null;
16
 
17
	private $nom_service_geocoding = null;
18
	private $nom_service_reverse_geocoding = null;
19
 
20
	function CoordSearch($config) {
21
 
22
		parent::__construct($config);
23
 
970 aurelien 24
		$this->adresse_service_geonames = $this->config['cel']['url_service_geo_geonames'];
25
		$this->adresse_service_local = $this->config['cel']['url_service_geo_local'];
766 aurelien 26
 
970 aurelien 27
		$this->nom_service_geocoding = $this->config['cel']['nom_service_geocoding_geonames'];
28
		$this->nom_service_reverse_geocoding = $this->config['cel']['nom_service_reverse_geocoding_geonames'];
416 aurelien 29
	}
30
 
766 aurelien 31
	/**
32
	 * Recherche de coordonnées suivant ce qui est fourni
33
	 *
34
	 * $uid[0] = latitude (ou * si recherche coordonnées d'une commune)
35
	 * $uid[1] = longitude (ou * si recherche coordonnées d'une commune)
36
	 * $uid[2] = commune (ou * si recherche d'une commune correspondant à des coordonnées)
37
	 * $uid[3] = code_postal (ou * si recherche d'une commune correspondant à des coordonnées)
38
	 * $uid[4] = code_pays (ou * si recherche d'une commune correspondant à des coordonnées, par défaut vaut FR)
39
	 */
416 aurelien 40
	function getElement($uid){
41
 
766 aurelien 42
		$header = '';
43
		$retour = array();
416 aurelien 44
 
766 aurelien 45
		$params = $this->traiterParametres($uid);
662 aurelien 46
 
766 aurelien 47
		if ($this->estUneRequeteReverseGeocoding($params)) {
416 aurelien 48
 
766 aurelien 49
			$informations_communes = $this->effectuerRequeteReverseGeocodingCartoOsm($params['lat'], $params['lon']);
50
 
51
			if (!$informations_communes) {
52
				$informations_communes = $this->effectuerRequeteReverseGeocodingGeonames($params['lat'], $params['lon']);
53
			}
54
 
55
			$header = 'Content-Type: application/json; charset=UTF-8';
56
			$retour = json_encode($informations_communes) ;
416 aurelien 57
 
766 aurelien 58
	    } elseif ($this->estUneRequeteGeocoding($params)) {
970 aurelien 59
 
772 aurelien 60
	    	$informations_coord = $this->effectuerRequeteGeocodingGeonames($params['commune'],$params['code_postal'],$params['code_pays']);
416 aurelien 61
 
766 aurelien 62
			$header = 'Content-Type: application/json; charset=UTF-8';
63
			$retour = json_encode($informations_coord);
416 aurelien 64
 
766 aurelien 65
	    } else {
416 aurelien 66
 
766 aurelien 67
	      $header = 'HTTP/1.0 400 Bad Request';
68
	      $retour = 'Commune ou Coordonnées non spécifiées' ;
69
	    }
416 aurelien 70
 
766 aurelien 71
		header($header);
72
		echo $retour;
73
	}
74
 
75
	protected function traiterParametres($params) {
76
 
77
		$lat = $this->affecterValeurParametreOuDefaut($params, 0, '*');
78
		$lng = $this->affecterValeurParametreOuDefaut($params, 1, '*');
416 aurelien 79
 
766 aurelien 80
		$commune = $this->affecterValeurParametreOuDefaut($params, 2, '*');
81
		$code_postal = $this->affecterValeurParametreOuDefaut($params, 3, '*');
970 aurelien 82
 
83
		if(strlen($code_postal) > 2) {
84
			$code_postal = substr($code_postal,0,2);
85
		}
416 aurelien 86
 
766 aurelien 87
		$code_pays = $this->affecterValeurParametreOuDefaut($params, 4, 'FR');
88
 
89
		return array('lat' => $lat, 'lon' => $lng, 'commune' => $commune,
90
					'code_postal' => $code_postal, 'code_pays' => $code_pays);
91
	}
92
 
93
	private function affecterValeurParametreOuDefaut($params, $indice, $valeur_si_non_present) {
94
		return isset($params[$indice]) ? str_replace('"','',urldecode($params[$indice])) : $valeur_si_non_present;
95
	}
96
 
97
	private function estUneRequeteReverseGeocoding($params) {
98
 
99
		return ($params['lat'] != '*' && $params['lon'] != '*');
100
	}
101
 
102
	private function estUneRequeteGeocoding($params) {
103
		return ($params['commune'] != '*');
104
	}
105
 
106
	private function effectuerRequeteReverseGeocodingCartoOsm($lat, $lon) {
107
 
108
		$infos_commune_json = @file_get_contents($this->url_service_geo_local."?lat=".$lat."&lon=".$lon);
109
		$infos_commune = json_decode($infos_commune_json);
110
 
970 aurelien 111
		print_r($infos_commune);
112
 
766 aurelien 113
		$retour = false;
114
 
115
		if ($this->estUnRetourOsmValide($infos_commune)) {
116
			$retour = array('nom' => $infos_commune->nom, 'code_insee' => $infos_commune->codeINSEE);
117
		}
118
 
119
		return $retour;
120
	}
121
 
122
	private function estUnretourOsmValide($retour) {
123
		return (is_a($retour,'stdClass') && property_exists($retour,'nom') && property_exists($retour,'codeINSEE'));
124
	}
125
 
126
	private function effectuerRequeteReverseGeocodingGeonames($lat, $lon) {
127
 
128
		$infos_commune_json = @file_get_contents($this->adresse_service_geonames.
129
												$this->nom_service_reverse_geocoding.
130
												"?featureClass=ADM4&lat=".urlencode($lat)."&lng=".urlencode($lon).
131
												"&style=full") ;
772 aurelien 132
 
766 aurelien 133
		$objet_retour = json_decode($infos_commune_json);
134
 
135
		$retour = false;
772 aurelien 136
		if($this->estUnRetourReverseGeocodingGeonamesValide($objet_retour)) {
137
			$retour = array('nom' => $objet_retour->geonames[0]->name, 'code_insee' => $objet_retour->geonames[0]->adminCode4);
766 aurelien 138
		}
139
 
140
		return $retour;
141
	}
142
 
772 aurelien 143
	private function estUnRetourReverseGeocodingGeonamesValide($retour) {
766 aurelien 144
 
145
		$valide = false;
146
 
147
		if (is_a($retour,'stdClass') && property_exists($retour,'geonames')
794 aurelien 148
			&& is_array($retour->geonames) && count($retour->geonames) > 0) {
772 aurelien 149
			$objet_resultats = $retour->geonames[0];
150
			if (property_exists($objet_resultats,'adminName4') && property_exists($objet_resultats,'adminCode2')) {
766 aurelien 151
				$valide = true;
152
			}
153
		}
154
 
155
		return $valide;
156
	}
157
 
158
	private function effectuerRequeteGeocodingGeonames($commune, $code_postal, $code_pays) {
159
 
160
		$requete = $this->adresse_service_geonames.
161
				$this->nom_service_geocoding.
162
				"?placename_startsWith=".urlencode($commune);
416 aurelien 163
 
766 aurelien 164
		if($code_postal != '*') {
165
			$requete .= "&postalcode_startsWith=".urlencode($code_postal);
416 aurelien 166
	    }
766 aurelien 167
		$requete .= "&country=".urlencode($code_pays)."&maxRows=10" ;
416 aurelien 168
 
766 aurelien 169
		$coord_json = @file_get_contents($requete);
772 aurelien 170
		$objet_retour = json_decode($coord_json);
171
 
172
		$retour = false;
173
 
174
		if($this->estUnRetourGeocodingGeonamesValide($objet_retour)) {
175
			$retour = array('lat' => $objet_retour->postalCodes[0]->lat,
176
							'lng' => $objet_retour->postalCodes[0]->lng,
177
							'nom' => $objet_retour->postalCodes[0]->placeName,
178
							'code_insee' => $objet_retour->postalCodes[0]->postalCode
179
							);
180
		}
766 aurelien 181
 
772 aurelien 182
		return $retour;
416 aurelien 183
	}
772 aurelien 184
 
185
	private function estUnRetourGeocodingGeonamesValide($retour) {
186
		$valide = false;
187
 
188
		if (is_a($retour,'stdClass') && property_exists($retour,'postalCodes')
794 aurelien 189
			&& is_array($retour->postalCodes) && count($retour->postalCodes) > 0) {
772 aurelien 190
			$objet_resultats = $retour->postalCodes[0];
191
			if (property_exists($objet_resultats,'lat') && property_exists($objet_resultats,'lng')) {
192
				$valide = true;
193
			}
194
		}
195
 
196
		return $valide;
197
	}
416 aurelien 198
}
809 aurelien 199
?>