You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

365 lines
13 KiB

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