【问题标题】:kmz compression for google earth images with java使用 java 对谷歌地球图像进行 kmz 压缩
【发布时间】:2009-08-04 21:19:41
【问题描述】:

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

是否有人成功创建了一个 kmz 存档,该存档链接到来自 google earth 之外的本地图像(并存储在 files 目录中)?

谢谢

杰夫

【问题讨论】:

    标签: java compression kml google-earth kmz


    【解决方案1】:

    理解这一点的关键是@fraser 的答案,KML Developer Support 的这个 sn-p 支持:

    唯一支持的压缩方法是 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

    【讨论】:

      【解决方案2】:

      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

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

      【讨论】:

      • 你真的用 java.util.zip 做过这个吗?当我这样做时,我仍然无法让谷歌地球打开它?而且我注意到压缩与将文件放在谷歌地球中略有不同。
      【解决方案3】:

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

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

      • 请注意您使用的任何 ZIP 库或 API,您必须确保指定 ZIP 2.0 或“传统”压缩方法(即 STORED 和 DEFLATE 方法),除非这些是默认方法。 DEFLATE 方法称为 SuperFast,STORED 称为 NoneWinZip documentation 中的“No Compression”。
      • Google 地球还支持通常以短名称“Defl:X”显示的最大或增强的 deflate 方法。
      • 更高级的压缩方法(例如 bzip2、LZMA 等)与 Google 地球兼容,此类 KMZ 文件在打开时将被忽略。

      这是用 Java 创建 KMZ 文件的简单代码 sn-p。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-04-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多