有谁知道在 Java 中使用什么压缩来创建其中存储有图像的 KMZ 文件?我尝试使用标准 Java 压缩(以及各种模式,BEST_COMPRESSION、DEFAULT_COMPRESSION 等),但我的压缩文件和 kmz 文件总是略有不同,不会在谷歌地球中加载。似乎特别像我的 png 图像(实际的 kml 文件似乎以相同的方式压缩)。
有没有人从谷歌地球之外成功创建了一个链接到本地图像(并存储在文件目录中)的 kmz 存档?
谢谢
杰夫
有谁知道在 Java 中使用什么压缩来创建其中存储有图像的 KMZ 文件?我尝试使用标准 Java 压缩(以及各种模式,BEST_COMPRESSION、DEFAULT_COMPRESSION 等),但我的压缩文件和 kmz 文件总是略有不同,不会在谷歌地球中加载。似乎特别像我的 png 图像(实际的 kml 文件似乎以相同的方式压缩)。
有没有人从谷歌地球之外成功创建了一个链接到本地图像(并存储在文件目录中)的 kmz 存档?
谢谢
杰夫
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
如果您愿意也可以使用。
就图像而言,它们不应该被压缩,因为它们已经包含压缩数据。你没有得到任何显着的节省。
默认情况下,Java 中的ZipOutputStream类将创建 Google 地球可以读取的兼容 KMZ 文件。
在ZipEntry中,您可以指定STORED或DEFLATED压缩方法,这两种方法都与 Google 地球兼容。
这是在 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();
理解这一点的关键是来自@fraser 的答案,KML 开发人员支持的这个片段支持:
唯一受支持的压缩方法是 ZIP(与 PKZIP 兼容),因此 gzip 和 bzip 都不起作用。API 完全支持使用此方法压缩的 KMZ 文件。
Apache Commons 有一个存档处理库,可以很方便地做到这一点:http ://commons.apache.org/proper/commons-vfs/filesystems.html
当然,我已经用 c# 中的图像打包了 Kmz 文件。AFAIK 唯一受支持的压缩方法是 ZIP(与 PKZIP 兼容)。您使用的是什么 Java 库?
在 Java 中有一个用于处理 KML 的库,称为JAK(Java API for KML)。
不幸的是,它似乎有一个错误:问题 1:保存 KMZ 文件不起作用- 所以看起来你不是第一个在生成 KMZ 文件时遇到问题的人......
正如 simsong 所说,KMZ 只是压缩的 KML。我确实注意到的一件事是 doc.kml 需要成为 zip 文件中的第一个条目,它才能可靠地工作。我不记得对图像做了什么特别的事情(除了将 doc.kml 以外的所有内容都放在子目录中)。我的 KMZ 文件是使用 java.util.zip 生成的。