使用java进行谷歌地球图像的kmz压缩

时间:2009-08-04 21:19:42

标签: java compression kml google-earth kmz

有没有人知道在Java中使用什么压缩来创建存储有图像的KMZ文件?我尝试使用标准的Java压缩(和各种模式,BEST_COMPRESSION,DEFAULT_COMPRESSION等),但我的压缩文件和kmz文件总是略有不同,不加载谷歌地球。好像我的png图像(实际的kml文件似乎以相同的方式压缩)。

是否有人成功创建了一个kmz存档,该存档链接到Google地球以外的本地图像(并存储在文件目录中)?

感谢

杰夫

6 个答案:

答案 0 :(得分: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构建它。

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

答案 1 :(得分:1)

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

ZipEntry 中,您可以指定 STORED DEFLATED 压缩方法,这两种方法都与Google地球兼容。

  • 请注意您使用的ZIP库或API,必须确保指定ZIP 2.0或“遗留”压缩方法(即STORED和DEFLATE方法),除非这些是默认方法。 DEFLATE方法称为SuperFast,STORED在WinZip documentation中称为或'无压缩'。
  • Google地球也支持通常以短名称“ Defl:X ”显示的最大或增强版deflate 方法。
  • 更高级的压缩方法(例如,bzip2,LZMA等)与Google地球兼容,如果打开,这些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();

答案 2 :(得分:1)

理解这一点的关键是来自@fraser的答案,KML开发人员支持的这个片段支持这个答案:

  

唯一支持的压缩方法是ZIP(PKZIP兼容),所以   gzip和bzip都不会起作用。用此压缩的KMZ文件   API完全支持该方法。

     

KMZ in Google Earth API & KML Compression in a Unix environment

Apache Commons有一个存档处理库,可以方便地使用它:http://commons.apache.org/proper/commons-vfs/filesystems.html

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

正如simsong所说,KMZ只是拉链KML。我注意到的一件事是doc.kml需要是zip文件中的第一个条目才能可靠地工作。我不记得对图像做任何特殊处理(除了将doc.kml之外的所有内容放在子目录中)。我的KMZ文件是使用java.util.zip生成的。