2009-08-04 62 views
4

有誰知道在Java中使用什麼壓縮來創建KMZ文件,其中存儲圖像?我嘗試過使用標準的Java壓縮(以及各種模式,BEST_COMPRESSION,DEFAULT_COMPRESSION等),但是我的壓縮文件和kmz文件總是出現稍微不同的不加載的谷歌地球。看起來像我的PNG圖像(實際的kml文件似乎以相同的方式壓縮)。kmz壓縮谷歌地球圖像與java

有沒有人成功地創建了一個kmz存檔,鏈接到本地​​圖像(並存儲在文件目錄中)從谷歌之外的地球?

感謝

傑夫

回答

0

當然,我有在c#圖像包KMZ文件。 AFAIK唯一支持的壓縮方法是ZIP(PKZIP兼容)。你在用什麼Java庫?

+0

我只是用標準的Java類郵編... – 2009-08-31 01:22:47

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如果你想。

就圖像而言,它們不應該被壓縮,因爲它們已經包含壓縮數據。你沒有得到任何顯着的節省。

+0

你實際上做到了這一點java.util.zip?當我這樣做時,我仍然無法讓Google Earth打開它?我注意到這些壓縮與將文件放入谷歌地球時略有不同。 – 2009-09-08 00:23:37

0

有一個用於處理Java中KML的庫,名爲JAK(用於KML的Java API)。

不幸的是,它似乎有一個bug:Issue 1: save KMZ file does not work - 所以看起來你不是第一個誰擁有生成KMZ文件的問題...

+0

謝謝。我一直無法獲得kmz壓縮以使用標準java壓縮。你會認爲這會更容易。 – 2009-09-08 00:22:35

0

正如simsong說,KMZ僅僅是壓縮的KML 。我注意到的一件事是,doc.kml需要成爲zip文件中的第一個條目才能可靠地工作。我不記得對圖像做了什麼特別的事情(除了將doc.kml以外的所有東西都放在子目錄中)。我的KMZ文件是使用java.util.zip生成的。

1

默認情況下,ZipOutputStream Java中的類將創建Google地球可以讀取的兼容KMZ文件。

ZipEntry您可以指定存儲的DEFLATED壓縮方法,這兩者都與谷歌地球兼容。

  • 注意取其ZIP庫或使用API​​,必須確保指定ZIP 2.0或「傳統」的壓縮方法(即存儲和放氣的方法),除非這些都是默認的方法。 DEFLATE方法稱爲SuperFast並且STORED被稱爲或'無壓縮'在WinZip documentation中。
  • 最大值或增強放氣方法通常在縮短名稱「Defl:X」中顯示,也受Google地球支持。
  • 更高級的壓縮方法(例如bzip2,LZMA等))是不是兼容谷歌地球和這樣的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();