以 kmz 为单位显示图像

showing image at point in kmz

我使用以下程序创建了一个 KMZ 文件,在我的 Maven 项目中,我在项目文件夹下创建了一个名为 files 的文件夹,我在文件中添加了一个名为 grn-pushpin.png 的图像文件夹。

在我创建 KMZ 的程序中,我传递了如下图像

FileInputStream  is = new FileInputStream("files/grn-pushpin.png");
ZipEntry zEnt = new ZipEntry("files/grn-pushpin.png"); 

在 KML 中显示点图像时,我给出了 ps.println("<Icon><href>files/grn-pushpin.png</href></Icon>"); 现在显示的是图像,但似乎只显示本地文件夹中的图像。

如何确定图像来自 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>files/grn-pushpin.png</href></Icon>");
        ps.println("  </IconStyle></Style>");
        ps.println(" <Point><coordinates>72.877460,19.144808</coordinates></Point> ");
        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("files/grn-pushpin.png");
            ZipEntry zEnt = new ZipEntry("files/grn-pushpin.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();
    }   
}   

我已经删除了以下代码行,但我仍然能够看到图像,这意味着它只是从文件夹中加载,而不是从 KMZ 文件中读取

 is = new FileInputStream("files/grn-pushpin.png");
 ZipEntry zEnt = new ZipEntry("files/grn-pushpin.png");

Google Earth Pro (GEP) 首先在 KMZ 文件中查找引用为相对 URI(例如 files/grn-pushpin.png)的文件,并在可用时使用它。

如果在 KMZ 文件中找不到图像引用作为条目,则 GEP 将使用相同的路径在相对于 KMZ 文件的本地文件系统中查找这些文件,因此如果找到 kmz 文件 out.kmz在 C:/path/data/ 中然后它会在 C:/path/data/files/grn-pushpin.png.

中查找与该文件夹相关的图像

要验证正在加载 KMZ 内的引用文件,请将 out.kmz 文件移动到其他文件夹(例如桌面)并在 Google 地球中打开它。