Compression kmz pour les images de Google Earth avec Java
-
22-07-2019 - |
Question
Quelqu'un sait-il quelle compression utiliser en Java pour créer des fichiers KMZ contenant des images? J'ai essayé d'utiliser la compression Java standard (et divers modes, BEST_COMPRESSION, DEFAULT_COMPRESSION, etc.), mais mon fichier compressé et le fichier kmz sont toujours légèrement différents, mais ne se chargent pas dans Google Earth. Il semble que mes images png en particulier (le fichier kml semble être compressé de la même manière).
Quelqu'un at-il créé avec succès une archive kmz reliée à des images locales (et stockée dans le répertoire des fichiers) en dehors de Google Earth?
merci
Jeff
La solution
La clé pour comprendre cela est la réponse de @fraser, qui est prise en charge par cet extrait de support du support développeur KML:
La seule méthode de compression prise en charge est ZIP (compatible PKZIP). ni gzip ni bzip ne fonctionneraient. Fichiers KMZ compressés avec cette méthode sont entièrement pris en charge par l'API.
API KMZ dans Google Earth & amp; Compression KML dans un environnement Unix
Apache Commons possède une bibliothèque de traitement des archives qui serait pratique pour cela: http: //commons.apache.org/proper/commons-vfs/filesystems.html
Autres conseils
KMZ est simplement un fichier zip avec un fichier KML et des ressources. Par exemple, le fichier london_eye.kmz
kmz contient:
$ unzip -l london_eye.kmz
Archive: london_eye.kmz
Length Date Time Name
-------- ---- ---- ----
451823 09-27-07 08:47 doc.kml
0 09-26-07 07:39 files/
1796 12-31-79 00:00 files/Blue_Tile.JPG
186227 12-31-79 00:00 files/Legs.dae
3960 12-31-79 00:00 files/Olive.JPG
1662074 12-31-79 00:00 files/Wheel.dae
65993 12-31-79 00:00 files/Wooden_Fence.jpg
7598 12-31-79 00:00 files/a0.gif
7596 12-31-79 00:00 files/a1.gif
7556 12-31-79 00:00 files/a10.gif
7569 12-31-79 00:00 files/a11.gif
7615 12-31-79 00:00 files/a12.gif
7587 12-31-79 00:00 files/a13.gif
7565 12-31-79 00:00 files/a14.gif
7603 12-31-79 00:00 files/a15.gif
7599 12-31-79 00:00 files/a16.gif
7581 12-31-79 00:00 files/a17.gif
7606 12-31-79 00:00 files/a18.gif
7613 12-31-79 00:00 files/a19.gif
7607 12-31-79 00:00 files/a2.gif
7592 12-31-79 00:00 files/a3.gif
7615 12-31-79 00:00 files/a4.gif
7618 12-31-79 00:00 files/a5.gif
7618 12-31-79 00:00 files/a6.gif
7578 12-31-79 00:00 files/a7.gif
7609 12-31-79 00:00 files/a8.gif
7603 12-31-79 00:00 files/a9.gif
57185 12-31-79 00:00 files/capsule.dae
310590 12-31-79 00:00 files/groundoverlay.jpg
224927 12-31-79 00:00 files/mechanism.dae
160728 12-31-79 00:00 files/shadowoverlay.jpg
33044 12-31-79 00:00 files/shed.dae
-------- -------
3310275 32 files
Vous pouvez le construire avec java.util.zip, ou même avec jar
si vous le souhaitez.
En ce qui concerne les images, elles ne doivent pas être compressées, car elles contiennent déjà des données compressées. Vous n'obtenez aucune économie significative.
Par défaut, le ZipOutputStream en Java créera un fichier KMZ compatible que Google Earth pourra lire.
Dans le ZipEntry , vous pouvez spécifier la méthode de compression STORED ou DEFLATED , toutes deux compatibles avec Google Earth.
- Notez que quelle que soit la bibliothèque ZIP ou l'API que vous utilisez, vous devez vous assurer de spécifier ZIP 2.0 ou "héritage" méthodes de compression (c'est-à-dire, méthodes STORED et DEFLATE) sauf s'il s'agit des méthodes par défaut. La méthode DEFLATE est appelée SuperFast et STORED, Aucun ou ' Aucune compression ' dans Documentation WinZip . La méthode
- ou Enhanced Deflate est souvent affichée avec le nom abrégé " Defl: X ". est également pris en charge dans Google Earth.
- Les méthodes de compression plus avancées (par exemple, bzip2, LZMA, etc.) sont NON compatibles avec Google Earth et ces fichiers KMZ seront automatiquement ignorés s'ils sont ouverts.
Voici un extrait de code simple permettant de créer un fichier KMZ en Java.
FileOutputStream fos = new FileOutputStream("example.kmz");
ZipOutputStream zoS = new ZipOutputStream(fos);
ZipEntry ze = new ZipEntry("doc.kml");
zoS.putNextEntry(ze);
PrintStream ps = new PrintStream(zoS);
ps.println("<?xml version='1.0' encoding='UTF-8'?>");
ps.println("<kml xmlns='http://www.opengis.net/kml/2.2'>");
// write out contents of KML file ...
ps.println("<Document>");
ps.println("<Placemark>");
// ...
ps.println("</Placemark>");
ps.println("</Document>");
ps.println("</kml>");
ps.flush();
zoS.closeEntry(); // close KML entry
// include and write other files (E.g. icons, overlays, other KML files, etc.)
zoS.close();
Bien sûr, j'ai des fichiers de package Kmz avec des images en c #. Autant que je sache, la seule méthode de compression prise en charge est ZIP (compatible PKZIP). Quelle bibliothèque en Java utilisez-vous?
Il existe une bibliothèque pour traiter le KML en Java appelée JAK (API Java pour KML).
Malheureusement, il semble y avoir un bogue: Problème 1: enregistrer Le fichier KMZ ne fonctionne pas . Vous n’êtes donc pas le premier à avoir des problèmes pour générer un fichier KMZ ...
Comme l’a dit Simsong, KMZ est simplement compressé en KML. Une chose que j’ai remarquée, c’est que doc.kml doit être la première entrée du fichier zip pour fonctionner de manière fiable. Je ne me rappelle pas avoir fait quelque chose de spécial avec les images (mis à part mettre tout sauf doc.kml dans un sous-répertoire). Mes fichiers KMZ sont générés à l'aide de java.util.zip.