无法使用java.util.zip创建KMZ文件(Unable to create KMZ file

2019-08-01 04:24发布

所以,我在过去做了一些样品KML / KMZ文件,主要是由手,已经发现了几个矛盾与谷歌地球作为这项工作的结果。 在大多数情况下,我认为我有一个很好的手柄上有什么需要我为GE的特定版本做的。 最近,我尝试了一些自动化添加到我的KML / KMZ样本文件对其进行定制基于点和其他元数据给定的CSV某些客户端。

我想伸手去有经验者从Java创建KMZ文件自定义图标或内容。 这里是我卡在皱纹:

我创建,由专人,一堆的风格和自定义图标来更好地显示客户数据。 最近,我创建了一个Java应用程序,让我通过自动化KML / KMZ生产,以节省时间很大。 这些样式是(在其应有的位置与逃逸)从例子中直接复制到我的Java代码。 Java代码初步建成KML,然后我打包KML从我的例子中,压缩并保存为KMZ的图标文件夹中。 所有工作的罚款。

然后我说主要是基于一个代码块这个例子中 ,并加入我的所有图标作为资源的罐子。 然后,我建立了文件的.zip和验证了KML和图标文件(在适当的文件夹)都在压缩。 他们是。 所有很高兴与世界同步。

然后我改变了输出文件名.KMZ而不是.zip或试图运行在谷歌的输出。 我的自定义图标没有被加载。 该KML工作正常,点和面都没有用适当的风格色彩,但也有在中间与X的箱子,如果它不能访问的图标。

如果我重新命名输出KMZ来压缩,解压并运行KML里面,按预期工作的一切。 如果我重新压缩,并重新命名为KMZ,它再次被打破。

这里是真正的乐趣,虽然。 如果我参加了KML出KMZ的,重新包装与图标从资源文件夹从我的工作区,保存为KMZ和加载到谷歌地球,它的工作原理确定。

我觉得好像是在告诉我,我的java.util.zip代码以某种方式破坏图像到一个点,GE不知道他们做什么。 但我,为什么他们精包装的工作时完全糊涂了,但是从同一位置重新包装时,再破再。

有人有主意吗? 道歉提前为不张贴代码。 我会后我可以的,如果我们能够缩小问题的空间一点点。

这里有尽可能多的代码,我当时可以录制:

//Create new file output based on file-name of previously made KML file (fileOut)
//nameToken exists to pop KML extension off the back end of fileOut.getName()

File fileOut2 = new File(fileOut.getParent(), nameToken2[0] + ".kmz");
FileOutputStream foutstream = new FileOutputStream(fileOut2);

ZipOutputStream zout = new ZipOutputStream(foutstream);
byte[] buffer = new byte[1024];

String[] resourceFiles = {null,"/icons/b-lv.png",...}; //many files listed here
for(int i = 0; i < resourceFiles.length; i++){
    //Previously wrote kml file, time to read it in and add to zip
    if (i == 0){
        FileInputStream fin = new FileInoutStream(fileOut);
        zout.putNextEntry(new ZipEntry(fileOut.getName());
        int length;
        while ((length = fin.read(buffer)) > 0){
            zout.write(buffer,0,length);
        }
        zout.closeEntry();
        fin.close();
    }
    //Read in resource icon files and add to zip
    else{
        InputStream inStream = this.getClass().getResourceAsStream(resourceFiles[i]);
        zout.putNextEntry(new ZipEntry(resourceFiles[i]));
        int length;
        while((length = inStream.read(buffer)) > 0){
            zout.write(buffer,0,length);
        }
        zout.closeEntry();
        inStream.close();
    }
}

zout.flush();
zout.close();
foutstream.close();
fileOut.delete();  //Deletes previously made KML file

Answer 1:

下面是Java代码来创建一个使用一个样本KMZ文件ZipOutputStream与根KML文件和图像文件条目。 如果不正确地把图象输入之前关闭KML条目,则在KMZ文件可以成为腐败。

重要说明:您必须确保zip文件条目完全匹配的KML中的URL引用。 ZIP文件条目应该与“/”或“../”或启动‘C:/’。 同样地,在KML的KMZ项URL / HREF引用应该是相对的(例如图标/ B-lv.png)到特定KML文件。

减少代码在下面的示例中的线,在Apache公地IOUtils库用来输入文件复制到KMZ输出流,并关闭流。

import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.IOUtils;
import java.io.*;

public class TestKmz {

    public static void main(String[] args) throws IOException {     
        createKMZ();
        System.out.println("file out.kmz created");
    }

    public static void createKMZ()  throws IOException  {
        FileOutputStream fos = new FileOutputStream("out.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("<Placemark>");
        // add reference to image via inline style
        ps.println("  <Style><IconStyle>");
        ps.println("    <Icon><href>image.png</href></Icon>");
        ps.println("  </IconStyle></Style>");
        ps.println("</Placemark>");
        ps.println("</kml>");
        ps.flush();                 
        zoS.closeEntry(); // close KML entry

        // now add image file entry to KMZ
        FileInputStream is = null;
        try {                   
            is = new FileInputStream("image.png");
            ZipEntry zEnt = new ZipEntry("image.png");
            zoS.putNextEntry(zEnt);
            // copy image input to KMZ output
            // write contents to entry within compressed KMZ file
            IOUtils.copy(is, zoS);
        } finally {
            IOUtils.closeQuietly(is);
        }
        zoS.closeEntry();
        zoS.close();
    }   
}   


文章来源: Unable to create KMZ file using java.util.zip