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

Last change on this file since 48696 was 48696, checked in by brunobergot@…, 10 years ago

et hop, voilà GIS 2 (qui comme l'indique son état est encore en dev)

  • Property svn:executable set to *
File size: 9.6 KB
Line 
1<?php
2
3function gis_inserer_javascript($flux){
4       
5        // initialisation des valeurs de config
6        $config = @unserialize($GLOBALS['meta']['gis']);
7        if (!is_array($config))
8                $config = array();
9        $config = array_merge(array(
10                'api' => 'openlayers'
11        ), $config);
12       
13        if(defined('_GIS_APIS') && !array_key_exists($config['api'],unserialize(_GIS_APIS))){
14                return $flux;
15        }
16        // insertion du script de l'api a utiliser
17        if ($config['api'] == 'cloudmade')
18                $flux .="\n".'<script type="application/javascript" src="http://tile.cloudmade.com/wml/latest/web-maps-lite.js"></script>'."\n";
19        if ($config['api'] == 'google')
20                $flux .="\n".'    <script 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";
21        if ($config['api'] == 'googlev3')
22                $flux .="\n".'<script type="application/javascript" src="http://maps.google.com/maps/api/js?sensor=false&amp;language='.$GLOBALS['spip_lang'].'"></script>'."\n";
23        if ($config['api'] == 'microsoft')
24                $flux .="\n".'<script src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6"></script>'."\n";
25        if ($config['api'] == 'openlayers')
26                $flux .="\n".'<script src="http://openlayers.org/api/OpenLayers.js"></script>'."\n";
27        if ($config['api'] == 'yahoo')
28                $flux .="\n".'<script type="application/javascript" src="http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=MapstractionDemo"></script>'."\n";
29       
30        // insertion de la lib mapstraction
31        if(in_array($config['api'],array('cartociudad','google','googlev3','yandex'))){
32                $geocoder = ($config['geocoder']) ? ',[geocoder]' : '';
33        }else{
34                $geocoder = '';
35        }
36        $flux .="\n".'<script type="application/javascript" src="'. url_absolue(find_in_path(_DIR_LIB_GIS.'mxn.js')) .'?('. $config['api'] . $geocoder .')"></script>'."\n";
37       
38        // insertion des scripts de gis
39        $flux .="\n".'<script type="application/javascript" src="'. url_absolue(find_in_path('javascript/gis.js')) .'"></script>'."\n";
40
41        return $flux;
42}
43
44function gis_affiche_milieu($flux){
45        if ($exec = $flux['args']['exec']){
46                switch ($exec){
47                        case 'articles':
48                                $objet = 'article';
49                                $id_objet = $flux['args']['id_article'];
50                                break;
51                        case 'auteur_infos':
52                                $objet = 'auteur';
53                                $id_objet = $flux['args']['id_auteur'];
54                                break;
55                        case 'breves_voir':
56                                $objet = 'breve';
57                                $id_objet = $flux['args']['id_breve'];
58                                break;
59                        case 'naviguer':
60                                $objet = 'rubrique';
61                                $id_objet = $flux['args']['id_rubrique'];
62                                break;
63                        case 'mots_edit':
64                                $objet = 'mot';
65                                $id_objet = $flux['args']['id_mot'];
66                                break;
67                        case 'sites':
68                                $objet = 'syndic';
69                                $id_objet = $flux['args']['id_syndic'];
70                                break;
71                        case 'documents_edit':
72                                $objet = 'document';
73                                $id_objet = $flux['args']['id_document'];
74                                break;
75                        default:
76                                $objet = $id_objet = '';
77                                break;
78                }
79                if ($objet && $id_objet) {
80                        // TODO : seulement si la conf permet de geolocaliser cet objet
81                        if (1) {
82                                $contexte['objet'] = $objet;
83                                $contexte['id_objet'] = $id_objet;
84                                $flux['data'] .= "<div id='pave_gis'>";
85                                $bouton = bouton_block_depliable(_T('gis:cfg_titre_gis'), false, "pave_gis_depliable");
86                                $flux['data'] .= debut_cadre_enfonce(find_in_path('images/gis-24.png'), true, "", $bouton);
87                                $flux['data'] .= recuperer_fond('prive/contenu/gis_objet', $contexte);
88                                $flux['data'] .= fin_cadre_enfonce(true);
89                                $flux['data'] .= "</div>";
90                        }
91                }
92        }
93
94        return $flux;
95}
96
97function gis_post_edition($flux){
98       
99        if (($flux['args']['operation'] == 'ajouter_document') 
100                AND ($document = sql_fetsel("*","spip_documents","id_document=".intval($flux['args']['id_objet'])))
101        ) {
102                if ($document['extension'] == 'jpg') {
103                        $config = @unserialize($GLOBALS['meta']['gis']);
104                        if(!is_array($config))
105                                $config = array();
106                        include_spip('inc/documents');
107                        $fichier = get_spip_doc($document['fichier']);
108                        $id_document = $document['id_document'];
109                        // on recupere les coords definies dans les exif du document s'il y en a
110                        if ($exifs =  @exif_read_data($fichier,'GPS')) {
111                                spip_log("GIS EXIFS : Récuperation des coordonnees du fichier $fichier","gis");
112                               
113                                $LatDeg = explode("/",$exifs["GPSLatitude"][0]);
114                                $intLatDeg = $LatDeg[0]/$LatDeg[1];
115
116                                $LatMin = explode("/",$exifs["GPSLatitude"][1]);
117                                $intLatMin = $LatMin[0]/$LatMin[1];
118
119                                $LatSec = explode("/",$exifs["GPSLatitude"][2]);
120                                $intLatSec = $LatSec[0]/$LatSec[1];
121
122                                $LongDeg = explode("/",$exifs["GPSLongitude"][0]);
123                                $intLongDeg = $LongDeg[0]/$LongDeg[1];
124
125                                $LongMin = explode("/",$exifs["GPSLongitude"][1]);
126                                $intLongMin = $LongMin[0]/$LongMin[1];
127
128                                $LongSec = explode("/",$exifs["GPSLongitude"][2]);
129                                $intLongSec = $LongSec[0]/$LongSec[1];
130
131                                // round to 5 = approximately 1 meter accuracy
132                                $latitude = round(dms_to_dec($exifs["GPSLatitudeRef"],
133                                $intLatDeg,$intLatMin,$intLatSec),5);
134
135                                $longitude =  round(dms_to_dec($exifs["GPSLongitudeRef"],
136                                $intLongDeg,$intLongMin,$intLongSec), 5);
137                                if($config['adresse'] == 'on'){
138                                        include_spip('inc/xml');
139                                        $url_geocoder = 'http://maps.googleapis.com/maps/api/geocode/xml?latlng='.urlencode($latitude).','.urlencode($longitude).'&sensor=true';
140                                        $geocoder = spip_xml_load($url_geocoder);
141                                        spip_xml_match_nodes(',result,',$geocoder,$matches_adress);
142                                        if(is_array($matches_adress['result'])){
143                                                foreach($matches_adress['result'] as $component){
144                                                        if(in_array('country',$component['type'])){
145                                                                $pays = $component['address_component'][0]['long_name'][0];
146                                                                $code_pays = $component['address_component'][0]['short_name'][0];
147                                                        }
148                                                        if(in_array('administrative_area_level_1',$component['type'])){
149                                                                $region = $component['address_component'][0]['long_name'][0];
150                                                        }
151                                                        if(in_array('locality',$component['type'])){
152                                                                $ville = $component['address_component'][0]['long_name'][0];
153                                                        }
154                                                        if(in_array('postal_code',$component['type'])){
155                                                                $code_postal = $component['address_component'][0]['long_name'][0];
156                                                        }
157                                                        if(in_array('route',$component['type'])){
158                                                                $adresse = $component['address_component'][0]['long_name'][0];
159                                                        }
160                                                }
161                                        }
162                                }
163                        }else if(file_exists($fichier)){
164                                include_spip("inc/iptc");
165
166                                $er = new class_IPTC($fichier);
167                                $iptc = $er->fct_lireIPTC();
168                                $codesiptc = $er->h_codesIptc;
169                                $string_recherche = '';
170                               
171                                if($iptc['city']){
172                                        $string_recherche .= $iptc['city'].', ';
173                                }
174                                if($iptc['provinceState']){
175                                        $string_recherche .= $iptc['provinceState'].', ';
176                                }
177                                if($iptc['country']){
178                                        $string_recherche .= $iptc['country'];
179                                }
180                                if(strlen($string_recherche)){
181                                        include_spip('inc/xml');
182                                        $url_geocoder = 'http://maps.googleapis.com/maps/api/geocode/xml?address='.urlencode($string_recherche).'&sensor=true';
183                                        $geocoder = spip_xml_load($url_geocoder);
184                                        if(is_array($geocoder)){
185                                                spip_xml_match_nodes(',location,',$geocoder,$matches);
186                                                $latitude = $matches['location']['0']['lat']['0'];
187                                                $longitude = $matches['location']['0']['lng']['0'];
188                                                if($config['adresse'] == 'on'){
189                                                        spip_xml_match_nodes(',address_component,',$geocoder,$matches_adress);
190                                                        if(is_array($matches_adress['address_component'])){
191                                                                foreach($matches_adress['address_component'] as $component){
192                                                                        if(in_array('country',$component['type'])){
193                                                                                $pays = $component['long_name'][0];
194                                                                                $code_pays = $component['short_name'][0];
195                                                                        }
196                                                                        if(in_array('administrative_area_level_1',$component['type'])){
197                                                                                $region = $component['long_name'][0];
198                                                                        }
199                                                                        if(in_array('locality',$component['type'])){
200                                                                                $ville = $component['long_name'][0];
201                                                                        }
202                                                                }
203                                                        }
204                                                }
205                                        }
206                                }
207                        }
208                        if(is_numeric($latitude) && is_numeric($longitude)){
209                                $c = array(
210                                        'titre' => basename($fichier),
211                                        'lat'=> $latitude,
212                                        'lon' => $longitude,
213                                        'zoom' => $config['zoom'] ? $config['zoom'] :'4',
214                                        'adresse' => $adresse,
215                                        'code_postal' => $code_postal,
216                                        'ville' => $ville,
217                                        'region' => $region,
218                                        'pays' => $pays,
219                                        'code_pays' => $code_pays
220                                );
221               
222                                include_spip('action/editer_gis');
223       
224                                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'")){
225                                        // Des coordonnées sont déjà définies pour ce document => on les update
226                                        revisions_gis($id_gis,$c);
227                                        spip_log("GIS EXIFS : Update des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis");
228                                }
229                                else{
230                                        // Aucune coordonnée n'est définie pour ce document  => on les crées
231                                        $id_gis = insert_gis();
232                                        revisions_gis($id_gis,$c);
233                                        lier_gis($id_gis, 'document', $id_document);
234                                        spip_log("GIS EXIFS : Création des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis");
235                                }
236                        }
237                }
238        }
239        if (($flux['args']['operation'] == 'supprimer_document') 
240                AND ($id_document = intval($flux['args']['id_objet'])
241                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'")))
242        ) {
243                include_spip('action/editer_gis');
244                supprimer_gis($id_gis);
245                spip_log("GIS EXIFS : Suppression des coordonnées pour le document $id_document => id_gis = $id_gis","gis");
246        }
247       
248        return $flux;
249}
250
251// permettre la recherche dans une boucle gis
252function gis_rechercher_liste_des_champs($tables){
253        $tables['gis'] = array(
254                'titre' => 8,
255                'descriptif' => 5,
256                'pays' => 3,
257                'region' => 3,
258                'ville' => 3,
259                'code_postal' => 3
260        );
261        return $tables;
262}
263
264function gis_taches_generales_cron($taches_generales){
265        $taches_generales['gis_nettoyer_base'] = 3600*48;
266        return $taches_generales;
267}
268
269?>
Note: See TracBrowser for help on using the repository browser.