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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11228 - (hide annotations)
Tue Jan 18 17:22:30 2022 UTC (3 years ago) by softime
File size: 21123 byte(s)
* Fusion de la branche d'intégration 5.6.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     if (!is_array($parcelles) or 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 (!is_array($parcelles) or count($parcelles) == 0 or $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     /**
156     * POST - Déclenche sur le SIG le calcul du centroïde d'un dossier.
157     *
158     * openADS appelle la méthode centroide sur la ressource du dossier souhaité.
159     * Si le calcul du centroïde est conduit avec succès, le SIG renvoie un
160     * statut positif, accompagné des coordonnées du centroïde. Dans le cas
161     * contraire, le SIG renvoie un statut négatif.
162     *
163     * @param string $dossier Numéro du dossier. Ex. : PC1305515J0045P0.
164     *
165     * @return mixed Coordonnées du centroïde
166     * array(
167     * "statut_calcul_centroide" => true,
168     * "x" => "1888778.84",
169     * "y" => "3131268.88"
170     * )
171     * ou false si le calcul a échoué
172     */
173     public function calcul_centroide($dossier) {
174     // S'il manque le dossier
175     if ($dossier == ""){
176     // On lève une exception
177     throw new geoads_parameter_exception();
178     }
179     // Centroid ou false
180     return $this->sig->calcul_centroide($dossier);
181     }
182    
183    
184     /**
185     * GET - Récupération des contraintes applicables sur un dossier.
186     *
187     * openADS appelle la méthode contrainte sur la ressource du dossier souhaité.
188     * Le SIG renvoie une collection de contraintes qui s'y appliquent.
189     *
190     * @param string $dossier Numéro du dossier. Ex. : PC1305515J0045P0.
191     *
192     * @return array Tableau de contraintes :
193     * array(
194     * array(
195     * "contrainte" => "26",
196     * "groupe_contrainte" => "ZONES DU PLU",
197     * "sous_groupe_contrainte" => "protection",
198     * "libelle" => "Une seconde contrainte du PLU",
199     * ), // ...
200     * )
201     */
202     public function recup_contrainte_dossier($dossier) {
203     // S'il manque le dossier
204     if ($dossier == ""){
205     // On lève une exception
206     throw new geoads_parameter_exception();
207     }
208    
209     // récupère les contraintes applicables sur un dossier
210     return $this->sig->recup_contrainte_dossier($dossier);
211     }
212    
213    
214     /**
215     * GET - Récupération de toutes les contraintes existantes pour une commune.
216     *
217     * OpenADS appelle le SIG en précisant seulement le code INSEE de la commune.
218     * Il renvoie une collection de l'intégralité des contraintes existantes.
219     *
220     * @return array Tableau de toutes les contraintes existantes.
221     * array(
222     * array(
223     * "groupe_contrainte" => "ZONES DU PLU",
224     * "contrainte" => "26",
225     * "libelle" => "Une seconde contrainte du PLU",
226     * "sous_groupe_contrainte" => "protection",
227     * )
228     * )
229     */
230     public function recup_toutes_contraintes() {
231    
232     // récupère les contraintes applicables sur la commune
233     return $this->sig->recup_toutes_contraintes($this->collectivite["insee"]);
234     }
235    
236    
237     /**
238     * Redirection vers le SIG dans le contexte de dessin d'emprise pour un
239     * dossier.
240     *
241     * @param array $parcelles Tableau de parcelles.
242     * @param string $dossier L'identifiant du dossier.
243     *
244     * @return string L'url du SIG
245     */
246     public function redirection_web_emprise(array $parcelles, $dossier) {
247 softime 10573 //
248 mbroquet 3730 return $this->sig->redirection_web_emprise($parcelles, $dossier);
249     }
250    
251    
252     /**
253     * Redirection vers le SIG dans le contexte de visualisation du dossier.
254     * Si les deux arguments sont nuls, c'est l'url par défaut du sig qui doit
255     * être retourné.
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(array $parcelles = null, $dossier = null) {
263    
264     // récupère les contraintes applicables sur un dossier
265     return $this->sig->redirection_web($parcelles, $dossier);
266     }
267    
268    
269     }
270    
271     /**
272     * Classe parente de tous les connecteurs SIG
273     */
274     class geoads_base {
275    
276     /**
277     * Handler d'envoi de messages REST ou SOAP.
278     *
279     * @var null
280     */
281     var $messageSender = null;
282    
283     /**
284     * Paramètres de connexion au sig
285     *
286     * @var array
287     */
288     var $sig_parameters = array();
289    
290     /**
291     * Paramètres de la collectivite
292     *
293     * @var array
294     */
295     var $collectivite_parameters = array();
296    
297 softime 10573 /**
298     * Tableau de paramètres en extra
299     *
300     * @var array
301     */
302     protected $extra_params = array();
303 mbroquet 3730
304 softime 10573
305 mbroquet 3730 /**
306     * Le constructeur instancie le connecteur SIG selon la configuration
307     *
308     * @param array $collectivite Configuration du connecteur.
309 softime 10573 * @param array $extra_params Tableau de paramètres en extra
310     *
311     * @return geoads Instance geoads
312 mbroquet 3730 */
313 softime 10573 public function __construct(array $collectivite, array $extra_params = array()) {
314     // Liste des paramètres extra
315     $this->extra_params = $extra_params;
316 mbroquet 3730 // Config du connecteur SIG de la collectivité en attribut
317     $this->set_sig_config($collectivite['sig']);
318     // Parametres de la collectivité
319     $this->set_collectivite_parameters($collectivite);
320     // Instance de la classe permettant d'envoyer des requêtes REST
321     $this->init_message_sender();
322     }
323    
324    
325     public function init_message_sender() {
326     // Cette méthode doit être implémentée par tous les connecteurs
327     throw new geoads_connector_method_not_implemented_exception();
328     }
329    
330    
331 softime 7996 public function verif_parcelle(array $parcelles) {
332 mbroquet 3730 // Cette méthode doit être implémentée par tous les connecteurs
333     throw new geoads_connector_method_not_implemented_exception();
334     }
335    
336    
337 softime 7996 public function calcul_emprise(array $parcelles, $dossier) {
338 mbroquet 3730 // Cette méthode doit être implémentée par tous les connecteurs
339     throw new geoads_connector_method_not_implemented_exception();
340     }
341    
342    
343     public function calcul_centroide($dossier) {
344     // Cette méthode doit être implémentée par tous les connecteurs
345     throw new geoads_connector_method_not_implemented_exception();
346     }
347    
348    
349     public function recup_contrainte_dossier($dossier) {
350     // Cette méthode doit être implémentée par tous les connecteurs
351     throw new geoads_connector_method_not_implemented_exception();
352     }
353    
354    
355     public function recup_toutes_contraintes($code_insee) {
356     // Cette méthode doit être implémentée par tous les connecteurs
357     throw new geoads_connector_method_not_implemented_exception();
358     }
359    
360    
361 softime 7996 public function redirection_web_emprise(array $parcelles, $dossier) {
362 mbroquet 3730 // Cette méthode doit être implémentée par tous les connecteurs
363     throw new geoads_connector_method_not_implemented_exception();
364     }
365    
366    
367 softime 7996 public function redirection_web(array $parcelles = null, $dossier = null) {
368 mbroquet 3730 // Cette méthode doit être implémentée par tous les connecteurs
369     throw new geoads_connector_method_not_implemented_exception();
370     }
371    
372    
373     /**
374     * Défini l'attribut contenant le tableau de configuration du SIG.
375     *
376     * @param array $conf Tableau de config.
377     */
378     public function set_sig_config(array $conf) {
379     $this->sig_parameters = $conf;
380     }
381    
382     /**
383     * Défini les paramètres de la collectivite
384     *
385     * @param array $conf Tableau de config de la collectivité.
386     */
387     public function set_collectivite_parameters(array $collectivite) {
388 softime 11228 $this->collectivite_parameters["departement"] = strtoupper($collectivite["departement"]);
389 softime 5024 // Ce om_parametre peut ne pas être défini selon la configuration
390     if (isset($collectivite["code_direction"]) === true) {
391     $this->collectivite_parameters["code_direction"] = $collectivite["code_direction"];
392     }
393 mbroquet 3730 $this->collectivite_parameters["commune"] = $collectivite["commune"];
394 softime 10573 $this->collectivite_parameters["insee"] = $collectivite["insee"];
395     $this->collectivite_parameters["om_collectivite_idx"] = $collectivite["om_collectivite_idx"];
396 mbroquet 3730 }
397    
398    
399     /**
400     * Permet de récupérer un élement de configuration.
401     *
402     * @param string $key Nom de la clé de l'élément.
403     *
404     * @return string Valeur de la config.
405     */
406     public function get_sig_config($key) {
407     if(isset($this->sig_parameters[$key]) === false) {
408 softime 9245 throw new geoads_configuration_exception("Élément de configuration '$key' non trouvé");
409 mbroquet 3730
410     }
411     return $this->sig_parameters[$key];
412     }
413    
414    
415     /**
416     * Permet de récupérer un élement de paramétrage de la collectivité.
417     *
418     * @param string $key Nom de la clé de l'élément.
419     *
420     * @return string Valeur de la config.
421     */
422     public function get_collectivite_parameter($key) {
423     if(isset($this->collectivite_parameters[$key]) === false) {
424 softime 9245 throw new geoads_configuration_exception("Élément de paramétrage '$key' non trouvé");
425 mbroquet 3730
426     }
427     return $this->collectivite_parameters[$key];
428     }
429    
430 softime 10573 /**
431     * Permet de lancer une requête sql dans la base de données de l'application.
432     * La requête sql doit être un SELECT.
433     *
434     * @param string $query_sql Requête sql à exécuter.
435     *
436     * @return array|boolean Résultat de la requête sql ou false.
437     */
438     protected function query_db($query_sql, $force_return = true) {
439     if (isset($this->extra_params['inst_framework']) === false) {
440     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."));
441     }
442     $inst_framework = $this->extra_params['inst_framework'];
443     if (stripos($query_sql, 'SELECT') === false) {
444     throw new geoads_exception('Seules les requêtes SQL SELECT sont autorisées.');
445     }
446     return $inst_framework->get_all_results_from_db_query($query_sql, $force_return);
447     }
448 mbroquet 3730
449    
450     }
451    
452     /**
453     * Classe gérant les erreurs (une exception est levée pour chacune).
454     */
455     class geoads_exception extends Exception {
456    
457    
458     /**
459     * Construit l'exception
460     *
461     * @param string $message Le message de l'exception à lancer.
462     * @param integer $code Le code de l'exception.
463     * @param Exception $previous L'exception précédente, utilisée pour le chaînage d'exception.
464     */
465     public function __construct($message = "" , $code = 0, Exception $previous = null) {
466     parent::__construct($message, $code, $previous);
467     logger::instance()->writeErrorLogToFile();
468     }
469    
470    
471     /**
472     * Cette fonction ajoute dans le fichier de log.
473     *
474     * @param string $code Le nom de fichier, ou l'identifiant du fichier.
475     * @param string $msg Le message a logger.
476     */
477     protected function addToLog($code, $msg) {
478 softime 7996 require_once PATH_OPENMAIRIE."om_logger.class.php";
479 mbroquet 3730 logger::instance()->log("SIG Connector - Error code : ".$code." -> ".$msg);
480     }
481    
482    
483     }
484    
485     class geoads_bdd_exception extends geoads_exception {
486    
487    
488     /**
489     * Redéfinition du message d'erreur.
490     */
491     public function __construct() {
492     $message = _("Erreur de base de donnees. Contactez votre administrateur.");
493     // Appel du parent
494     parent::__construct($message);
495     }
496    
497    
498     }
499    
500     class geoads_configuration_exception extends geoads_exception {
501    
502    
503     /**
504     * Redéfinition du message d'erreur.
505     */
506 softime 9245 public function __construct($msg = null) {
507     $message = _("Erreur de configuration SIG.")." "._("Veuillez contacter votre administrateur.").(!empty($msg) ? " Details: $msg" : '');
508 mbroquet 3730 // Appel du parent
509     parent::__construct($message);
510     }
511    
512    
513     }
514    
515     class geoads_parameter_exception extends geoads_exception {
516    
517    
518     /**
519     * Redéfinition du message d'erreur.
520     */
521     public function __construct($message = null) {
522     if($message == null) {
523     $message = _("Parametres d'appel au SIG non valides.")." "._("Veuillez contacter votre administrateur.");
524     }
525     // Appel du parent
526     parent::__construct($message);
527     }
528    
529    
530     }
531    
532    
533     /**
534     * Classe de gestion des exceptions sur les methodes non implémentées
535     */
536     class geoads_connector_method_not_implemented_exception extends geoads_exception {
537    
538    
539     /**
540     * Redéfinition du message d'erreur.
541     */
542     public function __construct() {
543     $message = _("Erreur lors de la connexion au SIG.")." "._("Veuillez contacter votre administrateur");
544     // Appel du parent
545     parent::__construct($message);
546     }
547    
548    
549     }
550    
551     /**
552     * Classe de gestion des exceptions retournée lors d'un code 4XX
553     */
554     class geoads_connector_4XX_exception extends geoads_exception {
555    
556    
557     /**
558     * Redéfinition du message d'erreur.
559     *
560     * @param string $message Message d'erreur http.
561     * @param integer $code Code de l'erreur http.
562     */
563     public function __construct($message, $code = null) {
564     // Log de l'erreur technique
565     $this->addToLog($code, $message);
566     // Création du log utilisateur
567     $message = _("Erreur lors de la connexion au SIG.")." "._("Veuillez contacter votre administrateur");
568     // Appel du parent
569     parent::__construct($message);
570     }
571    
572    
573     }
574    
575     /**
576     * Classe de gestion des exceptions retournée lors d'un code 5XX
577     */
578     class geoads_connector_5XX_exception extends geoads_exception {
579    
580    
581     /**
582     * Log et redéfinition du message d'erreur.
583     *
584     * @param string $message Message d'erreur technique.
585     * @param integer $code Code de l'erreur http.
586     */
587     public function __construct($message, $code = null) {
588     // Log de l'erreur technique
589     $this->addToLog($code, $message);
590     // Création du log utilisateur
591     $message = _("Erreur de traitement du SIG.")." "._("Veuillez contacter le service responsable du SIG");
592     // Appel du parent
593     parent::__construct($message);
594     }
595    
596    
597     }
598    
599     /**
600     * Classe de gestion des exceptions génériques remontées par le générateur
601     */
602     class geoads_connector_exception extends geoads_exception {
603    
604    
605     /**
606     * Log et redéfinition du message d'erreur.
607     *
608     * @param string $message Message d'erreur technique.
609     * @param integer $code Code de l'erreur http.
610     */
611     public function __construct($message = null, $code = null) {
612     // Log de l'erreur technique
613     $this->addToLog($code, $message);
614     // Création du log utilisateur
615     $message = _("Erreur SIG.")." "._("Veuillez contacter votre administrateur");
616     // Appel du parent
617     parent::__construct($message);
618     }
619    
620    
621     }
622    
623    
624 softime 7996

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26