4

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

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

谢谢

杰夫

4

6 回答 6

1

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

   $ 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如果您愿意也可以使用。

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

于 2009-08-30T21:57:20.783 回答
1

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

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

  • 请注意,无论您使用哪种 ZIP 库或 API,您必须确保指定 ZIP 2.0 或“传统”压缩方法(即 STORED 和 DEFLATE 方法),除非这些是默认方法。在WinZip 文档中,DEFLATE 方法称为 SuperFast,而 STORED 称为None或“ No Compression ” 。
  • Google 地球还支持通常以短名称“ Defl:X ”显示的最大或增强的放气方法。
  • 更高级的压缩方法(例如 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();
于 2013-03-16T02:08:42.803 回答
1

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

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

Google Earth API 中的 KMZ 和 Unix 环境中的 KML 压缩

Apache Commons 有一个存档处理库,可以很方便地做到这一点:http ://commons.apache.org/proper/commons-vfs/filesystems.html

于 2014-01-09T18:32:04.350 回答
0

当然,我已经用 c# 中的图像打包了 Kmz 文件。AFAIK 唯一受支持的压缩方法是 ZIP(与 PKZIP 兼容)。您使用的是什么 Java 库?

于 2009-08-28T11:29:23.910 回答
0

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

不幸的是,它似乎有一个错误:问题 1:保存 KMZ 文件不起作用- 所以看起来你不是第一个在生成 KMZ 文件时遇到问题的人......

于 2009-09-04T13:36:29.680 回答
0

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

于 2009-09-05T19:26:15.300 回答