当我在zip文件中重命名文件时,KMZ仅显示Icon文件

时间:2014-03-20 23:48:47

标签: icons kml kmz

我正在使用http://www.icsharpcode.net/opensource/sharpziplib/编写C#程序 压缩为zip文件的KMZ文件将包含KML文件和图标。

我的尝试:

  1. 在Google地球中打开KMZ文件后,现在会显示图标。
  2. 然后我将KMZ转换为zip文件,以便检查其内容。
  3. 我将图标重命名为其他名称,然后重命名为原始名称。
  4. 然后我将其更改回KMZ文件并在Google地球中打开,图标显示正常。
  5. 关于压缩过程中我做错了什么的任何想法会导致图标最初没有显示?

1 个答案:

答案 0 :(得分:3)

使用CSharpZipLib创建KMZ文件以正确使用Google地球的一个技巧是关闭与Google地球不兼容的Zip64模式。

要使KMZ文件在Google地球和其他地球浏览器中可互操作,它必须使用“传统”压缩方法(例如deflate)与ZIP 2.0兼容,而不使用Zip64等扩展。 KML Errata中提到了此问题。

以下是创建KMZ文件的C#代码片段:

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();
    }
}