以 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 地球中打开它。
我使用以下程序创建了一个 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 地球中打开它。