compressione kmz per immagini di google earth con java
-
22-07-2019 - |
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
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.