2009-08-04 33 views
4

有谁知道在Java中使用什么压缩来创建KMZ文件,其中存储图像?我尝试过使用标准的Java压缩(以及各种模式,BEST_COMPRESSION,DEFAULT_COMPRESSION等),但是我的压缩文件和kmz文件总是出现稍微不同的不加载的谷歌地球。看起来像我的PNG图像(实际的kml文件似乎以相同的方式压缩)。kmz压缩谷歌地球图像与java

有没有人成功地创建了一个kmz存档,链接到本地​​图像(并存储在文件目录中)从谷歌之外的地球?

感谢

杰夫

回答

0

当然,我有在c#图像包KMZ文件。 AFAIK唯一支持的压缩方法是ZIP(PKZIP兼容)。你在用什么Java库?

+0

我只是用标准的Java类邮编... – 2009-08-31 01:22:47

1

KMZ只是一个包含KML文件和资产的zip文件。例如,london_eye.kmz KMZ文件包含:

$ 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 

你可以用java.util.zip建立这个,甚至与jar如果你想。

就图像而言,它们不应该被压缩,因为它们已经包含压缩数据。你没有得到任何显着的节省。

+0

你实际上做到了这一点java.util.zip?当我这样做时,我仍然无法让Google Earth打开它?我注意到这些压缩与将文件放入谷歌地球时略有不同。 – 2009-09-08 00:23:37

0

有一个用于处理Java中KML的库,名为JAK(用于KML的Java API)。

不幸的是,它似乎有一个bug:Issue 1: save KMZ file does not work - 所以看起来你不是第一个谁拥有生成KMZ文件的问题...

+0

谢谢。我一直无法获得kmz压缩以使用标准java压缩。你会认为这会更容易。 – 2009-09-08 00:22:35

0

正如simsong说,KMZ仅仅是压缩的KML 。我注意到的一件事是,doc.kml需要成为zip文件中的第一个条目才能可靠地工作。我不记得对图像做了什么特别的事情(除了将doc.kml以外的所有东西都放在子目录中)。我的KMZ文件是使用java.util.zip生成的。

1

默认情况下,ZipOutputStream Java中的类将创建Google地球可以读取的兼容KMZ文件。

ZipEntry您可以指定存储的DEFLATED压缩方法,这两者都与谷歌地球兼容。

  • 注意取其ZIP库或使用API​​,必须确保指定ZIP 2.0或“传统”的压缩方法(即存储和放气的方法),除非这些都是默认的方法。 DEFLATE方法称为SuperFast并且STORED被称为或'无压缩'在WinZip documentation中。
  • 最大值或增强放气方法通常在缩短名称“Defl:X”中显示,也受Google地球支持。
  • 更高级的压缩方法(例如bzip2,LZMA等))是不是兼容谷歌地球和这样的KMZ文件将被默默忽略,如果打开。

下面是使用Java创建KMZ文件的简单代码片段。

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();