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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18876 - (show annotations)
Tue Oct 8 08:41:06 2024 UTC (3 months, 2 weeks ago) by softime
File size: 23793 byte(s)
merge: fusion de la branche d'intégration 6.8.0-develop dans le trunk

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 * @param array $extra_params Tableau de paramètres en extra
39 *
40 * @return geoads Instance geoads
41 */
42 public function __construct(array $collectivite, array $extra_params = array()) {
43 // Récupération de la conf sig de la collectivité
44 $this->collectivite = $collectivite;
45 if(!isset($this->collectivite['sig'])) {
46 throw new geoads_configuration_exception("Pas de SIG configuré pour la collectivité");
47 }
48 // instanciation du connecteur
49 $path = "";
50 if(isset($this->collectivite['sig']['path'])) {
51 $path = $this->collectivite['sig']['path'];
52 }
53 $connecteur = 'geoads_'.$this->collectivite['sig']['connector'];
54 require_once $path.$connecteur.'.class.php';
55 $this->sig = new $connecteur($this->collectivite, $extra_params);
56 }
57
58
59 /**
60 * Le destructeur permet de détruire la ressource instanciée
61 * dans le constructeur
62 */
63 public function __destruct() {
64 if ($this->sig != null) {
65 unset($this->sig);
66 }
67 }
68
69
70 /**
71 * GET- Vérification d'existence de parcelles et récupération de leurs adresses.
72 *
73 * openADS fournit une liste de parcelles. Le SIG renvoie une collection,
74 * en mentionnant pour chaque parcelle si elle existe, et le cas échéant
75 * l'adresse qui y est rattachée.
76 *
77 * @param array $parcelles Tableau de parcelles à interroger.
78 * Exemple de structure du tableau d'entrée pour une
79 * seule parcelle :
80 * array (
81 * array(
82 * 'prefixe' => string,
83 * 'quartier' => string,
84 * 'section' => string,
85 * 'parcelle' => string
86 * ), // ...
87 * ).
88 *
89 * @return array Tableau de résultats (un sous-tableau par parcelle) :
90 * array(
91 * array (
92 * "parcelle"=> "1312158980H0126",
93 * "existe"=> true,
94 * "adresse"=> array (
95 * "numero_voie"=> "666",
96 * "type_voie"=> "RUE",
97 * "nom_voie"=> "DE LA LIBERTE",
98 * "arrondissement"=> "11"
99 * )
100 * ), // ...
101 * )
102 * La parcelle n'existe pas :
103 * array(
104 * array (
105 * "parcelle"=> "1312158980H0126",
106 * "existe"=> false,
107 * ), // ...
108 * )
109 */
110 public function verif_parcelle(array $parcelles) {
111
112 // S'il ne s'agit pas d'un ensemble de parcelles
113 if (!is_array($parcelles) || empty($parcelles)){
114 // On lève une exception
115 throw new geoads_parameter_exception(__("Veuillez vérifier que les references cadastrales ont bien ete saisies"));
116 }
117
118 // On retourne les parcelles
119 return $this->sig->verif_parcelle($parcelles);
120 }
121
122
123 /**
124 * POST -Déclenche sur lme SIG le calcul de l'emprise des parcelles d'un dossier.
125 *
126 * openADS fournit une liste de parcelles et le numéro de dossier correspondant.
127 * Le SIG renvoie un statut, spécifiant si le calcul été effectué correctement ou non.
128 *
129 * @param array $parcelles Tableau de parcelles.
130 * Exemple de structure du tableau d'entrée pour une
131 * seule parcelle :
132 * array (
133 * array(
134 * 'prefixe' => string,
135 * 'quartier' => string,
136 * 'section' => string,
137 * 'parcelle' => string
138 * ), // ...
139 * ).
140 * @param string $dossier Numéro du dossier. Ex. : PC1305515J0045P0.
141 *
142 * @return boolean true si le calcul est OK, false sinon
143 */
144 public function calcul_emprise(array $parcelles, $dossier) {
145 // S'il ne s'agit pas d'un ensemble de parcelles ou manque le dossier
146 if (empty($parcelles) && empty($dossier)) {
147 // On lève une exception
148 throw new geoads_parameter_exception();
149 }
150 // Retourne true ou false
151 return $this->sig->calcul_emprise($parcelles, $dossier);
152 }
153
154 /**
155 * POST - Réplique la géolocalisation d'un dossier sur un autre.
156 *
157 * @param string $from Numéro du dossier à partir duquel répliquer
158 * @param string $to Numéro du dossier à géolocaliser
159 *
160 * @return bool 'true' si l'opération réussi, 'false' sinon
161 */
162 public function replicate_geolocalisation(string $from, string $to) {
163 if (empty($from) || empty($to)) {
164 throw new geoads_parameter_exception("Dossier non spécifié");
165 }
166 return $this->sig->replicate_geolocalisation($from, $to);
167 }
168
169 /**
170 * POST - Déclenche sur le SIG le calcul du centroïde d'un dossier.
171 *
172 * openADS appelle la méthode centroide sur la ressource du dossier souhaité.
173 * Si le calcul du centroïde est conduit avec succès, le SIG renvoie un
174 * statut positif, accompagné des coordonnées du centroïde. Dans le cas
175 * contraire, le SIG renvoie un statut négatif.
176 *
177 * @param string $dossier Numéro du dossier. Ex. : PC1305515J0045P0.
178 *
179 * @return mixed Coordonnées du centroïde et les attributs "parcelles" et "surface"
180 * array(
181 * "statut_calcul_centroide" => true,
182 * "x" => "1888778.84",
183 * "y" => "3131268.88",
184 * "parcelles" => "3200432AB0234;3200432AB0235",
185 * "surface" => "72",
186 * )
187 * ou false si le calcul a échoué
188 */
189 public function calcul_centroide($dossier) {
190 // S'il manque le dossier
191 if ($dossier == ""){
192 // On lève une exception
193 throw new geoads_parameter_exception();
194 }
195 // Centroid ou false
196 return $this->sig->calcul_centroide($dossier);
197 }
198
199
200 /**
201 * GET - Récupération des contraintes applicables sur un dossier.
202 *
203 * openADS appelle la méthode contrainte sur la ressource du dossier souhaité.
204 * Le SIG renvoie une collection de contraintes qui s'y appliquent.
205 *
206 * @param string $dossier Numéro du dossier. Ex. : PC1305515J0045P0.
207 *
208 * @return array Tableau de contraintes :
209 * array(
210 * array(
211 * "contrainte" => "26",
212 * "groupe_contrainte" => "ZONES DU PLU",
213 * "sous_groupe_contrainte" => "protection",
214 * "libelle" => "Une seconde contrainte du PLU",
215 * ), // ...
216 * )
217 */
218 public function recup_contrainte_dossier($dossier) {
219 // S'il manque le dossier
220 if ($dossier == ""){
221 // On lève une exception
222 throw new geoads_parameter_exception();
223 }
224
225 // récupère les contraintes applicables sur un dossier
226 return $this->sig->recup_contrainte_dossier($dossier);
227 }
228
229
230 /**
231 * GET - Récupération de toutes les contraintes existantes pour une commune.
232 *
233 * OpenADS appelle le SIG en précisant seulement le code INSEE de la commune.
234 * Il renvoie une collection de l'intégralité des contraintes existantes.
235 *
236 * @return array Tableau de toutes les contraintes existantes.
237 * array(
238 * array(
239 * "groupe_contrainte" => "ZONES DU PLU",
240 * "contrainte" => "26",
241 * "libelle" => "Une seconde contrainte du PLU",
242 * "sous_groupe_contrainte" => "protection",
243 * )
244 * )
245 */
246 public function recup_toutes_contraintes() {
247
248 // récupère les contraintes applicables sur la commune
249 return $this->sig->recup_toutes_contraintes($this->collectivite["insee"]);
250 }
251
252
253 /**
254 * Redirection vers le SIG dans le contexte de dessin d'emprise pour un
255 * dossier.
256 *
257 * @param array $parcelles Tableau de parcelles.
258 * @param string $dossier L'identifiant du dossier.
259 *
260 * @return string L'url du SIG
261 */
262 public function redirection_web_emprise(array $parcelles, $dossier) {
263 //
264 return $this->sig->redirection_web_emprise($parcelles, $dossier);
265 }
266
267
268 /**
269 * Redirection vers le SIG dans le contexte de visualisation du dossier.
270 * Si les deux arguments sont nuls, c'est l'url par défaut du sig qui doit
271 * être retourné.
272 *
273 * @param array $parcelles Tableau de parcelles.
274 * @param string $dossier L'identifiant du dossier.
275 *
276 * @return string L'url du SIG
277 */
278 public function redirection_web(array $parcelles = null, $dossier = null) {
279
280 // récupère les contraintes applicables sur un dossier
281 return $this->sig->redirection_web($parcelles, $dossier);
282 }
283
284 /**
285 * Vérifie si le connecteur implémente une certaine méthode (publique).
286 *
287 * @param string $name Nom de la méthode
288 * @param bool $self 'true' pour que la méthode ne soit pas héritée
289 *
290 * @return bool 'true' si la méthode est implémentée par le connecteur
291 */
292 public function methodIsImplemented(string $method, bool $self = true) {
293 if (! empty($this->sig)) {
294 $class = new ReflectionClass($this->sig);
295 $methods = $class->getMethods(ReflectionMethod::IS_PUBLIC);
296 $classname = get_class($this->sig);
297 $methodsFiltered = array_filter(
298 $methods,
299 function ($m) use ($method, $classname, $self) {
300 return $m->name == $method && (! $self || $m->class == $classname);
301 });
302 return ! empty($methodsFiltered);
303 }
304 return false;
305 }
306
307 /**
308 * Supprime l'emprise d'un dossier dans le SIG.
309 *
310 * @param string $dossier l'identifiant du dossier à supprimer
311 *
312 * @return bool 'true' si la suppression a réussi, 'false' sinon
313 * ou 'null' si l'emprise n'existait pas
314 */
315 public function supprime_emprise(string $dossier) {
316 return $this->sig->supprime_emprise($dossier);
317 }
318 }
319
320 /**
321 * Classe parente de tous les connecteurs SIG
322 */
323 class geoads_base {
324
325 /**
326 * Handler d'envoi de messages REST ou SOAP.
327 *
328 * @var null
329 */
330 var $messageSender = null;
331
332 /**
333 * Paramètres de connexion au sig
334 *
335 * @var array
336 */
337 var $sig_parameters = array();
338
339 /**
340 * Paramètres de la collectivite
341 *
342 * @var array
343 */
344 var $collectivite_parameters = array();
345
346 /**
347 * Tableau de paramètres en extra
348 *
349 * @var array
350 */
351 protected $extra_params = array();
352
353
354 /**
355 * Le constructeur instancie le connecteur SIG selon la configuration
356 *
357 * @param array $collectivite Configuration du connecteur.
358 * @param array $extra_params Tableau de paramètres en extra
359 *
360 * @return geoads Instance geoads
361 */
362 public function __construct(array $collectivite, array $extra_params = array()) {
363 // Liste des paramètres extra
364 $this->extra_params = $extra_params;
365 // Config du connecteur SIG de la collectivité en attribut
366 $this->set_sig_config($collectivite['sig']);
367 // Parametres de la collectivité
368 $this->set_collectivite_parameters($collectivite);
369 // Instance de la classe permettant d'envoyer des requêtes REST
370 $this->init_message_sender();
371 }
372
373
374 public function init_message_sender() {
375 // Cette méthode doit être implémentée par tous les connecteurs
376 throw new geoads_connector_method_not_implemented_exception();
377 }
378
379
380 public function verif_parcelle(array $parcelles) {
381 // Cette méthode doit être implémentée par tous les connecteurs
382 throw new geoads_connector_method_not_implemented_exception();
383 }
384
385
386 public function calcul_emprise(array $parcelles, $dossier) {
387 // Cette méthode doit être implémentée par tous les connecteurs
388 throw new geoads_connector_method_not_implemented_exception();
389 }
390
391
392 public function replicate_geolocalisation(string $from, string $to) {
393 // Cette méthode doit être implémentée par tous les connecteurs
394 throw new geoads_connector_method_not_implemented_exception();
395 }
396
397
398 public function supprime_emprise(string $dossier) {
399 // Cette méthode peut être implémentée par tous les connecteurs
400 throw new geoads_connector_method_not_implemented_exception();
401 }
402
403
404 public function calcul_centroide($dossier) {
405 // Cette méthode doit être implémentée par tous les connecteurs
406 throw new geoads_connector_method_not_implemented_exception();
407 }
408
409
410 public function recup_contrainte_dossier($dossier) {
411 // Cette méthode doit être implémentée par tous les connecteurs
412 throw new geoads_connector_method_not_implemented_exception();
413 }
414
415
416 public function recup_toutes_contraintes($code_insee) {
417 // Cette méthode doit être implémentée par tous les connecteurs
418 throw new geoads_connector_method_not_implemented_exception();
419 }
420
421
422 public function redirection_web_emprise(array $parcelles, $dossier) {
423 // Cette méthode doit être implémentée par tous les connecteurs
424 throw new geoads_connector_method_not_implemented_exception();
425 }
426
427
428 public function redirection_web(array $parcelles = null, $dossier = null) {
429 // Cette méthode doit être implémentée par tous les connecteurs
430 throw new geoads_connector_method_not_implemented_exception();
431 }
432
433
434 /**
435 * Défini l'attribut contenant le tableau de configuration du SIG.
436 *
437 * @param array $conf Tableau de config.
438 */
439 public function set_sig_config(array $conf) {
440 $this->sig_parameters = $conf;
441 }
442
443 /**
444 * Défini les paramètres de la collectivite
445 *
446 * @param array $conf Tableau de config de la collectivité.
447 */
448 public function set_collectivite_parameters(array $collectivite) {
449 $this->collectivite_parameters["departement"] = strtoupper($collectivite["departement"]);
450 // Ce om_parametre peut ne pas être défini selon la configuration
451 if (isset($collectivite["code_direction"]) === true) {
452 $this->collectivite_parameters["code_direction"] = $collectivite["code_direction"];
453 }
454 $this->collectivite_parameters["commune"] = $collectivite["commune"];
455 $this->collectivite_parameters["insee"] = $collectivite["insee"];
456 $this->collectivite_parameters["om_collectivite_idx"] = $collectivite["om_collectivite_idx"];
457 }
458
459
460 /**
461 * Permet de récupérer un élement de configuration.
462 *
463 * @param string $key Nom de la clé de l'élément.
464 *
465 * @return string Valeur de la config.
466 */
467 public function get_sig_config($key) {
468 if(isset($this->sig_parameters[$key]) === false) {
469 throw new geoads_configuration_exception("Élément de configuration '$key' non trouvé");
470
471 }
472 return $this->sig_parameters[$key];
473 }
474
475
476 /**
477 * Permet de récupérer un élement de paramétrage de la collectivité.
478 *
479 * @param string $key Nom de la clé de l'élément.
480 *
481 * @return string Valeur de la config.
482 */
483 public function get_collectivite_parameter($key) {
484 if(isset($this->collectivite_parameters[$key]) === false) {
485 throw new geoads_configuration_exception("Élément de paramétrage '$key' non trouvé");
486
487 }
488 return $this->collectivite_parameters[$key];
489 }
490
491 /**
492 * Permet de lancer une requête sql dans la base de données de l'application.
493 * La requête sql doit être un SELECT.
494 *
495 * @param string $query_sql Requête sql à exécuter.
496 *
497 * @return array|boolean Résultat de la requête sql ou false.
498 */
499 protected function query_db($query_sql, $force_return = true) {
500 if (isset($this->extra_params['inst_framework']) === false) {
501 throw new geoads_exception(__("Il est nécessaire de passer l'instanciation du framework en paramètre pour réaliser des requête en base de données depuis un connecteur SIG."));
502 }
503 $inst_framework = $this->extra_params['inst_framework'];
504 if (stripos($query_sql, 'SELECT') === false) {
505 throw new geoads_exception('Seules les requêtes SQL SELECT sont autorisées.');
506 }
507 return $inst_framework->get_all_results_from_db_query(
508 $query_sql,
509 array(
510 "origin" => __METHOD__,
511 "force_return" => $force_return,
512 )
513 );
514 }
515
516
517 }
518
519 /**
520 * Classe gérant les erreurs (une exception est levée pour chacune).
521 */
522 class geoads_exception extends Exception {
523
524
525 /**
526 * Construit l'exception
527 *
528 * @param string $message Le message de l'exception à lancer.
529 * @param integer $code Le code de l'exception.
530 * @param Exception $previous L'exception précédente, utilisée pour le chaînage d'exception.
531 */
532 public function __construct($message = "" , $code = 0, Exception $previous = null) {
533 parent::__construct($message, $code, $previous);
534 logger::instance()->writeErrorLogToFile();
535 logger::instance()->cleanLog();
536 }
537
538
539 /**
540 * Cette fonction ajoute dans le fichier de log.
541 *
542 * @param string $code Le nom de fichier, ou l'identifiant du fichier.
543 * @param string $msg Le message a logger.
544 */
545 protected function addToLog($code, $msg) {
546 require_once PATH_OPENMAIRIE."om_logger.class.php";
547 logger::instance()->log("SIG Connector - Error code : ".$code." -> ".$msg);
548 }
549
550
551 }
552
553 class geoads_bdd_exception extends geoads_exception {
554
555
556 /**
557 * Redéfinition du message d'erreur.
558 */
559 public function __construct() {
560 $message = __("Erreur de base de donnees. Contactez votre administrateur.");
561 // Appel du parent
562 parent::__construct($message);
563 }
564
565
566 }
567
568 class geoads_configuration_exception extends geoads_exception {
569
570
571 /**
572 * Redéfinition du message d'erreur.
573 */
574 public function __construct($msg = null) {
575 $message = __("Erreur de configuration SIG.")." ".__("Veuillez contacter votre administrateur.").(!empty($msg) ? " Details: $msg" : '');
576 // Appel du parent
577 parent::__construct($message);
578 }
579
580
581 }
582
583 class geoads_parameter_exception extends geoads_exception {
584
585
586 /**
587 * Redéfinition du message d'erreur.
588 */
589 public function __construct($message = null) {
590 if($message == null) {
591 $message = __("Parametres d'appel au SIG non valides.")." ".__("Veuillez contacter votre administrateur.");
592 }
593 // Appel du parent
594 parent::__construct($message);
595 }
596
597
598 }
599
600
601 /**
602 * Classe de gestion des exceptions sur les methodes non implémentées
603 */
604 class geoads_connector_method_not_implemented_exception extends geoads_exception {
605
606
607 /**
608 * Redéfinition du message d'erreur.
609 */
610 public function __construct() {
611 $message = __("Erreur lors de la connexion au SIG.")." ".__("Veuillez contacter votre administrateur");
612 // Appel du parent
613 parent::__construct($message);
614 }
615
616
617 }
618
619 /**
620 * Classe de gestion des exceptions retournée lors d'un code 4XX
621 */
622 class geoads_connector_4XX_exception extends geoads_exception {
623
624
625 /**
626 * Redéfinition du message d'erreur.
627 *
628 * @param string $message Message d'erreur http.
629 * @param integer $code Code de l'erreur http.
630 */
631 public function __construct($message, $code = null) {
632 // Log de l'erreur technique
633 $this->addToLog($code, $message);
634 // Création du log utilisateur
635 $message = __("Erreur lors de la connexion au SIG.")." ".__("Veuillez contacter votre administrateur");
636 // Appel du parent
637 parent::__construct($message);
638 }
639
640
641 }
642
643 /**
644 * Classe de gestion des exceptions retournée lors d'un code 5XX
645 */
646 class geoads_connector_5XX_exception extends geoads_exception {
647
648
649 /**
650 * Log et redéfinition du message d'erreur.
651 *
652 * @param string $message Message d'erreur technique.
653 * @param integer $code Code de l'erreur http.
654 */
655 public function __construct($message, $code = null) {
656 // Log de l'erreur technique
657 $this->addToLog($code, $message);
658 // Création du log utilisateur
659 $message = __("Erreur de traitement du SIG.")." ".__("Veuillez contacter le service responsable du SIG");
660 // Appel du parent
661 parent::__construct($message);
662 }
663
664
665 }
666
667 /**
668 * Classe de gestion des exceptions génériques remontées par le générateur
669 */
670 class geoads_connector_exception extends geoads_exception {
671
672
673 /**
674 * Log et redéfinition du message d'erreur.
675 *
676 * @param string $message Message d'erreur technique.
677 * @param integer $code Code de l'erreur http.
678 */
679 public function __construct($message = null, $code = null) {
680 // Log de l'erreur technique
681 $this->addToLog($code, $message);
682 // Création du log utilisateur
683 $message = __("Erreur SIG.")." ".__("Veuillez contacter votre administrateur");
684 // Appel du parent
685 parent::__construct($message);
686 }
687
688
689 }
690
691
692

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26