source: spip-zone/_plugins_/gis/trunk/gis_pipelines.php @ 53652

Last change on this file since 53652 was 53652, checked in by rastapopoulos@…, 9 years ago

1) Bug de GIS : on pouvait pas appeler l'action d'édition directement, car pas de paramètre.

2) Pour afficher vraiment le bloc au milieu, on copie sur les Mots.

  • Property svn:executable set to *
File size: 12.7 KB
Line 
1<?php
2
3function gis_saisies_autonomes($flux){
4        $flux[] = 'carte';
5        return $flux;
6}
7
8function gis_inserer_javascript($flux){
9       
10        // initialisation des valeurs de config
11        $config = @unserialize($GLOBALS['meta']['gis']);
12        if (!is_array($config))
13                $config = array();
14        $config = array_merge(array(
15                'api' => 'openlayers'
16        ), $config);
17       
18        include_spip('gis_fonctions');
19        $config['api'] = gis_api_utilisee();
20        if(defined('_GIS_APIS') && !array_key_exists($config['api'],unserialize(_GIS_APIS))){
21                return $flux;
22        }
23       
24        // insertion du script de l'api a utiliser
25        if ($config['api'] == 'cloudmade')
26                $flux .="\n".'<script type="text/javascript" src="http://tile.cloudmade.com/wml/latest/web-maps-lite.js"></script>'."\n";
27        if ($config['api'] == 'google')
28                $flux .="\n".'<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=false&amp;key='.$config['api_key_google'].'&hl='.$GLOBALS['spip_lang'].'"></script>'."\n";
29        if ($config['api'] == 'googlev3')
30                $flux .="\n".'<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&amp;language='.$GLOBALS['spip_lang'].'"></script>'."\n";
31        if ($config['api'] == 'microsoft')
32                $flux .="\n".'<script type="text/javascript" src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6"></script>'."\n";
33        if ($config['api'] == 'openlayers')
34                $flux .="\n".'<script type="text/javascript" src="http://openlayers.org/api/OpenLayers.js"></script>'."\n";
35        if ($config['api'] == 'ovi')
36                $flux .="\n".'<script type="text/javascript" src="http://api.maps.ovi.com/jsl.js"></script>'."\n";
37        if ($config['api'] == 'yandex')
38                $flux .="\n".'<script type="text/javascript" src="http://api-maps.yandex.ru/1.1/index.xml?key='.$config['api_key_yandex'].'"></script>'."\n";
39               
40        // insertion de la lib mapstraction
41        if(in_array($config['api'],array('cartociudad','google','googlev3','yandex'))){
42                $geocoder = ($config['geocoder']) ? ',[geocoder]' : '';
43        }else{
44                $geocoder = '';
45        }
46        $flux .="\n".'<script id="mxn_script" type="text/javascript" src="'. url_absolue(find_in_path(_DIR_LIB_GIS.'mxn.js')) .'?('. $config['api'] . $geocoder .')"></script>'."\n";
47       
48        // insertion des scripts de gis
49        $flux .="\n".'<script type="text/javascript" src="'. url_absolue(find_in_path('javascript/gis.js')) .'"></script>'."\n";
50
51        return $flux;
52}
53
54function gis_affiche_milieu($flux){
55        if ($exec = $flux['args']['exec']){
56                switch ($exec){
57                        case 'article':
58                                $objet = 'article';
59                                $id_objet = $flux['args']['id_article'];
60                                break;
61                        case 'auteur':
62                                $objet = 'auteur';
63                                $id_objet = $flux['args']['id_auteur'];
64                                break;
65                        case 'breve':
66                                $objet = 'breve';
67                                $id_objet = $flux['args']['id_breve'];
68                                break;
69                        case 'rubrique':
70                                $objet = 'rubrique';
71                                $id_objet = $flux['args']['id_rubrique'];
72                                break;
73                        case 'mot':
74                                $objet = 'mot';
75                                $id_objet = $flux['args']['id_mot'];
76                                break;
77                        case 'site':
78                                $objet = 'syndic';
79                                $id_objet = $flux['args']['id_syndic'];
80                                break;
81                        case 'document':
82                                $objet = 'document';
83                                $id_objet = $flux['args']['id_document'];
84                                break;
85                        default:
86                                // Par défaut on regarde si on est sur la page d'un vrai objet SPIP
87                                include_spip('base/objets.php');
88                                $objets = lister_tables_objets_sql();
89                                foreach ($objets as $table=>$infos){
90                                        // Si cet exec fait partie d'une URL pour voir un objet déclaré
91                                        if ($exec == $infos['url_voir']){
92                                                $objet = $infos['type'];
93                                                $id_objet = $flux['args'][id_table_objet($objet)];
94                                                break; // On a trouvé on s'arrête
95                                        }
96                                }
97                                break;
98                }
99                if ($objet && $id_objet) {
100                        // TODO : seulement si la conf permet de geolocaliser cet objet
101                        if (1) {
102                                include_spip('inc/layer');
103                                include_spip('inc/presentation');
104                                $contexte['objet'] = $objet;
105                                $contexte['id_objet'] = $id_objet;
106                                $texte = "<div id='pave_gis'>";
107                                $bouton = bouton_block_depliable(_T('gis:cfg_titre_gis'), false, "pave_gis_depliable");
108                                $texte .= debut_cadre_enfonce(find_in_path('images/gis-24.png'), true, "", $bouton);
109                                $texte .= recuperer_fond('prive/contenu/gis_objet', $contexte);
110                                $texte .= fin_cadre_enfonce(true);
111                                $texte .= "</div>";
112                               
113                                if ($p=strpos($flux['data'],"<!--affiche_milieu-->"))
114                                        $flux['data'] = substr_replace($flux['data'],$texte,$p,0);
115                                else
116                                        $flux['data'] .= $texte;
117                        }
118                }
119        }
120
121        return $flux;
122}
123
124function gis_post_edition($flux){
125       
126        if (($flux['args']['operation'] == 'ajouter_document') 
127                AND ($document = sql_fetsel("*","spip_documents","id_document=".intval($flux['args']['id_objet'])))
128        ) {
129                if(in_array($document['extension'],array('jpg','kml','kmz'))){
130                        $config = @unserialize($GLOBALS['meta']['gis']);
131                        if(!is_array($config))
132                                $config = array();
133                        include_spip('inc/documents');
134                        $fichier = get_spip_doc($document['fichier']);
135                        $id_document = $document['id_document'];
136                }
137                if ($document['extension'] == 'jpg') {
138                        // on recupere les coords definies dans les exif du document s'il y en a
139                        if ($exifs =  @exif_read_data($fichier,'GPS')) {
140                                if(!function_exists('dms_to_dec'))
141                                        include_spip('gis_fonctions');
142                                spip_log("GIS EXIFS : Récuperation des coordonnees du fichier $fichier","gis");
143                               
144                                $LatDeg = explode("/",$exifs["GPSLatitude"][0]);
145                                if(is_numeric($LatDeg[1]) > 0)
146                                        $intLatDeg = $LatDeg[0]/$LatDeg[1];
147
148                                $LatMin = explode("/",$exifs["GPSLatitude"][1]);
149                                if(is_numeric($LatMin[1]) > 0)
150                                        $intLatMin = $LatMin[0]/$LatMin[1];
151
152                                $LatSec = explode("/",$exifs["GPSLatitude"][2]);
153                                if(is_numeric($LatSec[1]) > 0)
154                                        $intLatSec = $LatSec[0]/$LatSec[1];
155
156                                $LongDeg = explode("/",$exifs["GPSLongitude"][0]);
157                                if(is_numeric($LongDeg[1]) > 0)
158                                        $intLongDeg = $LongDeg[0]/$LongDeg[1];
159
160                                $LongMin = explode("/",$exifs["GPSLongitude"][1]);
161                                if(is_numeric($LongMin[1]) > 0)
162                                        $intLongMin = $LongMin[0]/$LongMin[1];
163
164                                $LongSec = explode("/",$exifs["GPSLongitude"][2]);
165                                if(is_numeric($LongSec[1]) > 0)
166                                        $intLongSec = $LongSec[0]/$LongSec[1];
167
168                                // round to 5 = approximately 1 meter accuracy
169                                if(is_numeric($intLatDeg) && is_numeric($intLatMin) && is_numeric($intLatSec))
170                                        $latitude = round(dms_to_dec($exifs["GPSLatitudeRef"],
171                                                $intLatDeg,$intLatMin,$intLatSec),5);
172
173                                if(is_numeric($intLongDeg) && is_numeric($intLongMin) && is_numeric($intLongSec))
174                                        $longitude =  round(dms_to_dec($exifs["GPSLongitudeRef"],
175                                                $intLongDeg,$intLongMin,$intLongSec), 5);
176                                if($config['geocoder'] == 'on'){
177                                        include_spip('inc/xml');
178                                        $url_geocoder = 'http://maps.googleapis.com/maps/api/geocode/xml?latlng='.urlencode($latitude).','.urlencode($longitude).'&sensor=true';
179                                        $geocoder = spip_xml_load($url_geocoder);
180                                        spip_xml_match_nodes(',result,',$geocoder,$matches_adress);
181                                        if(is_array($matches_adress['result'])){
182                                                foreach($matches_adress['result'] as $component){
183                                                        if(in_array('country',$component['type'])){
184                                                                $pays = $component['address_component'][0]['long_name'][0];
185                                                                $code_pays = $component['address_component'][0]['short_name'][0];
186                                                        }
187                                                        if(in_array('administrative_area_level_1',$component['type'])){
188                                                                $region = $component['address_component'][0]['long_name'][0];
189                                                        }
190                                                        if(in_array('locality',$component['type'])){
191                                                                $ville = $component['address_component'][0]['long_name'][0];
192                                                        }
193                                                        if(in_array('postal_code',$component['type'])){
194                                                                $code_postal = $component['address_component'][0]['long_name'][0];
195                                                        }
196                                                        if(in_array('route',$component['type'])){
197                                                                $adresse = $component['address_component'][0]['long_name'][0];
198                                                        }
199                                                }
200                                        }
201                                }
202                        }else if(file_exists($fichier)){
203                                include_spip("inc/iptc");
204
205                                $er = new class_IPTC($fichier);
206                                $iptc = $er->fct_lireIPTC();
207                                $codesiptc = $er->h_codesIptc;
208                                $string_recherche = '';
209                               
210                                if($iptc['city']){
211                                        $string_recherche .= $iptc['city'].', ';
212                                }
213                                if($iptc['provinceState']){
214                                        $string_recherche .= $iptc['provinceState'].', ';
215                                }
216                                if($iptc['country']){
217                                        $string_recherche .= $iptc['country'];
218                                }
219                                if(strlen($string_recherche)){
220                                        include_spip('inc/xml');
221                                        $url_geocoder = 'http://maps.googleapis.com/maps/api/geocode/xml?address='.urlencode($string_recherche).'&sensor=true';
222                                        $geocoder = spip_xml_load($url_geocoder);
223                                        if(is_array($geocoder)){
224                                                spip_xml_match_nodes(',location,',$geocoder,$matches);
225                                                $latitude = $matches['location']['0']['lat']['0'];
226                                                $longitude = $matches['location']['0']['lng']['0'];
227                                                if($config['adresse'] == 'on'){
228                                                        spip_xml_match_nodes(',address_component,',$geocoder,$matches_adress);
229                                                        if(is_array($matches_adress['address_component'])){
230                                                                foreach($matches_adress['address_component'] as $component){
231                                                                        if(in_array('country',$component['type'])){
232                                                                                $pays = $component['long_name'][0];
233                                                                                $code_pays = $component['short_name'][0];
234                                                                        }
235                                                                        if(in_array('administrative_area_level_1',$component['type'])){
236                                                                                $region = $component['long_name'][0];
237                                                                        }
238                                                                        if(in_array('locality',$component['type'])){
239                                                                                $ville = $component['long_name'][0];
240                                                                        }
241                                                                }
242                                                        }
243                                                }
244                                        }
245                                }
246                        }
247                        if(is_numeric($latitude) && is_numeric($longitude)){
248                                $c = array(
249                                        'titre' => basename($fichier),
250                                        'lat'=> $latitude,
251                                        'lon' => $longitude,
252                                        'zoom' => $config['zoom'] ? $config['zoom'] :'4',
253                                        'adresse' => $adresse,
254                                        'code_postal' => $code_postal,
255                                        'ville' => $ville,
256                                        'region' => $region,
257                                        'pays' => $pays,
258                                        'code_pays' => $code_pays
259                                );
260               
261                                include_spip('action/editer_gis');
262       
263                                if($id_gis = sql_getfetsel("G.id_gis","spip_gis AS G LEFT  JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis ","T.id_objet=" . intval($id_document) . " AND T.objet='document'")){
264                                        // Des coordonnées sont déjà définies pour ce document => on les update
265                                        revisions_gis($id_gis,$c);
266                                        spip_log("GIS EXIFS : Update des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis");
267                                }
268                                else{
269                                        // Aucune coordonnée n'est définie pour ce document  => on les crées
270                                        $id_gis = insert_gis();
271                                        revisions_gis($id_gis,$c);
272                                        lier_gis($id_gis, 'document', $id_document);
273                                        spip_log("GIS EXIFS : Création des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis");
274                                }
275                        }
276                }elseif(in_array($document['extension'],array('kml','kmz'))){
277                        $recuperer_info = charger_fonction('kml_infos','inc');
278                        $infos = $recuperer_info($document['id_document']);
279                        if($infos){
280                                if(is_numeric($latitude = $infos['latitude']) && is_numeric($longitude = $infos['longitude'])){
281                                        $c = array(
282                                                'titre' => $infos['titre'] ? $infos['titre'] : basename($fichier),
283                                                'descriptif' => $infos['descriptif'],
284                                                'lat'=> $latitude,
285                                                'lon' => $longitude,
286                                                'zoom' => $config['zoom'] ? $config['zoom'] :'4'
287                                        );
288                       
289                                        include_spip('action/editer_gis');
290               
291                                        if($id_gis = sql_getfetsel("G.id_gis","spip_gis AS G LEFT  JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis ","T.id_objet=" . intval($id_document) . " AND T.objet='document'")){
292                                                // Des coordonnées sont déjà définies pour ce document => on les update
293                                                revisions_gis($id_gis,$c);
294                                                spip_log("GIS EXIFS : Update des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis");
295                                        }
296                                        else{
297                                                // Aucune coordonnée n'est définie pour ce document  => on les crées
298                                                $id_gis = insert_gis();
299                                                revisions_gis($id_gis,$c);
300                                                lier_gis($id_gis, 'document', $id_document);
301                                                spip_log("GIS EXIFS : Création des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis");
302                                        }
303                                }
304                                unset($infos['longitude']);
305                                unset($infos['latitude']);
306                                if(count($infos) > 0){
307                                        include_spip('inc/modifier');
308                                        revision_document($id_document, $infos);
309                                }
310                        }
311                }
312        }
313        if (($flux['args']['operation'] == 'supprimer_document') 
314                AND ($id_document = intval($flux['args']['id_objet'])
315                AND ($id_gis = sql_getfetsel("G.id_gis","spip_gis AS G LEFT  JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis ","T.id_objet=" . intval($id_document) . " AND T.objet='document'")))
316        ) {
317                include_spip('action/editer_gis');
318                supprimer_gis($id_gis);
319                spip_log("GIS EXIFS : Suppression des coordonnées pour le document $id_document => id_gis = $id_gis","gis");
320        }
321       
322        return $flux;
323}
324
325// permettre la recherche dans une boucle gis
326function gis_rechercher_liste_des_champs($tables){
327        $tables['gis'] = array(
328                'titre' => 8,
329                'descriptif' => 5,
330                'pays' => 3,
331                'region' => 3,
332                'ville' => 3,
333                'code_postal' => 3
334        );
335        return $tables;
336}
337
338function gis_declarer_type_surnoms($surnoms){
339        $surnoms['gi'] = 'gis';
340        return $surnoms;
341}
342
343function gis_declarer_tables_objets_surnoms($surnoms){
344        $surnoms['gis'] = 'gis';
345        return $surnoms;
346}
347
348function gis_taches_generales_cron($taches_generales){
349        $taches_generales['gis_nettoyer_base'] = 3600*48;
350        return $taches_generales;
351}
352
353?>
Note: See TracBrowser for help on using the repository browser.