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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top