KMZ показывает только файл значка, когда я переименовываю файл в zip-файле

Я пишу программу на C#, используя http://www.icsharpcode.net/opensource/sharpziplib/ сжать в ZIP-файл файл KMZ, который будет содержать файл KML и значки.

Моя попытка:

  1. После открытия файла KMZ в Google Earth теперь отображаются значки.
  2. Затем я конвертирую KMZ в zip-файл, чтобы проверить его содержимое.
  3. Я переименовываю значок в другое имя, а затем возвращаю его исходное имя.
  4. Затем я изменяю его обратно на файл KMZ и открываю в Google Earth, и значки отображаются нормально.

Любые идеи относительно того, что я делаю неправильно в процессе сжатия, из-за которого значки изначально не отображаются?


person TheWommies    schedule 20.03.2014    source источник
comment
Возможно, стоит уточнить, как KMZ преобразуется в ZIP-файл, поскольку KMZ уже является .ZIP, но с другим расширением. Предположим, вы просто переименовали расширение имени файла (например, .kmz в .zip). Если вы используете WinZip для переименования значка, он может сбросить некоторые свойства записей и/или очистить другую информацию заголовка при сохранении, чтобы результирующий файл был действительным. Фрагмент кода создания KMZ был бы полезен.   -  person JasonM1    schedule 28.03.2014


Ответы (1)


Один из способов заставить файлы KMZ, созданные с помощью CSharpZipLib, правильно работать с Google Планета Земля, — отключить Zip64. режим, несовместимый с Google Планета Земля.

Для совместимости файлов KMZ в Google Earth и других браузерах Earth они должны быть совместимы с ZIP 2.0 с использованием «устаревших» методов сжатия (например, deflate) и не использовать расширения, такие как Zip64. Эта проблема упоминается в ошибках KML.

Вот фрагмент кода C# для создания файла KMZ:

using (FileStream fileStream = File.Create(ZipFilePath)) // Zip File Path (String Type)
{
    using (ZipOutputStream zipOutputStream = new ZipOutputStream(fileStream))
    {
        // following line must be present for KMZ file to work in Google Earth
        zipOutputStream.UseZip64 = UseZip64.Off;

        // now normally create the zip file as you normally would 
        // add root KML as first entry
        ZipEntry zipEntry = new ZipEntry("doc.kml");
        zipOutputStream.PutNextEntry(zipEntry);  
        //build you binary array from FileSystem or from memory... 
        zipOutputStream.write(/*binary array*/); 
        zipOutputStream.CloseEntry();
        // next add referenced file entries (e.g. icons, etc.)
        // ...
        //don't forget to clean your resources and finish the outputStream
        zipOutputStream.Finish();
        zipOutputStream.Close();
    }
}
person JasonM1    schedule 26.03.2014
comment
Я отключил его, но проблема остается, когда значок находится в каталоге в zip-файле. Однако, когда файлы значков не находятся в каталоге, они отображаются нормально. Не уверен, что это не работает, когда изображение находится в каталоге zip-файла, почему это не работает - person TheWommies; 31.03.2014
comment
Перед вызовом PutNextEntry() для записи значка попробуйте вручную установить размер файла для записи; например newEntry.Size = ‹длина файла значка›. - person JasonM1; 31.03.2014