compressão kmz para imagens do google earth com java
-
22-07-2019 - |
Pergunta
Alguém sabe o que a compressão para usar em Java para criar arquivos KMZ que imagens armazenadas dentro deles? Eu tentei usar o padrão de compressão Java (e vários modos, BEST_COMPRESSION, DEFAULT_COMPRESSION, etc), mas meu arquivo compactado eo arquivo KMZ sempre saem um pouco diferente não carregar no Google Earth. Parece que meus png imagens em particular (o arquivo KML real parece comprimir a mesma maneira).
Alguém já criado com sucesso um arquivo KMZ que links para imagens locais (e fica armazenado no diretório de arquivos) de fora do Google Earth?
graças
Jeff
Solução
A chave para entender esta é a resposta de @fraser, que é suportado por este trecho de KML Developer Support:
O método de compressão é suportado apenas ZIP (PKZIP-compatível), assim nem gzip nem bzip iria funcionar. KMZ arquivos compactados com este método são totalmente suportados pela API.
KMZ no Google Earth API & KML compressão em um ambiente Unix
Apache Commons tem um arquivo de biblioteca de manipulação que seria útil para este: http: //commons.apache.org/proper/commons-vfs/filesystems.html
Outras dicas
KMZ é simplesmente um arquivo zip com um arquivo e ativos KML. Por exemplo, o arquivo london_eye.kmz
KMZ contém:
$ 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
Você pode construir isso com java.util.zip, ou mesmo com jar
se quiser.
Tanto quanto as imagens ir, eles não devem ser comprimido, uma vez que já contêm dados comprimidos. Você não obter quaisquer poupanças significativas.
Por padrão, o ZipOutputStream classe em Java criará um arquivo KMZ compatível que o Google Earth possa ler.
No ZipEntry , você pode especificar ARMAZENADOS ou DEFLACIONADO método de compressão, sendo que ambos são compatíveis com o Google Earth.
- Nota qualquer ZIP biblioteca ou API que você usa, você deve certificar-se de especificar ZIP 2,0 ou "normais" métodos de compressão (isto é, métodos desinflar, armazenado e) se estes não são os métodos padrão. método DEFLATE é chamado SuperFast e armazenado é chamado Nenhum ou ' Sem compressão ' em WinZip documentação .
- Máxima ou reforçada deflate método frequentemente exibido com o nome abreviado. " Defl: X " também é suportado no Google Earth
- métodos de compressão mais avançadas (por exemplo, bzip2, LZMA, etc.) são não compatível com tais arquivos KMZ Google Earth e será ignorado se for aberto.
Aqui está trecho de código simples para criar um arquivo KMZ em 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, eu tenho empacotar arquivos KMZ com imagens em c #. AFAIK o único método de compressão que é suportado é ZIP (PKZIP-compatível). Qual biblioteca em Java você está usando?
Há uma biblioteca para lidar com KML em Java chamado JAK (API Java para KML).
Infelizmente, parece ter um bug: Questão 1: Guardar arquivo KMZ não funciona - então parece que você não é o primeiro que tem problemas com a geração de um arquivo KMZ ...
Como simsong disse, KMZ é simplesmente zipado KML. Uma coisa que eu notei é que as necessidades doc.kml de ser a primeira entrada no arquivo zip para que ele funcione de forma confiável. Não me lembro de fazer nada de especial com as imagens (para além de colocar tudo, mas doc.kml em um subdiretório). Meus arquivos KMZ são gerados usando java.util.zip.