有没有人知道在Java中使用什么压缩来创建存储有图像的KMZ文件?我尝试使用标准的Java压缩(和各种模式,BEST_COMPRESSION,DEFAULT_COMPRESSION等),但我的压缩文件和kmz文件总是略有不同,不加载谷歌地球。好像我的png图像(实际的kml文件似乎以相同的方式压缩)。
是否有人成功创建了一个kmz存档,该存档链接到Google地球以外的本地图像(并存储在文件目录中)?
感谢
杰夫
答案 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地球兼容。
以下是使用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生成的。