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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top