/[openfoncier]/trunk/obj/geoads.class.php
ViewVC logotype

Contents of /trunk/obj/geoads.class.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5024 - (show annotations)
Wed Nov 2 14:39:23 2016 UTC (8 years, 3 months ago) by softime
File size: 19516 byte(s)
* Merge de la branche de développement 3.33.x

1 <?php
2 /**
3 * La classe 'geoads' est une classe d'abstraction, spécifique à openADS,
4 * permettant de gérer les requêtes vers divers webservices SIG et ainsi
5 * proposer aux utilisateurs des informations géographiques.
6 * Cette classe est instanciée et utilisée par d'autres scripts pour
7 * gérer notamment la vérification de parcelles et ce peu importe le SIG utilisé.
8 * Son objectif est d'instancier les classes spécifiques aux SIG aussi appelées
9 * connecteurs correspondant au paramétrage de la collectivité.
10 *
11 * Ces connecteurs héritent de la classe 'geoads_base' qui leur sert de modèle.
12 *
13 * Enfin la classe 'geoads_exception' permet de gérer les erreurs.
14 * Plusieurs classes en héritent afin de spécifier le type d'exception.
15 *
16 * @package openads
17 * @version SVN : $Id$
18 */
19
20 /**
21 * Abstracteur de la géolocalisation spécifique à openADS
22 */
23 class geoads {
24 /**
25 * Cet attribut permet de stocker l'instance du connecteur SIG utilisé.
26 * Sa valeur doit être remplie en fonction du paramétrage de la collectivité.
27 *
28 * @var object instance du connecteur SIG
29 */
30 var $sig = null;
31
32
33 /**
34 * Le constructeur instancie la classe du SIG envoyée par le paramétrage
35 * de la collectivité.
36 *
37 * @param array $collectivite Identifiant de la collectivité.
38 */
39 public function __construct(array $collectivite) {
40 // Récupération de la conf sig de la collectivité
41 $this->collectivite = $collectivite;
42 if(!isset($this->collectivite['sig'])) {
43 throw new geoads_configuration_exception();
44 }
45 // instanciation du connecteur
46 $path = "";
47 if(isset($this->collectivite['sig']['path'])) {
48 $path = $this->collectivite['sig']['path'];
49 }
50 $connecteur = 'geoads_'.$this->collectivite['sig']['connector'];
51 require_once $path.$connecteur.'.class.php';
52 $this->sig = new $connecteur($this->collectivite);
53 }
54
55
56 /**
57 * Le destructeur permet de détruire la ressource instanciée
58 * dans le constructeur
59 */
60 public function __destruct() {
61 if ($this->sig != null) {
62 unset($this->sig);
63 }
64 }
65
66
67 /**
68 * GET- Vérification d'existence de parcelles et récupération de leurs adresses.
69 *
70 * openADS fournit une liste de parcelles. Le SIG renvoie une collection,
71 * en mentionnant pour chaque parcelle si elle existe, et le cas échéant
72 * l'adresse qui y est rattachée.
73 *
74 * @param array $parcelles Tableau de parcelles à interroger.
75 * Exemple de structure du tableau d'entrée pour une
76 * seule parcelle :
77 * array (
78 * array(
79 * 'prefixe' => string,
80 * 'quartier' => string,
81 * 'section' => string,
82 * 'parcelle' => string
83 * ), // ...
84 * ).
85 *
86 * @return array Tableau de résultats (un sous-tableau par parcelle) :
87 * array(
88 * array (
89 * "parcelle"=> "1312158980H0126",
90 * "existe"=> true,
91 * "adresse"=> array (
92 * "numero_voie"=> "666",
93 * "type_voie"=> "RUE",
94 * "nom_voie"=> "DE LA LIBERTE",
95 * "arrondissement"=> "11"
96 * )
97 * ), // ...
98 * )
99 * La parcelle n'existe pas :
100 * array(
101 * array (
102 * "parcelle"=> "1312158980H0126",
103 * "existe"=> false,
104 * ), // ...
105 * )
106 */
107 public function verif_parcelle(array $parcelles) {
108
109 // S'il ne s'agit pas d'un ensemble de parcelles
110 if (!is_array($parcelles) or empty($parcelles)){
111 // On lève une exception
112 throw new geoads_parameter_exception(_("Veuillez vérifier que les references cadastrales ont bien ete saisies"));
113 }
114
115 // On retourne les parcelles
116 return $this->sig->verif_parcelle($parcelles);
117 }
118
119
120 /**
121 * POST -Déclenche sur lme SIG le calcul de l'emprise des parcelles d'un dossier.
122 *
123 * openADS fournit une liste de parcelles et le numéro de dossier correspondant.
124 * Le SIG renvoie un statut, spécifiant si le calcul été effectué correctement ou non.
125 *
126 * @param array $parcelles Tableau de parcelles.
127 * Exemple de structure du tableau d'entrée pour une
128 * seule parcelle :
129 * array (
130 * array(
131 * 'prefixe' => string,
132 * 'quartier' => string,
133 * 'section' => string,
134 * 'parcelle' => string
135 * ), // ...
136 * ).
137 * @param string $dossier Numéro du dossier. Ex. : PC1305515J0045P0.
138 *
139 * @return boolean true si le calcul est OK, false sinon
140 */
141 public function calcul_emprise(array $parcelles, $dossier) {
142 // S'il ne s'agit pas d'un ensemble de parcelles ou manque le dossier
143 if (!is_array($parcelles) or count($parcelles) == 0 or $dossier == "") {
144 // On lève une exception
145 throw new geoads_parameter_exception();
146 }
147 // Retourne true ou false
148 return $this->sig->calcul_emprise($parcelles, $dossier);
149 }
150
151
152 /**
153 * POST - Déclenche sur le SIG le calcul du centroïde d'un dossier.
154 *
155 * openADS appelle la méthode centroide sur la ressource du dossier souhaité.
156 * Si le calcul du centroïde est conduit avec succès, le SIG renvoie un
157 * statut positif, accompagné des coordonnées du centroïde. Dans le cas
158 * contraire, le SIG renvoie un statut négatif.
159 *
160 * @param string $dossier Numéro du dossier. Ex. : PC1305515J0045P0.
161 *
162 * @return mixed Coordonnées du centroïde
163 * array(
164 * "statut_calcul_centroide" => true,
165 * "x" => "1888778.84",
166 * "y" => "3131268.88"
167 * )
168 * ou false si le calcul a échoué
169 */
170 public function calcul_centroide($dossier) {
171 // S'il manque le dossier
172 if ($dossier == ""){
173 // On lève une exception
174 throw new geoads_parameter_exception();
175 }
176 // Centroid ou false
177 return $this->sig->calcul_centroide($dossier);
178 }
179
180
181 /**
182 * GET - Récupération des contraintes applicables sur un dossier.
183 *
184 * openADS appelle la méthode contrainte sur la ressource du dossier souhaité.
185 * Le SIG renvoie une collection de contraintes qui s'y appliquent.
186 *
187 * @param string $dossier Numéro du dossier. Ex. : PC1305515J0045P0.
188 *
189 * @return array Tableau de contraintes :
190 * array(
191 * array(
192 * "contrainte" => "26",
193 * "groupe_contrainte" => "ZONES DU PLU",
194 * "sous_groupe_contrainte" => "protection",
195 * "libelle" => "Une seconde contrainte du PLU",
196 * ), // ...
197 * )
198 */
199 public function recup_contrainte_dossier($dossier) {
200 // S'il manque le dossier
201 if ($dossier == ""){
202 // On lève une exception
203 throw new geoads_parameter_exception();
204 }
205
206 // récupère les contraintes applicables sur un dossier
207 return $this->sig->recup_contrainte_dossier($dossier);
208 }
209
210
211 /**
212 * GET - Récupération de toutes les contraintes existantes pour une commune.
213 *
214 * OpenADS appelle le SIG en précisant seulement le code INSEE de la commune.
215 * Il renvoie une collection de l'intégralité des contraintes existantes.
216 *
217 * @return array Tableau de toutes les contraintes existantes.
218 * array(
219 * array(
220 * "groupe_contrainte" => "ZONES DU PLU",
221 * "contrainte" => "26",
222 * "libelle" => "Une seconde contrainte du PLU",
223 * "sous_groupe_contrainte" => "protection",
224 * )
225 * )
226 */
227 public function recup_toutes_contraintes() {
228
229 // récupère les contraintes applicables sur la commune
230 return $this->sig->recup_toutes_contraintes($this->collectivite["insee"]);
231 }
232
233
234 /**
235 * Redirection vers le SIG dans le contexte de dessin d'emprise pour un
236 * dossier.
237 *
238 * @param array $parcelles Tableau de parcelles.
239 * @param string $dossier L'identifiant du dossier.
240 *
241 * @return string L'url du SIG
242 */
243 public function redirection_web_emprise(array $parcelles, $dossier) {
244 // S'il ne s'agit pas d'un ensemble de parcelles ou manque le dossier
245 if (!is_array($parcelles) or count($parcelles) == 0 or $dossier == "") {
246 // On lève une exception
247 throw new geoads_parameter_exception();
248 }
249 //
250 return $this->sig->redirection_web_emprise($parcelles, $dossier);
251 }
252
253
254 /**
255 * Redirection vers le SIG dans le contexte de visualisation du dossier.
256 * Si les deux arguments sont nuls, c'est l'url par défaut du sig qui doit
257 * être retourné.
258 *
259 * @param array $parcelles Tableau de parcelles.
260 * @param string $dossier L'identifiant du dossier.
261 *
262 * @return string L'url du SIG
263 */
264 public function redirection_web(array $parcelles = null, $dossier = null) {
265
266 // récupère les contraintes applicables sur un dossier
267 return $this->sig->redirection_web($parcelles, $dossier);
268 }
269
270
271 }
272
273 /**
274 * Classe parente de tous les connecteurs SIG
275 */
276 class geoads_base {
277
278 /**
279 * Handler d'envoi de messages REST ou SOAP.
280 *
281 * @var null
282 */
283 var $messageSender = null;
284
285 /**
286 * Paramètres de connexion au sig
287 *
288 * @var array
289 */
290 var $sig_parameters = array();
291
292 /**
293 * Paramètres de la collectivite
294 *
295 * @var array
296 */
297 var $collectivite_parameters = array();
298
299
300 /**
301 * Le constructeur instancie le connecteur SIG selon la configuration
302 *
303 * @param array $collectivite Configuration du connecteur.
304 */
305 public function __construct(array $collectivite) {
306 // Config du connecteur SIG de la collectivité en attribut
307 $this->set_sig_config($collectivite['sig']);
308 // Parametres de la collectivité
309 $this->set_collectivite_parameters($collectivite);
310 // Instance de la classe permettant d'envoyer des requêtes REST
311 $this->init_message_sender();
312 }
313
314
315 public function init_message_sender() {
316 // Cette méthode doit être implémentée par tous les connecteurs
317 throw new geoads_connector_method_not_implemented_exception();
318 }
319
320
321 public function verif_parcelle($parcelles) {
322 // Cette méthode doit être implémentée par tous les connecteurs
323 throw new geoads_connector_method_not_implemented_exception();
324 }
325
326
327 public function calcul_emprise($parcelles, $dossier) {
328 // Cette méthode doit être implémentée par tous les connecteurs
329 throw new geoads_connector_method_not_implemented_exception();
330 }
331
332
333 public function calcul_centroide($dossier) {
334 // Cette méthode doit être implémentée par tous les connecteurs
335 throw new geoads_connector_method_not_implemented_exception();
336 }
337
338
339 public function recup_contrainte_dossier($dossier) {
340 // Cette méthode doit être implémentée par tous les connecteurs
341 throw new geoads_connector_method_not_implemented_exception();
342 }
343
344
345 public function recup_toutes_contraintes($code_insee) {
346 // Cette méthode doit être implémentée par tous les connecteurs
347 throw new geoads_connector_method_not_implemented_exception();
348 }
349
350
351 public function redirection_web_emprise($parcelles, $dossier) {
352 // Cette méthode doit être implémentée par tous les connecteurs
353 throw new geoads_connector_method_not_implemented_exception();
354 }
355
356
357 public function redirection_web($parcelles = null, $dossier = null) {
358 // Cette méthode doit être implémentée par tous les connecteurs
359 throw new geoads_connector_method_not_implemented_exception();
360 }
361
362
363 /**
364 * Défini l'attribut contenant le tableau de configuration du SIG.
365 *
366 * @param array $conf Tableau de config.
367 */
368 public function set_sig_config(array $conf) {
369 $this->sig_parameters = $conf;
370 }
371
372 /**
373 * Défini les paramètres de la collectivite
374 *
375 * @param array $conf Tableau de config de la collectivité.
376 */
377 public function set_collectivite_parameters(array $collectivite) {
378 $this->collectivite_parameters["departement"] = $collectivite["departement"];
379 // Ce om_parametre peut ne pas être défini selon la configuration
380 if (isset($collectivite["code_direction"]) === true) {
381 $this->collectivite_parameters["code_direction"] = $collectivite["code_direction"];
382 }
383 $this->collectivite_parameters["commune"] = $collectivite["commune"];
384 }
385
386
387 /**
388 * Permet de récupérer un élement de configuration.
389 *
390 * @param string $key Nom de la clé de l'élément.
391 *
392 * @return string Valeur de la config.
393 */
394 public function get_sig_config($key) {
395 if(isset($this->sig_parameters[$key]) === false) {
396 throw new geoads_configuration_exception();
397
398 }
399 return $this->sig_parameters[$key];
400 }
401
402
403 /**
404 * Permet de récupérer un élement de paramétrage de la collectivité.
405 *
406 * @param string $key Nom de la clé de l'élément.
407 *
408 * @return string Valeur de la config.
409 */
410 public function get_collectivite_parameter($key) {
411 if(isset($this->collectivite_parameters[$key]) === false) {
412 throw new geoads_configuration_exception($key);
413
414 }
415 return $this->collectivite_parameters[$key];
416 }
417
418
419
420 }
421
422 /**
423 * Classe gérant les erreurs (une exception est levée pour chacune).
424 */
425 class geoads_exception extends Exception {
426
427
428 /**
429 * Construit l'exception
430 *
431 * @param string $message Le message de l'exception à lancer.
432 * @param integer $code Le code de l'exception.
433 * @param Exception $previous L'exception précédente, utilisée pour le chaînage d'exception.
434 */
435 public function __construct($message = "" , $code = 0, Exception $previous = null) {
436 parent::__construct($message, $code, $previous);
437 logger::instance()->writeErrorLogToFile();
438 }
439
440
441 /**
442 * Cette fonction ajoute dans le fichier de log.
443 *
444 * @param string $code Le nom de fichier, ou l'identifiant du fichier.
445 * @param string $msg Le message a logger.
446 */
447 protected function addToLog($code, $msg) {
448 require_once "../core/om_logger.class.php";
449 logger::instance()->log("SIG Connector - Error code : ".$code." -> ".$msg);
450 }
451
452
453 }
454
455 class geoads_bdd_exception extends geoads_exception {
456
457
458 /**
459 * Redéfinition du message d'erreur.
460 */
461 public function __construct() {
462 $message = _("Erreur de base de donnees. Contactez votre administrateur.");
463 // Appel du parent
464 parent::__construct($message);
465 }
466
467
468 }
469
470 class geoads_configuration_exception extends geoads_exception {
471
472
473 /**
474 * Redéfinition du message d'erreur.
475 */
476 public function __construct() {
477 $message = _("Erreur de configuration SIG.")." "._("Veuillez contacter votre administrateur.");
478 // Appel du parent
479 parent::__construct($message);
480 }
481
482
483 }
484
485 class geoads_parameter_exception extends geoads_exception {
486
487
488 /**
489 * Redéfinition du message d'erreur.
490 */
491 public function __construct($message = null) {
492 if($message == null) {
493 $message = _("Parametres d'appel au SIG non valides.")." "._("Veuillez contacter votre administrateur.");
494 }
495 // Appel du parent
496 parent::__construct($message);
497 }
498
499
500 }
501
502
503 /**
504 * Classe de gestion des exceptions sur les methodes non implémentées
505 */
506 class geoads_connector_method_not_implemented_exception extends geoads_exception {
507
508
509 /**
510 * Redéfinition du message d'erreur.
511 */
512 public function __construct() {
513 $message = _("Erreur lors de la connexion au SIG.")." "._("Veuillez contacter votre administrateur");
514 // Appel du parent
515 parent::__construct($message);
516 }
517
518
519 }
520
521 /**
522 * Classe de gestion des exceptions retournée lors d'un code 4XX
523 */
524 class geoads_connector_4XX_exception extends geoads_exception {
525
526
527 /**
528 * Redéfinition du message d'erreur.
529 *
530 * @param string $message Message d'erreur http.
531 * @param integer $code Code de l'erreur http.
532 */
533 public function __construct($message, $code = null) {
534 // Log de l'erreur technique
535 $this->addToLog($code, $message);
536 // Création du log utilisateur
537 $message = _("Erreur lors de la connexion au SIG.")." "._("Veuillez contacter votre administrateur");
538 // Appel du parent
539 parent::__construct($message);
540 }
541
542
543 }
544
545 /**
546 * Classe de gestion des exceptions retournée lors d'un code 5XX
547 */
548 class geoads_connector_5XX_exception extends geoads_exception {
549
550
551 /**
552 * Log et redéfinition du message d'erreur.
553 *
554 * @param string $message Message d'erreur technique.
555 * @param integer $code Code de l'erreur http.
556 */
557 public function __construct($message, $code = null) {
558 // Log de l'erreur technique
559 $this->addToLog($code, $message);
560 // Création du log utilisateur
561 $message = _("Erreur de traitement du SIG.")." "._("Veuillez contacter le service responsable du SIG");
562 // Appel du parent
563 parent::__construct($message);
564 }
565
566
567 }
568
569 /**
570 * Classe de gestion des exceptions génériques remontées par le générateur
571 */
572 class geoads_connector_exception extends geoads_exception {
573
574
575 /**
576 * Log et redéfinition du message d'erreur.
577 *
578 * @param string $message Message d'erreur technique.
579 * @param integer $code Code de l'erreur http.
580 */
581 public function __construct($message = null, $code = null) {
582 // Log de l'erreur technique
583 $this->addToLog($code, $message);
584 // Création du log utilisateur
585 $message = _("Erreur SIG.")." "._("Veuillez contacter votre administrateur");
586 // Appel du parent
587 parent::__construct($message);
588 }
589
590
591 }
592
593
594 ?>

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26