сжатие kmz для изображений Google Earth с помощью Java
-
22-07-2019 - |
Вопрос
Кто-нибудь знает, какое сжатие использовать в Java для создания файлов KMZ, в которых хранятся изображения?Я пробовал использовать стандартное сжатие Java (и различные режимы, BEST_COMPRESSION, DEFAULT_COMPRESSION и т.д.), Но мой сжатый файл и файл kmz всегда получаются немного разными, не загружаются в Google Планета Земля.Похоже, в частности, на мои изображения в формате png (фактический файл kml, похоже, сжимается таким же образом).
Кто-нибудь успешно создал архив kmz, который ссылается на локальные изображения (и сохраняется в каталоге files) извне Google Планета Земля?
Спасибо
Джефф
Решение
Ключом к пониманию этого является ответ от @fraser, который поддерживается этим фрагментом из службы поддержки разработчиков KML:
Единственный поддерживаемый метод сжатия - ZIP (совместимый с PKZIP), поэтому ни gzip, ни bzip не будут работать.Файлы KMZ, сжатые с помощью этого метода полностью поддерживаются API.
В Apache Commons есть библиотека обработки архивов, которая была бы удобна для этого: http://commons.apache.org/proper/commons-vfs/filesystems.html
Другие советы
KMZ - это просто zip-файл с файлом KML и ресурсами.Например, в 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 создаст совместимый файл KMZ, который сможет прочитать Google Планета Земля.
В Застежка - молния вы можете указать либо СОХРАНЕННЫЙ или СДУТЫЙ метод сжатия, оба из которых совместимы с Google Планета Земля.
- Примечание какую бы библиотеку ZIP или API вы ни использовали, вы должны обязательно указать ZIP 2.0 или "устаревшие" методы сжатия (т. Е. сохраненные методы и методы DEFLATE), если только они не являются методами по умолчанию.Метод DEFLATE называется сверхбыстрым, а метод STORED вызывается Нет или 'Отсутствие сжатия" в Документация WinZip.
- Максимальный или улучшенное сдувание метод часто отображается с коротким названием "Дефл:X" также поддерживается в Google Планета Земля.
- Более продвинутыми методами сжатия (например, bzip2, LZMA и т.д.) Являются НЕ совместим с Google Планета Земля, и такие файлы KMZ будут автоматически игнорироваться при открытии.
Вот простой фрагмент кода для создания файла KMZ на Java.
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();
Конечно, у меня есть файлы пакета Kmz с изображениями на c #.AFAIK единственный поддерживаемый метод сжатия - ZIP (совместимый с PKZIP).Какую библиотеку на Java вы используете?
Существует библиотека для работы с KML на Java, которая называется JAK (Java API для KML).
К сожалению, похоже, в нем есть ошибка: Проблема 1:сохранить файл KMZ не работает - похоже, вы не первый, у кого возникают проблемы с генерацией файла KMZ...
Как сказал Симсонг, KMZ - это просто сжатый KML.Одна вещь, которую я заметил, это то, что doc.kml должен быть первой записью в zip-файле, чтобы он работал надежно.Я не помню, чтобы делал что-то особенное с изображениями (кроме помещения всего, кроме doc.kml, в подкаталог).Мои файлы KMZ создаются с использованием java.util.zip .