[PLUGINS] ~gis v4.41.1 --> v4.43.1
[lhc/web/www.git] / www / plugins / gis / gis_pipelines.php
1 <?php
2
3 if (!defined('_ECRIRE_INC_VERSION')) {
4 return;
5 }
6
7 /**
8 * Insertion des css du plugin dans les pages publiques
9 *
10 * @param $flux
11 * @return mixed
12 */
13 function gis_insert_head_css($flux) {
14 $flux .="\n".'<link rel="stylesheet" href="'. direction_css(sinon(find_in_path('css/leaflet.css'), find_in_path('lib/leaflet/dist/leaflet.css'))) .'" />';
15 $flux .="\n".'<link rel="stylesheet" href="'. direction_css(sinon(find_in_path('css/leaflet-plugins.css'), find_in_path('lib/leaflet/plugins/leaflet-plugins.css'))) .'" />';
16 $flux .="\n".'<link rel="stylesheet" href="'. direction_css(sinon(find_in_path('css/leaflet.markercluster.css'), find_in_path('lib/leaflet/plugins/leaflet.markercluster.css'))) .'" />';
17 $flux .="\n".'<link rel="stylesheet" href="'. sinon(find_in_path('css/leaflet_nodirection.css'), find_in_path('lib/leaflet/dist/leaflet_nodirection.css')) .'" />';
18 return $flux;
19 }
20
21 /**
22 * Insertion des scripts du plugin dans les pages publiques
23 *
24 * @param $flux
25 * @return mixed
26 */
27 function gis_insert_head($flux) {
28
29 // initialisation des valeurs de config
30 $config = @unserialize($GLOBALS['meta']['gis']);
31 if (!isset($config['layers']) || !is_array($config['layers'])) {
32 $config['layers'] = array('openstreetmap_mapnik');
33 }
34
35 include_spip('gis_fonctions');
36 if (!in_array(gis_layer_defaut(), $config['layers'])) {
37 $config['layers'][] = gis_layer_defaut();
38 }
39
40 // insertion des scripts pour google si nécessaire
41 if (count(array_intersect(array('google_roadmap', 'google_satellite', 'google_terrain'), $config['layers'])) > 0) {
42 $flux .="\n".'<script type="text/javascript" src="//maps.google.com/maps/api/js?language='.$GLOBALS['spip_lang'].'&amp;key='.(isset($config['api_key_google']) ? $config['api_key_google'] : '').'"></script>';
43 }
44
45 return $flux;
46 }
47
48 /**
49 * Insertion des scripts et css du plugin dans les pages de l'espace privé
50 *
51 * @param $flux
52 * @return mixed
53 */
54 function gis_header_prive($flux) {
55 $flux .= gis_insert_head_css('');
56 $flux .= gis_insert_head('');
57 return $flux;
58 }
59
60 /**
61 * Insertion du bloc GIS dans les pages des objets de l'espace privé
62 *
63 * @param $flux
64 * @return mixed
65 */
66 function gis_afficher_contenu_objet($flux) {
67 if ($objet = $flux['args']['type']
68 and include_spip('inc/config')
69 and in_array(table_objet_sql($objet), lire_config('gis/gis_objets', array()))
70 and ($id = intval($flux['args']['id_objet']))
71 ) {
72 $texte = recuperer_fond(
73 'prive/contenu/gis_objet',
74 array(
75 'table_source'=>'gis',
76 'objet'=>$objet,
77 'id_objet'=>$id
78 )
79 );
80 $flux['data'] .= $texte;
81 }
82
83 return $flux;
84 }
85
86 /**
87 * Si la geolocalisation des documents est activée dans la config,
88 * création/suppression d'un point à partir des métadonnées du document ajouté (jpg, kml et kmz)
89 *
90 * @param $flux
91 * @return mixed
92 */
93 function gis_post_edition($flux) {
94 if (is_array($flux) && isset($flux['args']['operation']) && ($flux['args']['operation'] == 'ajouter_document')
95 and ($document = sql_fetsel('*', 'spip_documents', 'id_document=' . intval($flux['args']['id_objet'])))
96 and (in_array(table_objet_sql('document'), lire_config('gis/gis_objets', array())))
97 ) {
98 if (in_array($document['extension'], array('jpg', 'kml', 'kmz'))) {
99 $config = @unserialize($GLOBALS['meta']['gis']);
100 if (!is_array($config)) {
101 $config = array();
102 }
103 include_spip('inc/documents');
104 $fichier = get_spip_doc($document['fichier']);
105 $id_document = $document['id_document'];
106 }
107 if ($document['extension'] == 'jpg') {
108 // on recupere les coords definies dans les exif du document s'il y en a
109 if (function_exists('exif_read_data') and $exifs = @exif_read_data($fichier, 'GPS')) {
110 if (!function_exists('dms_to_dec')) {
111 include_spip('gis_fonctions');
112 }
113 spip_log("GIS EXIFS : Récuperation des coordonnees du fichier $fichier", 'gis');
114
115 $LatDeg = explode('/', $exifs['GPSLatitude'][0]);
116 $intLatDeg = $LatDeg[0] / ($LatDeg[1] ? $LatDeg[1] : 1);
117
118 $LatMin = explode('/', $exifs['GPSLatitude'][1]);
119 $intLatMin = $LatMin[0] / ($LatMin[1] ? $LatMin[1] : 1);
120
121 $LatSec = explode('/', $exifs['GPSLatitude'][2]);
122 $intLatSec = $LatSec[0] / ($LatSec[1] ? $LatSec[1] : 1);
123
124 $LongDeg = explode('/', $exifs['GPSLongitude'][0]);
125 $intLongDeg = $LongDeg[0] / ($LongDeg[1] ? $LongDeg[1] : 1);
126
127 $LongMin = explode('/', $exifs['GPSLongitude'][1]);
128 $intLongMin = $LongMin[0] / ($LongMin[1] ? $LongMin[1] : 1);
129
130 $LongSec = explode('/', $exifs['GPSLongitude'][2]);
131 $intLongSec = $LongSec[0] / ($LongSec[1] ? $LongSec[1] : 1);
132
133 // round to 5 = approximately 1 meter accuracy
134 if (is_numeric($intLatDeg) && is_numeric($intLatMin) && is_numeric($intLatSec)) {
135 $latitude = round(dms_to_dec($exifs['GPSLatitudeRef'], $intLatDeg, $intLatMin, $intLatSec), 5);
136 }
137
138 if (is_numeric($intLongDeg) && is_numeric($intLongMin) && is_numeric($intLongSec)) {
139 $longitude = round(dms_to_dec($exifs['GPSLongitudeRef'], $intLongDeg, $intLongMin, $intLongSec), 5);
140 }
141 if ($config['geocoder'] == 'on') {
142 include_spip('inc/distant');
143 $url_geocoder = 'http://nominatim.openstreetmap.org/reverse/?format=xml&addressdetails=1&accept-language='.urlencode($GLOBALS['meta']['langue_site']).'&lat='.urlencode($latitude).'&lon='.urlencode($longitude);
144 $json = recuperer_page($url_geocoder);
145 $geocoder = json_decode($json, true);
146 if (is_array($geocoder)) {
147 $pays = $geocoder['address']['country'];
148 $code_pays = $geocoder['address']['country_code'];
149 $region = $geocoder['address']['state'];
150 if ($geocoder['address']['city']) {
151 $ville = $geocoder['address']['city'];
152 } elseif ($geocoder['address']['town']) {
153 $ville = $geocoder['address']['town'];
154 } elseif ($geocoder['address']['village']) {
155 $ville = $geocoder['address']['village'];
156 }
157 $code_postal = $geocoder['address']['postcode'];
158 $adresse = $geocoder['address']['road'];
159 }
160 }
161 } elseif (file_exists($fichier)) {
162 include_spip('inc/iptc');
163
164 $er = new class_IPTC($fichier);
165 $iptc = $er->fct_lireIPTC();
166 $codesiptc = $er->h_codesIptc;
167 $string_recherche = '';
168
169 if ($iptc['city']) {
170 $string_recherche .= $iptc['city'].', ';
171 }
172 if ($iptc['provinceState']) {
173 $string_recherche .= $iptc['provinceState'].', ';
174 }
175 if ($iptc['country']) {
176 $string_recherche .= $iptc['country'];
177 }
178 if (strlen($string_recherche)) {
179 include_spip('inc/distant');
180 $url_geocoder = 'http://nominatim.openstreetmap.org/search/?format=json&addressdetails=1&limit=1&accept-language='.urlencode($GLOBALS['meta']['langue_site']).'&q='.urlencode($string_recherche);
181 $json = recuperer_page($url_geocoder);
182 $geocoder = json_decode($json, true);
183 if (is_array($geocoder[0])) {
184 $latitude = $geocoder[0]['lat'];
185 $longitude = $geocoder[0]['lon'];
186 if ($config['adresse'] == 'on') {
187 $pays = $geocoder[0]['address']['country'];
188 $code_pays = $geocoder[0]['address']['country_code'];
189 $region = $geocoder[0]['address']['state'];
190 if ($geocoder[0]['address']['city']) {
191 $ville = $geocoder[0]['address']['city'];
192 } elseif ($geocoder[0]['address']['town']) {
193 $ville = $geocoder[0]['address']['town'];
194 } elseif ($geocoder[0]['address']['village']) {
195 $ville = $geocoder[0]['address']['village'];
196 }
197 }
198 }
199 }
200 }
201 if (is_numeric($latitude) && is_numeric($longitude)) {
202 $c = array(
203 'titre' => basename($fichier),
204 'lat'=> $latitude,
205 'lon' => $longitude,
206 'zoom' => $config['zoom'] ? $config['zoom'] :'4',
207 'adresse' => $adresse,
208 'code_postal' => $code_postal,
209 'ville' => $ville,
210 'region' => $region,
211 'departement' => $departement,
212 'pays' => $pays,
213 'code_pays' => $code_pays
214 );
215
216 if (defined('_DIR_PLUGIN_GISGEOM')) {
217 $geojson = '{"type":"Point","coordinates":['.$longitude.','.$latitude.']}';
218 set_request('geojson', $geojson);
219 }
220
221 include_spip('action/editer_gis');
222
223 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'")) {
224 // Des coordonnées sont déjà définies pour ce document => on les update
225 revisions_gis($id_gis, $c);
226 spip_log("GIS EXIFS : Update des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis", 'gis');
227 } else {
228 // Aucune coordonnée n'est définie pour ce document => on les crées
229 $id_gis = insert_gis();
230 revisions_gis($id_gis, $c);
231 lier_gis($id_gis, 'document', $id_document);
232 spip_log("GIS EXIFS : Création des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis", 'gis');
233 }
234 }
235 } elseif (in_array($document['extension'], array('kml','kmz','gpx'))) {
236 $recuperer_info = charger_fonction('kml_infos', 'inc');
237 $infos = $recuperer_info($document['id_document']);
238 if ($infos) {
239 if (is_numeric($latitude = $infos['latitude']) && is_numeric($longitude = $infos['longitude'])) {
240 $c = array(
241 'titre' => $infos['titre'] ? $infos['titre'] : basename($fichier),
242 'descriptif' => $infos['descriptif'],
243 'lat'=> $latitude,
244 'lon' => $longitude,
245 'zoom' => $config['zoom'] ? $config['zoom'] :'4'
246 );
247
248 include_spip('action/editer_gis');
249
250 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'")) {
251 // Des coordonnées sont déjà définies pour ce document => on les update
252 revisions_gis($id_gis, $c);
253 spip_log("GIS EXIFS : Update des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis", 'gis');
254 } else {
255 // Aucune coordonnée n'est définie pour ce document => on les crées
256 $id_gis = insert_gis();
257 revisions_gis($id_gis, $c);
258 lier_gis($id_gis, 'document', $id_document);
259 spip_log("GIS EXIFS : Création des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis", 'gis');
260 }
261 }
262 unset($infos['longitude']);
263 unset($infos['latitude']);
264 if (count($infos) > 0) {
265 include_spip('action/editer_document');
266 document_modifier($id_document, $infos);
267 }
268 }
269 }
270 }
271 if (is_array($flux) && isset($flux['args']['operation']) && ($flux['args']['operation'] == 'supprimer_document')
272 and ($id_document = intval($flux['args']['id_objet'])
273 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'")))
274 ) {
275 include_spip('action/editer_gis');
276 supprimer_gis($id_gis);
277 spip_log("GIS EXIFS : Suppression des coordonnées pour le document $id_document => id_gis = $id_gis", 'gis');
278 }
279
280 return $flux;
281 }
282
283
284 /**
285 * Optimiser la base de données en supprimant les liens orphelins
286 *
287 * @param array $flux
288 * @return array
289 */
290 function gis_optimiser_base_disparus($flux) {
291
292 include_spip('action/editer_liens');
293 // optimiser les liens morts :
294 // entre gis vers des objets effaces
295 // depuis des gis effaces
296 $flux['data'] += objet_optimiser_liens(array('gis' => '*'), '*');
297
298 return $flux;
299 }
300
301 function gis_saisies_autonomes($flux) {
302 $flux[] = 'carte';
303 return $flux;
304 }
305
306 /**
307 * Insertion dans le pipeline xmlrpc_methodes (xmlrpc)
308 * Ajout de méthodes xml-rpc spécifiques à GIS
309 *
310 * @param array $flux : un array des methodes déjà présentes, fonctionnant sous la forme :
311 * -* clé = nom de la méthode;
312 * -* valeur = le nom de la fonction à appeler;
313 * @return array $flux : l'array complété avec nos nouvelles méthodes
314 */
315 function gis_xmlrpc_methodes($flux) {
316 $flux['spip.liste_gis'] = 'spip_liste_gis';
317 $flux['spip.lire_gis'] = 'spip_lire_gis';
318 return $flux;
319 }
320
321 /**
322 * Insertion dans le pipeline xmlrpc_server_class (xmlrpc)
323 * Ajout de fonctions spécifiques utilisés par le serveur xml-rpc
324 */
325 function gis_xmlrpc_server_class($flux) {
326 include_spip('inc/gis_xmlrpc');
327 return $flux;
328 }
329
330 /**
331 * Insertion dans le traitement du formulaire de configuration
332 *
333 * Purger le répertoire js si on a une carte google dans les layers pour recalculer le js statique
334 * Peut être à améliorer
335 *
336 * @param array $flux
337 * Le contexte du pipeline
338 * @return array $flux
339 */
340 function gis_formulaire_traiter($flux) {
341 if ($flux['args']['form'] == 'configurer_gis') {
342 if (count(array_intersect(array('google_roadmap', 'google_satellite', 'google_terrain'), _request('layers'))) > 0) {
343 include_spip('inc/invalideur');
344 purger_repertoire(_DIR_VAR . 'cache-js');
345 suivre_invalideur(1);
346 }
347 }
348 return $flux;
349 }