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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18876 - (hide 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 mbroquet 3730 <?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 softime 10573 * @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 mbroquet 3730 */
42 softime 10573 public function __construct(array $collectivite, array $extra_params = array()) {
43 mbroquet 3730 // Récupération de la conf sig de la collectivité
44     $this->collectivite = $collectivite;
45     if(!isset($this->collectivite['sig'])) {
46 softime 9245 throw new geoads_configuration_exception("Pas de SIG configuré pour la collectivité");
47 mbroquet 3730 }
48     // instanciation du connecteur
49 jymadier 3866 $path = "";
50 mbroquet 3730 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 softime 10573 $this->sig = new $connecteur($this->collectivite, $extra_params);
56 mbroquet 3730 }
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 softime 18876 if (!is_array($parcelles) || empty($parcelles)){
114 mbroquet 3730 // On lève une exception
115 softime 18876 throw new geoads_parameter_exception(__("Veuillez vérifier que les references cadastrales ont bien ete saisies"));
116 mbroquet 3730 }
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 softime 14064 if (empty($parcelles) && empty($dossier)) {
147 mbroquet 3730 // 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 softime 13528 /**
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 mbroquet 3730
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 softime 13528 * @return mixed Coordonnées du centroïde et les attributs "parcelles" et "surface"
180 mbroquet 3730 * array(
181     * "statut_calcul_centroide" => true,
182     * "x" => "1888778.84",
183 softime 13528 * "y" => "3131268.88",
184     * "parcelles" => "3200432AB0234;3200432AB0235",
185     * "surface" => "72",
186 mbroquet 3730 * )
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 softime 10573 //
264 mbroquet 3730 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 softime 13528 /**
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 mbroquet 3730
307 softime 13528 /**
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 mbroquet 3730 }
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 softime 10573 /**
347     * Tableau de paramètres en extra
348     *
349     * @var array
350     */
351     protected $extra_params = array();
352 mbroquet 3730
353 softime 10573
354 mbroquet 3730 /**
355     * Le constructeur instancie le connecteur SIG selon la configuration
356     *
357     * @param array $collectivite Configuration du connecteur.
358 softime 10573 * @param array $extra_params Tableau de paramètres en extra
359     *
360     * @return geoads Instance geoads
361 mbroquet 3730 */
362 softime 10573 public function __construct(array $collectivite, array $extra_params = array()) {
363     // Liste des paramètres extra
364     $this->extra_params = $extra_params;
365 mbroquet 3730 // 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 softime 7996 public function verif_parcelle(array $parcelles) {
381 mbroquet 3730 // 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 softime 7996 public function calcul_emprise(array $parcelles, $dossier) {
387 mbroquet 3730 // 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 softime 13528 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 mbroquet 3730 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 softime 7996 public function redirection_web_emprise(array $parcelles, $dossier) {
423 mbroquet 3730 // 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 softime 7996 public function redirection_web(array $parcelles = null, $dossier = null) {
429 mbroquet 3730 // 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 softime 11228 $this->collectivite_parameters["departement"] = strtoupper($collectivite["departement"]);
450 softime 5024 // 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 mbroquet 3730 $this->collectivite_parameters["commune"] = $collectivite["commune"];
455 softime 10573 $this->collectivite_parameters["insee"] = $collectivite["insee"];
456     $this->collectivite_parameters["om_collectivite_idx"] = $collectivite["om_collectivite_idx"];
457 mbroquet 3730 }
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 softime 9245 throw new geoads_configuration_exception("Élément de configuration '$key' non trouvé");
470 mbroquet 3730
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 softime 9245 throw new geoads_configuration_exception("Élément de paramétrage '$key' non trouvé");
486 mbroquet 3730
487     }
488     return $this->collectivite_parameters[$key];
489     }
490    
491 softime 10573 /**
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 softime 13137 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 softime 10573 }
515 mbroquet 3730
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 softime 14064 logger::instance()->cleanLog();
536 mbroquet 3730 }
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 softime 7996 require_once PATH_OPENMAIRIE."om_logger.class.php";
547 mbroquet 3730 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 softime 18876 $message = __("Erreur de base de donnees. Contactez votre administrateur.");
561 mbroquet 3730 // 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 softime 9245 public function __construct($msg = null) {
575 softime 18876 $message = __("Erreur de configuration SIG.")." ".__("Veuillez contacter votre administrateur.").(!empty($msg) ? " Details: $msg" : '');
576 mbroquet 3730 // 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 softime 18876 $message = __("Parametres d'appel au SIG non valides.")." ".__("Veuillez contacter votre administrateur.");
592 mbroquet 3730 }
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 softime 18876 $message = __("Erreur lors de la connexion au SIG.")." ".__("Veuillez contacter votre administrateur");
612 mbroquet 3730 // 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 softime 18876 $message = __("Erreur lors de la connexion au SIG.")." ".__("Veuillez contacter votre administrateur");
636 mbroquet 3730 // 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 softime 18876 $message = __("Erreur de traitement du SIG.")." ".__("Veuillez contacter le service responsable du SIG");
660 mbroquet 3730 // 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 softime 18876 $message = __("Erreur SIG.")." ".__("Veuillez contacter votre administrateur");
684 mbroquet 3730 // Appel du parent
685     parent::__construct($message);
686     }
687    
688    
689     }
690    
691    
692 softime 7996

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26