Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 662 Rev 766
1
<?php
1
<?php
-
 
2
/**
-
 
3
 * Service recherche de commune par coordonnées et vice versa
2
// CRUD ligne d'inventaire :
4
 * Encodage en entrée : utf8
3
// In get : 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>
4
// In post : utf8
10
 * @version $Id$
-
 
11
 */
5
// out : utf8
12
class CoordSearch {
-
 
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) {
6
 
21
		
-
 
22
		parent::__construct($config);
7
Class CoordSearch extends DBAccessor {
23
		
8
 
24
		$this->adresse_service_geonames = $config['cel_db']['url_service_geo_geonames'];
-
 
25
		$this->adresse_service_local = $config['cel_db']['url_service_geo_local'];
9
	function Inventory($config) {
26
		
-
 
27
		$this->nom_service_geocoding = $config['cel_db']['nom_service_geocoding_geonames'];
-
 
28
		$this->nom_service_reverse_geocoding = $config['cel_db']['nom_service_reverse_geocoding_geonames'];
10
 
29
	}
-
 
30
 
-
 
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)
11
		$this->config=$config;
36
	 * $uid[2] = commune (ou * si recherche d'une commune correspondant à des coordonnées)
12
	}
37
	 * $uid[3] = code_postal (ou * si recherche d'une commune correspondant à des coordonnées)
13
 
38
	 * $uid[4] = code_pays (ou * si recherche d'une commune correspondant à des coordonnées, par défaut vaut FR)
-
 
39
	 */
14
 
40
	function getElement($uid){
-
 
41
 
-
 
42
		$header = '';
-
 
43
		$retour = array();
-
 
44
 
-
 
45
		$params = $this->traiterParametres($uid);
-
 
46
		
-
 
47
		if ($this->estUneRequeteReverseGeocoding($params)) {
-
 
48
 
-
 
49
			$informations_communes = $this->effectuerRequeteReverseGeocodingCartoOsm($params['lat'], $params['lon']);
-
 
50
			
-
 
51
			if (!$informations_communes) {
15
	function getElement($uid){
-
 
16
 
52
				$informations_communes = $this->effectuerRequeteReverseGeocodingGeonames($params['lat'], $params['lon']);
17
	   // Controle detournement utilisateur
-
 
18
	    session_start();
53
			}
-
 
54
			
19
		$value=array();
55
			$header = 'Content-Type: application/json; charset=UTF-8';
20
 
-
 
21
		$lat = str_replace('"','',urldecode($uid[0]));
-
 
22
		$lng = str_replace('"','',urldecode($uid[1]));
56
			$retour = json_encode($informations_communes) ;
-
 
57
 
23
 
58
	    } elseif ($this->estUneRequeteGeocoding($params)) {
-
 
59
	    	
24
		$commune = urldecode($uid[2]);
60
	    	$informations_coord = $this->effectuerRequeteGeocodingGeonames($params['commune'],$params['code_postal'],$params['pays']);
25
		$code_postal = str_replace('"','',urldecode($uid[3]));
61
 
-
 
62
			$header = 'Content-Type: application/json; charset=UTF-8';
-
 
63
			$retour = json_encode($informations_coord);
26
		
-
 
27
		$coord_json = json_encode(array());
64
 
28
 
-
 
-
 
65
	    } else {
29
		if(isset($uid[4]) && $uid[4] != "*" && $uid[4] != "?") {
66
 
30
			$code_pays = urldecode($uid[4]);
67
	      $header = 'HTTP/1.0 400 Bad Request';
-
 
68
	      $retour = 'Commune ou Coordonnées non spécifiées' ;
31
		} else {
69
	    }
-
 
70
 
-
 
71
		header($header);
32
			$code_pays = 'FR';
72
		echo $retour;
33
		}
73
	}
34
 
-
 
35
		if($lat != '*' && $lng != '*') {
74
	
-
 
75
	protected function traiterParametres($params) {
-
 
76
		
36
 
77
		$lat = $this->affecterValeurParametreOuDefaut($params, 0, '*');
37
			$commune_json = @file_get_contents("http://ws.geonames.org/findNearbyJSON?featureClass=ADM4&lat=".urlencode($lat)."&lng=".urlencode($lng)."&style=full") ;
-
 
-
 
78
		$lng = $this->affecterValeurParametreOuDefaut($params, 1, '*'); 
-
 
79
 
-
 
80
		$commune = $this->affecterValeurParametreOuDefaut($params, 2, '*'); 
-
 
81
		$code_postal = $this->affecterValeurParametreOuDefaut($params, 3, '*');
-
 
82
 
38
			header("Content-Type: text/html; charset=UTF-8");
83
		$code_pays = $this->affecterValeurParametreOuDefaut($params, 4, 'FR');
39
			$value = $commune_json ;
84
		
-
 
85
		return array('lat' => $lat, 'lon' => $lng, 'commune' => $commune,
-
 
86
					'code_postal' => $code_postal, 'code_pays' => $code_pays);
40
 
87
	}
-
 
88
	
41
	    } elseif($commune != '*') {
89
	private function affecterValeurParametreOuDefaut($params, $indice, $valeur_si_non_present) {
-
 
90
		return isset($params[$indice]) ? str_replace('"','',urldecode($params[$indice])) : $valeur_si_non_present; 
-
 
91
	}
-
 
92
	
42
 
93
	private function estUneRequeteReverseGeocoding($params) {
-
 
94
		
-
 
95
		return ($params['lat'] != '*' && $params['lon'] != '*');
-
 
96
	}
-
 
97
	
-
 
98
	private function estUneRequeteGeocoding($params) {
-
 
99
		return ($params['commune'] != '*');
-
 
100
	}
-
 
101
	
-
 
102
	private function effectuerRequeteReverseGeocodingCartoOsm($lat, $lon) {
-
 
103
		
-
 
104
		$infos_commune_json = @file_get_contents($this->url_service_geo_local."?lat=".$lat."&lon=".$lon);
-
 
105
		$infos_commune = json_decode($infos_commune_json);
-
 
106
		
-
 
107
		$retour = false;
-
 
108
		
-
 
109
		if ($this->estUnRetourOsmValide($infos_commune)) {
-
 
110
			$retour = array('nom' => $infos_commune->nom, 'code_insee' => $infos_commune->codeINSEE);
-
 
111
		}
-
 
112
		
-
 
113
		return $retour;
-
 
114
	}
-
 
115
	
-
 
116
	private function estUnretourOsmValide($retour) {
-
 
117
		return (is_a($retour,'stdClass') && property_exists($retour,'nom') && property_exists($retour,'codeINSEE'));
-
 
118
	}
-
 
119
	
-
 
120
	private function effectuerRequeteReverseGeocodingGeonames($lat, $lon) {
-
 
121
		
-
 
122
		$infos_commune_json = @file_get_contents($this->adresse_service_geonames.
-
 
123
												$this->nom_service_reverse_geocoding.
-
 
124
												"?featureClass=ADM4&lat=".urlencode($lat)."&lng=".urlencode($lon).
-
 
125
												"&style=full") ;
-
 
126
		$objet_retour = json_decode($infos_commune_json);
-
 
127
		
-
 
128
		$retour = false;
-
 
129
		
43
			$requete = "http://ws.geonames.org/postalCodeSearchJSON?placename_startsWith=".urlencode($commune);
130
		if($this->estUnRetourGeonamesValide($retour)) { 
-
 
131
			$retour = array('nom' => $objet_retour->geonames[0]->name, 'code_insee' => $objet_retour->geonames[0]->AdminCode2);
-
 
132
		}
-
 
133
		
-
 
134
		return $retour;
-
 
135
	}
-
 
136
	
-
 
137
	private function estUnRetourGeonamesValide($retour) {
-
 
138
		
-
 
139
		$valide = false;
-
 
140
		
-
 
141
		if (is_a($retour,'stdClass') && property_exists($retour,'geonames') 
-
 
142
			&& is_array($retour->geonames) && count($retour->geonames > 0)) {
-
 
143
			$objet_resultats = $objet_retour->geonames[0];
-
 
144
			if (property_exists($objet_resultats,'name') && property_exists($objet_resultats,'AdminCode2')) {
-
 
145
				$valide = true;
-
 
146
			}
44
 
147
		} 
45
			if($code_postal != '*') {
148
		
46
				$requete .= "&postalcode_startsWith=".urlencode($code_postal);
149
		return $valide;
47
	    	}
150
	}
48
			$requete .= "&country=".urlencode($code_pays)."&maxRows=10" ;
151
	
49
 
152
	private function effectuerRequeteGeocodingGeonames($commune, $code_postal, $code_pays) {
50
			$coord_json = @file_get_contents($requete);
153
		
51
 
154
		$requete = $this->adresse_service_geonames.
52
			header("Content-Type: text/html; charset=UTF-8");
155
				$this->nom_service_geocoding.
53
			$value = $coord_json ;
156
				"?placename_startsWith=".urlencode($commune);
54
 
157
 
55
	    } else {
158
		if($code_postal != '*') {
56
 
159
			$requete .= "&postalcode_startsWith=".urlencode($code_postal);
57
	      header('HTTP/1.0 400 Bad Request');
160
	    }
58
	      echo "Commune ou Coordonnées non spécifiées " ;
161
		$requete .= "&country=".urlencode($code_pays)."&maxRows=10" ;
59
	      exit;
162
 
60
	    }
163
		$coord_json = @file_get_contents($requete);
61
 
164
 
62
		print $value;
165
		return $coord_json;
63
	}
166
	}
64
}
167
}
65
?>
168
?>