Javaを使用したGoogle Earthイメージのkmz圧縮
-
22-07-2019 - |
質問
画像が格納されたKMZファイルを作成するためにJavaで使用する圧縮を知っている人はいますか?標準のJava圧縮(およびさまざまなモード、BEST_COMPRESSION、DEFAULT_COMPRESSIONなど)を使用してみましたが、圧縮ファイルとkmzファイルは、Google Earthでロードしないと、常にわずかに異なって出力されます。特に私のpng画像のようです(実際のkmlファイルは同じように圧縮されているようです)。
Google Earthの外部からローカル画像にリンクするkmzアーカイブを作成した(およびファイルディレクトリに保存する)誰かが成功しましたか?
ありがとう
ジェフ
解決
これを理解する鍵は、@ fraserからの回答です。これは、KML開発者サポートの次のスニペットでサポートされています。
サポートされている圧縮方式はZIP(PKZIP互換)のみであるため、 gzipもbzipも機能しません。これで圧縮されたKMZファイル メソッドはAPIによって完全にサポートされています。
Apache Commonsには、これに便利なアーカイブ処理ライブラリがあります: http: //commons.apache.org/proper/commons-vfs/filesystems.html
他のヒント
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
でビルドできます。
画像は、圧縮されたデータがすでに含まれているため、圧縮しないでください。大幅な節約はありません。
デフォルトでは、 ZipOutputStream Javaの クラスは、Google Earthが読み取れる互換性のあるKMZファイルを作成します。
ZipEntry では、 STORED または DEFLATED の圧縮方法を指定できます。どちらもGoogle Earthと互換性があります。
- 使用するZIPライブラリまたはAPIに注意して、ZIPを指定する必要があります。
2.0または「レガシー」これらがデフォルトのメソッドでない限り、圧縮メソッド(つまり、STOREDおよびDEFLATEメソッド) DEFLATEメソッドはSuperFastと呼ばれ、STOREDは
None または ' No Compression 'と呼ばれます.htm "rel =" nofollow noreferrer "> WinZipドキュメント。 - Maximumまたは enhanced deflate メソッドは、多くの場合、短い名前" Defl:X "とともに表示されます。 Google Earthでもサポートされています。
- より高度な圧縮方法(例:bzip2、LZMAなど)はGoogle Earthと互換性がないため、このような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();
もちろん、c#で画像を含むKmzファイルをパッケージ化しています。知っている限り、サポートされている圧縮方法はZIP(PKZIP互換)のみです。 Javaのどのライブラリを使用していますか
JAK (Java APIと呼ばれるJavaのKMLを処理するためのライブラリがあります。 KML)。
残念ながら、バグがあるようです:問題1:保存KMZファイルは機能しません-KMZファイルの生成に問題があるのはあなたが初めてではないようです...
simsongが言ったように、KMZは単純に圧縮されたKMLです。気づいたことの1つは、doc.kmlが確実に機能するためにはzipファイルの最初のエントリである必要があるということです。 (doc.kml以外のすべてをサブディレクトリに置くことを除いて)画像で特別なことをしたことを思い出しません。 KMZファイルはjava.util.zipを使用して生成されます。