[PLUGINS] +set de base
[lhc/web/www.git] / www / plugins / gis / inc / kml_infos.php
diff --git a/www/plugins/gis/inc/kml_infos.php b/www/plugins/gis/inc/kml_infos.php
new file mode 100644 (file)
index 0000000..484c03e
--- /dev/null
@@ -0,0 +1,187 @@
+<?php
+/**
+ * Plugin GIS
+ * Récupération de données dans les fichiers kml permettant de :
+ * -* récupérer latitude et longitude d'un point correspondant centré sur la moyenne des points ou polygones du kml
+ * -* récupérer un titre
+ * -* récupérer un descriptif
+ */
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function inc_kml_infos($id_document){
+       if(!intval($id_document))
+               return false;
+       include_spip('inc/documents');
+       $document = sql_fetsel("*", "spip_documents","id_document=".intval($id_document));
+       $chemin = $document['fichier'];
+       $chemin = get_spip_doc($chemin);
+       $extension = $document['extension'];
+       
+       if(in_array($extension,array('kml','kmz'))){
+               $supprimer_chemin = false;
+               /**
+                * Si on est dans un kmz (kml + autres fichiers compressés en zip),
+                * On dézip pour trouver le kml
+                */
+               if($extension == 'kmz'){
+                       include_spip('inc/pclzip');
+                       $zip = new PclZip($chemin);
+                       $list = $zip->listContent();
+                       foreach($list as $fichier => $info_fichier){
+                               if(substr(basename($info_fichier['filename']),-3) == 'kml'){
+                                       $zip->extractByIndex($info_fichier['index'],_DIR_TMP);
+                                       $chemin = _DIR_TMP.$info_fichier['filename'];
+                                       $supprimer_chemin = true;
+                                       break;
+                               }
+                       }
+               }
+               include_spip('inc/xml');
+               $ret = lire_fichier($chemin,$donnees);
+               $arbre = spip_xml_parse($donnees);
+               spip_xml_match_nodes(",^Document,",$arbre, $documents);
+               foreach($documents as $document => $info){
+                       $infos['titre'] = $info[0]['name'][0];
+                       $infos['descriptif'] = $info[0]['description'][0];
+                       $infos['longitude'] = $info[0]['LookAt'][0]['longitude'][0] ? $info[0]['LookAt'][0]['longitude'][0] : false;
+                       $infos['latitude'] = $info[0]['LookAt'][0]['latitude'][0] ? $info[0]['LookAt'][0]['latitude'][0] : false;
+               }
+               
+               /**
+                * Si on n'a pas de longitude ou de latitude, 
+                * on essaie de faire une moyenne des placemarks
+                */
+               if(!$infos['longitude'] OR !$infos['latitude']){
+                       spip_xml_match_nodes(",^Placemark,",$arbre, $placemarks);
+                       $latitude = 0;
+                       $longitude = 0;
+                       $compte = 0;
+                       foreach($placemarks as $places){
+                               foreach($places as $placemark => $lieu){
+                                       if($compte > 500)
+                                                       break;  
+                                       if($lieu['LookAt'][0]['longitude'][0] && $latitude + $lieu['LookAt'][0]['latitude'][0]){
+                                               if($compte > 500)
+                                                       break;  
+                                               $latitude = $latitude + $lieu['LookAt'][0]['latitude'][0];
+                                               $longitude = $longitude + $lieu['LookAt'][0]['longitude'][0];
+                                               $compte++;
+                                       }else if($lieu['Point'][0]['coordinates'][0]){
+                                               if($compte > 500)
+                                                       break;
+                                               $coordinates = explode(',',$lieu['Point'][0]['coordinates'][0]);
+                                               $latitude = $latitude + trim($coordinates[1]);
+                                               $longitude = $longitude + trim($coordinates[0]);
+                                               $compte++;
+                                       }else if($lieu['Polygon'][0]['outerBoundaryIs'][0]['LinearRing'][0]['coordinates'][0]){
+                                               if($compte > 500)
+                                                       break;
+                                               $coordinates = explode(' ',trim($lieu['Polygon'][0]['outerBoundaryIs'][0]['LinearRing'][0]['coordinates'][0]));
+                                               foreach($coordinates as $coordinate){
+                                                       if($compte > 500)
+                                                               break;
+                                                       $coordinate = explode(',',$coordinate);
+                                                       $latitude = $latitude + trim($coordinate[1]);
+                                                       $longitude = $longitude + trim($coordinate[0]);
+                                                       $compte++;
+                                               }
+                                       }
+                               }
+                       }
+                       if(($latitude != 0) && ($longitude != 0)){
+                               $infos['latitude'] = $latitude / $compte;
+                               $infos['longitude'] = $longitude / $compte; 
+                       }
+               }
+               
+               /**
+                * Si pas de titre ou si le titre est égal au nom de fichier ou contient kml ou kmz :
+                * -* on regarde s'il n'y a qu'un seul Folder et on récupère son nom;
+                * -* on regarde s'il n'y a qu'un seul Placemark et on récupère son nom;
+                */
+               if(!$infos['titre'] OR ($infos['titre'] == basename($chemin)) OR (preg_match(',\.km.,',$infos['titre']) > 0)){
+                       spip_xml_match_nodes(",^Folder,",$arbre, $folders);
+                       if(count($folders['Folder']) == 1){
+                               foreach($folders['Folder'] as $folder => $dossier){
+                                       if($dossier['name'][0])
+                                               $infos['titre'] = $dossier['name'][0];
+                                       if(!$infos['descriptif'] && $dossier['description'][0])
+                                               $infos['descriptif'] = $dossier['description'][0];
+                               }
+                       }else{
+                               if(!is_array($placemarks)){
+                                       spip_xml_match_nodes(",^Placemark,",$arbre, $placemarks);
+                               }
+                               if(count($placemarks) == 1){
+                                       foreach($placemarks as $places){
+                                               if(count($places) == 1){
+                                                       foreach($places as $placemark => $lieu){
+                                                               if($lieu['name'][0])
+                                                                       $infos['titre'] = $lieu['name'][0];
+                                                               if(!$infos['descriptif'] && $lieu['description'][0])
+                                                                       $infos['descriptif'] = $lieu['description'][0];
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }else if(in_array($extension,array('gpx'))){
+               $supprimer_chemin = false;
+               include_spip('inc/xml');
+               $ret = lire_fichier($chemin,$donnees);
+               $arbre = spip_xml_parse($donnees);
+               spip_xml_match_nodes(",^metadata,",$arbre, $metadatas);
+               foreach($metadatas as $metadata => $info){
+                       $infos['titre'] = $info[0]['name'][0];
+                       //$infos['date'] =  $info[0]['time'][0];
+                       $infos['descriptif'] = $info[0]['description'][0];
+                       foreach($info[0] as $meta => $data){
+                               if(preg_match(',^bounds ,',$meta)){
+                                       $meta = '<'.$meta.'>';
+                                       $maxlat = extraire_attribut($meta,'maxlat');
+                                       $minlat = extraire_attribut($meta,'minlat');
+                                       $maxlon = extraire_attribut($meta,'maxlon');
+                                       $minlon = extraire_attribut($meta,'minlon');
+                                       if($maxlat && $minlat)
+                                               $infos['latitude'] = (($maxlat+$minlat)/2);
+                                       if($maxlon && $minlon)
+                                               $infos['longitude'] = (($maxlon+$minlon)/2);
+                               }
+                       }
+               }
+               /**
+                * Si on n'a pas de longitude ou de latitude, 
+                * on essaie de faire une moyenne des placemarks
+                */
+               if(!$infos['longitude'] OR !$infos['latitude']){
+                       spip_xml_match_nodes(",^trkpt,",$arbre, $trackpoints);
+                       $latitude = 0;
+                       $longitude = 0;
+                       $compte = 0;
+                       foreach($trackpoints as $places => $place){
+                               foreach($place as $placemark => $lieu){
+                                       if($compte > 10)
+                                                       break;
+                               }
+                       }
+                       if(($latitude != 0) && ($longitude != 0)){
+                               $infos['latitude'] = $latitude / $compte;
+                               $infos['longitude'] = $longitude / $compte; 
+                       }
+               }
+       }else
+               return false;
+       
+       if(isset($infos['titre']))
+               $infos['titre'] = preg_replace('/<!\[cdata\[(.*?)\]\]>/is', '$1',$infos['titre']);
+       if(isset($infos['descriptif']))
+               $infos['descriptif'] = preg_replace('/<!\[cdata\[(.*?)\]\]>/is', '$1', $infos['descriptif']);
+               
+       if($supprimer_chemin){
+               supprimer_fichier($chemin);
+       }
+               
+       return $infos;
+}
+?>
\ No newline at end of file