Domanda

Qualcuno sa quale compressione usare in Java per creare file KMZ che contengono immagini memorizzate al loro interno? Ho provato a utilizzare la compressione Java standard (e varie modalità, BEST_COMPRESSION, DEFAULT_COMPRESSION, ecc.), Ma il mio file compresso e il file kmz escono sempre leggermente diversi non caricati in Google Earth. Sembra in particolare le mie immagini png (il file kml effettivo sembra comprimersi allo stesso modo).

Qualcuno ha creato con successo un archivio kmz che si collega alle immagini locali (e viene memorizzato nella directory dei file) dall'esterno di google earth?

grazie

Jeff

È stato utile?

Soluzione

La chiave per capirlo è la risposta di @fraser, che è supportata da questo frammento del supporto per gli sviluppatori KML:

  

L'unico metodo di compressione supportato è ZIP (compatibile con PKZIP), quindi   né gzip né bzip funzionerebbero. File KMZ compressi con questo   il metodo è completamente supportato dall'API.

     

KMZ nell'API e nell'amplificatore di Google Earth; Compressione KML in un ambiente Unix

Apache Commons ha una libreria di gestione degli archivi che sarebbe utile per questo: http: //commons.apache.org/proper/commons-vfs/filesystems.html

Altri suggerimenti

KMZ è semplicemente un file zip con un file KML e risorse. Ad esempio, il file 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

Puoi costruirlo con java.util.zip, o anche con jar se vuoi.

Per quanto riguarda le immagini, non devono essere compresse, poiché contengono già dati compressi. Non si ottengono risparmi significativi.

Per impostazione predefinita, ZipOutputStream in Java creerà un file KMZ compatibile che Google Earth può leggere.

Nel ZipEntry puoi specificare il metodo di compressione MEMORIZZATO o DEFLATO , entrambi compatibili con Google Earth.

  • Nota qualunque libreria ZIP o API che usi, devi assicurarti di specificare ZIP 2.0 o "legacy" metodi di compressione (ovvero metodi STORED e DEFLATE) a meno che questi non siano i metodi predefiniti. Il metodo DEFLATE si chiama SuperFast e STORED si chiama None o ' Nessuna compressione ' in Documentazione WinZip .
  • Metodo
  • massimo o deflate avanzato spesso visualizzato con il nome breve " Defl: X " è supportato anche in Google Earth.
  • I metodi di compressione più avanzati (ad es. bzip2, LZMA, ecc.) sono NON compatibili con Google Earth e tali file KMZ verranno ignorati silenziosamente se aperti.

Ecco un semplice frammento di codice per creare un file KMZ in 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();

Certo, ho un pacchetto di file Kmz con immagini in c #. AFAIK l'unico metodo di compressione supportato è ZIP (compatibile con PKZIP). Quale libreria in Java stai usando?

Esiste una libreria per la gestione di KML in Java chiamata JAK (API Java per KML).

Sfortunatamente, sembra che abbia un bug: Numero 1: salva Il file KMZ non funziona - quindi sembra che tu non sia il primo ad avere problemi con la generazione di un file KMZ ...

Come diceva Simsong, KMZ è semplicemente KML compresso. Una cosa che ho notato è che doc.kml deve essere la prima voce nel file zip per funzionare in modo affidabile. Non ricordo di aver fatto nulla di speciale con le immagini (a parte mettere tutto tranne doc.kml in una sottodirectory). I miei file KMZ sono generati usando java.util.zip.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top