Compresión kmz para imágenes de Google Earth con Java
-
22-07-2019 - |
Pregunta
¿Alguien sabe qué compresión usar en Java para crear archivos KMZ que tienen imágenes almacenadas dentro de ellos? Intenté usar la compresión Java estándar (y varios modos, BEST_COMPRESSION, DEFAULT_COMPRESSION, etc.), pero mi archivo comprimido y el archivo kmz siempre salen ligeramente diferentes, no se cargan en Google Earth. Parece que mis imágenes png en particular (el archivo kml real parece comprimirse de la misma manera).
¿Alguien ha creado con éxito un archivo kmz que se vincule a imágenes locales (y se almacene en el directorio de archivos) desde fuera de google earth?
gracias
Jeff
Solución
La clave para entender esto es la respuesta de @fraser, que es compatible con este fragmento de KML Developer Support:
El único método de compresión compatible es ZIP (compatible con PKZIP), por lo que ni gzip ni bzip funcionarían. Archivos KMZ comprimidos con esto El método es totalmente compatible con la API.
KMZ en Google Earth API & amp; Compresión KML en un entorno Unix
Apache Commons tiene una biblioteca de manejo de archivos que sería útil para esto: http: //commons.apache.org/proper/commons-vfs/filesystems.html
Otros consejos
KMZ es simplemente un archivo zip con un archivo KML y activos. Por ejemplo, el archivo london_eye.kmz
kmz contiene:
$ 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
Puede compilar esto con java.util.zip, o incluso con jar
si lo desea.
En lo que respecta a las imágenes, no deben comprimirse, ya que ya contienen datos comprimidos. No obtienes ningún ahorro significativo.
Por defecto, el ZipOutputStream en Java creará un archivo KMZ compatible que Google Earth puede leer.
En el ZipEntry puede especificar el método de compresión ALMACENADO o DEFLADO , ambos compatibles con Google Earth.
- Tenga en cuenta la biblioteca ZIP o API que utilice, debe asegurarse de especificar ZIP 2.0 o "legado" métodos de compresión (es decir, métodos ALMACENADOS y DESINFLAR) a menos que estos sean los métodos predeterminados. El método DEFLATE se llama SuperFast y STORED se llama None o ' No Compression ' en Documentación de WinZip . El método
- Máximo o desinflado mejorado a menudo se muestra con el nombre corto " Defl: X " también es compatible con Google Earth.
- Los métodos de compresión más avanzados (p. ej., bzip2, LZMA, etc.) son NO compatibles con Google Earth y dichos archivos KMZ se ignorarán en silencio si se abren.
Aquí hay un fragmento de código simple para crear un archivo 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();
Claro, tengo paquetes de archivos Kmz con imágenes en c #. AFAIK el único método de compresión que es compatible es ZIP (compatible con PKZIP). ¿Qué biblioteca en Java estás usando?
Hay una biblioteca para tratar con KML en Java llamada JAK (API de Java para KML).
Desafortunadamente, parece tener un error: Problema 1: guardar El archivo KMZ no funciona , por lo que parece que no eres el primero que tiene problemas para generar un archivo KMZ ...
Como dijo simsong, KMZ es simplemente KML comprimido. Una cosa que noté es que doc.kml debe ser la primera entrada en el archivo zip para que funcione de manera confiable. No recuerdo haber hecho nada especial con las imágenes (aparte de poner todo menos doc.kml en un subdirectorio). Mis archivos KMZ se generan usando java.util.zip.