KML 2.1教程

本教程旨在让您熟悉KML 2.1中的精彩新功能。如果您想要进行快速游览,可以点击相关链接开始查看 Google 地球中的示例。要了解有关 KML 新元素的更多详情,请进一步阅读文本并研究数据,以了解这些地图项是如何为 Google 地球的这一新版本增添灵活性和强大功能的。我们非常希望看到您用这些工具创建的创新演示和游览。

有关此处讨论的元素的详情,请参见KML 2.1参考KML 2.1架构。

KML 2.1的突出功能

  • 区域 - 区域提供的剔除和细节级别行为让您可以微调您的数据在 Google 地球中的显示方式。当与 NetworkLink 一起使用时,区域会启用大型数据集流式技术,以多个分辨率级别对数据进行“智能”加载(参见超级叠加层部分)。您还可以使用区域模拟 Google 地球的图层。
  • 纹理化3D模型 - 3D对象可在各自的坐标空间中自动建模并导出为 COLLADA™ 文件,然后导入到 Google 地球中并置于地球表面。
  • 逐步更新 - 现在,您可以逐步更新 NetworkLink 所加载的数据:更改、添加并删除之前加载到 Google 地球中的 KML 数据。
  • 到期日期/时间 - 您可以指定要刷新数据的 dateTime,以便刷新缓存并保留当前数据。
  • 单选按钮文件夹 - 要让用户一次只能选择文件夹中的一个项,请使用新的 ListStyle 元素指定 radioFolder。

精彩示例

查看规范!

下面是KML 2.1中为您介绍的一些主要新元素:

使用区域

区域是一个强大的新 KML 地图项,可让您向 Google 地球添加大型数据集,而不会降低其性能。只有当数据位于用户视图内且占用一定的屏幕部分时,区域才会加载并绘制该数据。通过区域,您可以为数据提供单独的细节级别,但只有当数据占用了足够显示细节的屏幕部分时,才会加载微妙的细节。

请注意:在 KML 中,某些类派生自“父”类。派生的“子”类继承其父类的所有元素,并添加了自己的某些特有元素(这是面向对象的系统所常用的技术)。为方便起见,本部分只介绍父类,没有列出所有派生的子类。例如:

  • 术语 Feature 指派生自 Feaure 的任何 KML 元素:Document、Folder、GroundOverlay、NetworkLink、Placemark 和 ScreenOverlay。
  • Geometry 指 KML 中的任何几何元素:Point、Polygon、LinearRing、LineString、Model 和 MultiGeometry。
  • Overlay 指派生自 Overlay 的元素:GroundOverlay 和 Screen Overlay。

有关显示 KML 元素内继承关系的图表,请参见 KML 参考

重要概念

任何地图项都可以包含区域。区域会影响地标几何图形或叠加层图片的可见性。区域可定义受影响的几何图形或叠加层的剔除和细节级别行为。区域通过 KML 层次结构而继承,并影响在层次结构中较低层定义的地图项的可见性。

本部分介绍了下面这些理解区域所必须掌握的重要概念:

边框

区域具有可定义数据边框的 <LatLonAltBox>。边框是包括一组对象或数据点的范围。与 GroundOverlay 中的 <LatLonBox> 类似,区域中的 <LatLonAltBox> 包含东、西、南、北边界。如果区域包含的数据为3D或2D海拔,那么该区域的 <LatLonAltBox> 还需要包含最低海拔 <minAltitude> 和最高海拔 <maxAltitude>。

当 (1) 区域出现在视图中 (2) <LatLonAltBox> 的投影屏幕大小位于该区域指定的像素范围内(如细节级别 (LOD) 中所述)时,才会绘制与此边框关联的对象。同时满足以上两个条件时,区域即视为“活动的”。

细节级别 (LOD)

与区域关联的次要概念是细节级别,简称 LOD。由于计算机屏幕的空间有限,因此最有效的方法就是设置区域,从而只在像素足以充分显示数据时才加载大量数据。当区域占用相当小的一部分屏幕(可能因为用户正在从远处查看,或从倾斜角度查看平面区域)时,LOD 机制可让您(KML 编写者)指定低分辨率的数据集来替代全分辨率数据。此低分辨率数据集的加载速度更快,但由于它还是占用了一小部分屏幕,因此用户可能无法辨别其差异。

在区域中,<minLodPixels> 和 <maxLodPixels> 元素可让您指定屏幕的区域(以方形像素为单位)。当数据投影到屏幕上时,所占用的屏幕区域必须大于 <minLodPixels> 且小于 <maxLodPixels>,数据才可显示。区域的投影大小超出这些限制后,投影将不再可见,区域会变为非激活状态。

在特殊情况下,当您希望数据激活到无限大时,可以为 <maxLodPixels> 指定−1(默认值)。

示例1:地面叠加层的区域

首先,让我们看看在地面为2D叠加层构建区域的简单示例。此示例使用包含历史数据的地面叠加层,显示了1991年加利福尼亚州山景城的一部分。当用户放大该区域时,就会看到叠加层。下面是叠加层首次显示时的外观(示例文件还包含可让叠加层更加明显的白色 LineString):

Screen shot showing black and white overlay coming into view

在此示例中,<minLodPixels> 为128,表示当 GroundOverlay 占用屏幕上128个方形像素时开始显示(此示例对 <maxLodPixels> 使用默认值-1,这表示当用户在此角度放大时,GroundOverlay 仍然可见)。用于该叠加层的图片是256个方形像素的正方形。

下面是用户放大后所显示的图片:

此处是因为占用的屏幕空间小于 <minLodPixels> 值而变得不可见之前显示的倾斜图片:

此数据的 <LatLonAltBox> 不需要包含 <minAltitude> 和 <maxAltitude> 元素,因为该数据是地面的扁平数据。该区域的 <LatLonAltBox> 中的数据边框等同于地面叠加层的 <LatLonBox> 的边界,如以下 KML 文件所示:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>Flat Region</name>
<Region>
<LatLonAltBox>
<north>37.430419921875</north>
<south>37.41943359375</south>
<east>-122.080078125</east>
<west>-122.091064453125</west>
</LatLonAltBox>
<Lod>
<minLodPixels>128</minLodPixels>
</Lod>
</Region>
<GroundOverlay>
<name>Mountain View DOQQ</name>
<Icon>
<href>files/image.JPEG</href>
</Icon>
<LatLonBox>
<north>37.430419921875</north>
<south>37.41943359375</south>
<east>-122.080078125</east>
<west>-122.091064453125</west>
</LatLonBox>
</GroundOverlay> <Document> </kml>

另请注意,在 KML 文件中,该区域类似于可见性受其影响的图片(或几何图形)。

如果您有时间检查该 KML 文件,请点击以下链接将叠加层加载到 Google 地球。然后,根据区域要求的屏幕区域大小,尝试不同的视点,并查看该区域何时出现和消失。请注意,如果您将视图倾斜得足够远或者将视图缩小到非常小,该叠加层就会消失,因为它占用的屏幕空间太小而无法符合 <minLodPixels> 要求。

Google 地球中的视图示例 (historicOverlay.kmz)

海拔

示例2:3D模型的区域

以下示例显示如何在地面构建一个包含3D对象的区域。该区域的 <LatLonAltBox> 包含一个300米的 <maxAltitude>,该元素为建筑的高度。您很可能会将这些建筑视为纽约城里的联合国复合建筑。

请注意,该区域的 <LatLonAltBox> 的边界不必与模型的经纬度完全匹配,这点很重要。模型的坐标是相对于其本地原点而言的,可能与地球上模型的实际位置存在偏移。

<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>3D Region on ground</name>
<Placemark>
<name>United Nations Headquarters</name>
<visibility>0</visibility>
<Region>
<Lod>
<minLodPixels>128</minLodPixels>
</Lod>
<LatLonAltBox>
<north>40.750683130314</north>
<south>40.748162385230</south>
<east>-73.966608428427</east>
<west>-73.969476624071</west>
<minAltitude>0</minAltitude>
<maxAltitude>300</maxAltitude>
<altitudeMode>absolute</altitudeMode>
</LatLonAltBox>
</Region>
<Model>
<altitudeMode>absolute</altitudeMode>
<Location>
<longitude>-73.967763927199</longitude>
<latitude>40.749458312255</latitude>
<altitude>0.406173708576</altitude>
</Location>
<Link>
<href>models/un.dae</href>
</Link>
</Model>
</Placemark>
</Document>
</kml>

点击以下链接将文件加载到 Google 地球。再次尝试不同的视点,查看建筑何时可见,何时从视图中消失。

Google 地球中的视图示例 (unitedNations.kmz)

示例3:指定海拔的2D叠加层的区域

此示例显示如何添加要在地球表面上以指定海拔显示的2D叠加层。此技术对于显示锋面和空中交通方式的数据很有用。以下示例显示了海拔为100,000米(以海平面为基准)的一小片云层。

该区域的 <LatLonAltBox> 为 <minAltitude> 和 <maxAltitude> 元素均指定100,000米的值(由于叠加层是没有厚度的2D图片,因此两个元素的值是相同的)。<altitudeMode> 为 absolute,表示该值是相对于海平面的。

请注意,GroundOverlay 的 <altitude> 值也是100,000(也就是说,它与该区域的边框的高度值匹配),GroundOverlay 的 <altitudeMode> 与该区域的 <altitudeMode> 的指定值匹配。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>Flat Region at altitude</name>
<GroundOverlay>
<name>Cloud overlay</name>
<Region>
<LatLonAltBox>
<north>33.75</north>
<south>22.5</south>
<east>-45</east>
<west>-56.25</west>
<minAltitude>100000</minAltitude>
<maxAltitude>100000</maxAltitude>
<altitudeMode>absolute</altitudeMode>
</LatLonAltBox>
<Lod>
<minLodPixels>128</minLodPixels>
</Lod>
</Region>
<Icon>
<href>files/image.PNG</href>
</Icon>
<altitude>100000</altitude>
<altitudeMode>absolute</altitudeMode>
<LatLonBox>
<north>33.75</north>
<south>22.5</south>
<east>-45</east>
<west>-56.25</west>
</LatLonBox>
</GroundOverlay>
</Document>
</kml>

Google 地球中的视图示例 (cloudRegion.kmz)

淡变范围

您还可以为区域指定淡变范围,从而允许对象逐渐从透明过渡到不透明以及反向过渡。Google 地球使用“maxFadeExtent”来确定区域处于最大可见度时从完全透明到完全不透明的梯度,使用“minFadeExtent”来确定区域处于最小可见度时的淡出梯度。淡变范围是可选的,但它们可阻止不同分辨率的 LineString 或多边形之间的“弹出”效果。淡变对性能的影响较大,因此不应与图像一起使用。

请注意:淡变范围可用于除地标图标之外的所有对象。当淡变范围大于0.5时才绘制这些图标。

 

以下示例说明淡变范围是如何影响 LineString 的。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>Region in Placemark LineString</name>
<description>
The LineString corners mark the extent
of the Region LatLonAltBox.
The LineString minFadeExtent (at greatest range)
is 1/4 of the maxFadeExtent (at closest range)..
</description>
<Placemark>
<name>Region LineString</name>
<LineString>
<coordinates>
22,50,0
28,50,0
28,45,0
22,45,0
22,50,0
</coordinates>
</LineString>
<Region>
<LatLonAltBox>
<north>50</north>
<south>45</south>
<east>28</east>
<west>22</west>
</LatLonAltBox>
<Lod>
<minLodPixels>128</minLodPixels>
<maxLodPixels>1024</maxLodPixels>
<minFadeExtent>128</minFadeExtent>
<maxFadeExtent>512</maxFadeExtent>
</Lod>
</Region>
</Placemark>
</Document>
</kml>

Google 地球中的视图示例 (fadeLineString.kml)

嵌套区域

嵌套区域是区域功能的常用手法,较大的区域使用较粗略的分辨率关联,而较小的内部区域则使用精细度递增的细节级别关联。下图中,每个区域都有一组 LOD 限制,可指定激活关联区域所需的区域投影屏幕大小(以像素为单位)。随着用户视点的逐渐移近,精细度较高的细节级别 (LOD) 的区域会激活,因为此类区域占用的屏幕空间更多。精细度较高的 LOD 的区域会替换之前加载的精细度较低的 LOD 的区域。

随着嵌套区域不断激活,它们可以

  • 收集与每个区域(如以下超级叠加层示例所述)关联的数据
  • 用新数据替换以前加载的区域数据(如上图所示)

子区域中的 <LatLonAltBox> 应完全包含在其父区域的 <LatLonAltBox> 中。区域通过 Folder 和 NetworkLink 层次结构继承。本地定义的区域优先于 Folder 层次结构中定义更高的区域。以下示例说明本地区域范围如何覆盖层次结构中定义更高的区域。在此示例中,地标“ukraineRegion”继承其父文档的区域。文件夹“romaniaFolder”指定自己的区域,供地标“romaniaRegion”使用。有关如何在 NetworkLink 内最高效使用区域的更多示例,请参见下个部分“智能”加载基于区域的网络链接

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>Nested Regions</name> <Region> <LatLonAltBox> <north>56.25</north> <south>45</south> <east>33.75</east> <west>22.5</west> </LatLonAltBox> <Lod> <minLodPixels>128</minLodPixels> <maxLodPixels>1024</maxLodPixels> </Lod> </Region> <Placemark> <name>ukraineRegion</name> <LineString> <tessellate>1</tessellate> <coordinates> 22.5,45,0 33.75,45,0 33.75,56.25,0 22.5,56.25,0 22.5,45,0 </coordinates> </LineString> </Placemark> <Folder> <name>romaniaFolder</name> <Region> <LatLonAltBox> <north>50.625</north> <south>45</south> <east>28.125</east> <west>22.5</west> </LatLonAltBox> <Lod> <minLodPixels>128</minLodPixels> <maxLodPixels>1024</maxLodPixels> </Lod> </Region> <Placemark> <name>romaniaRegion</name> <LineString> <tessellate>1</tessellate> <coordinates> 22.5,45,0 28.125,45,0 28.125,50.625,0 22.5,50.625,0 22.5,45,0 </coordinates> </LineString> </Placemark> </Folder> </Document> </kml>

“智能”加载基于区域的网络链接

前面示例中显示的基于区域的 NetworkLink 是在 Google 地球中发布大型数据集的最有效方式。将区域与 NetworkLink 结合使用,您就可以创建指针层次结构,每个指针指向一个特定子区域。<viewRefreshMode>(如以下 KML 文件所示)有一个 onRegion 选项,用于指定只在区域激活时才加载区域数据。如果您提供了具有多个细节级别的嵌套区域,那么只有当用户视点触发下一次加载时,才会加载数量更大的数据。下面的超级叠加层部分提供了详细示例。

第1部分:父文件

要运行此示例,请和往常一样保存第一部分。然后,将第二部分另存为“romaniaRegion.kml”,以便 NetworkLink 可以在区域激活时加载该区域。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>Nested Regions</name> <Region> <LatLonAltBox> <north>56.25</north> <south>45</south> <east>33.75</east> <west>22.5</west> </LatLonAltBox> <Lod> <minLodPixels>128</minLodPixels> <maxLodPixels>1024</maxLodPixels> </Lod> </Region> <Placemark> <name>ukraineRegion</name> <LineString> <tessellate>1</tessellate> <coordinates> 22.5,45,0 33.75,45,0 33.75,56.25,0 22.5,56.25,0 22.5,45,0 </coordinates> </LineString> </Placemark> <NetworkLink> <name>romania NetworkLink</name> <Region> <LatLonAltBox> <north>50.625</north> <south>45</south> <east>28.125</east> <west>22.5</west> </LatLonAltBox> <Lod> <minLodPixels>128</minLodPixels> <maxLodPixels>1024</maxLodPixels> </Lod> </Region> <Link> <href>romaniaRegion.kml</href> <viewRefreshMode>onRegion</viewRefreshMode> </Link> </NetworkLink> </Document> </kml>
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>romania Document</name>
<Region>
<LatLonAltBox> <north>50.625</north> <south>45</south> <east>28.125</east> <west>22.5</west> </LatLonAltBox>
<Lod> <minLodPixels>128</minLodPixels> <maxLodPixels>1024</maxLodPixels> </Lod>
</Region> <Placemark> <name>romaniaRegion</name> <LineString> <tessellate>1</tessellate> <coordinates> 22.5,45,0
28.125,45,0 28.125,50.625,0 22.5,50.625,0 22.5,45,0 </coordinates> </LineString> </Placemark>
</Document>
</kml>

超级叠加层

:我如何与全世界分享一张47MB的图片?
:一次分享一部分。

:如果每个人都试图这样做将会怎样?
:如果您使用的是基于区域的 NetworkLink,并像本教程中描述的那样为图像提供了多个细节级别,那么就没问题!

本部分介绍了如何创建“超级叠加层”- 可用来高效服务于大型图像集的区域和 NetworkLink 的层次结构。当图像区域的各部分逐渐可见时,加载分辨率适当的平铺图片;当视点移近时,加载分辨率较高的平铺图片。试图在1024*768的屏幕上显示7008*6720像素的图片几乎是白费力气。而且,如果用户位于地球表面上方几英里的地方,那么所有数据均可能被挤压到少量像素中,这样效果极差。超级叠加层(例如显示加利福尼亚州山景城1991 DOQQ的示例)可让您利用 NetworkLink 及其功能来确定 (1) 给定区域是否在视图中 (2) 投影大小是否适合当前视点。如果区域为“活动的”(两个条件都符合),那么 NetworkLink 会加载该区域的相关数据。如果区域不是活动的,则不加载数据。如果将原始图片细分为细节级别递增的层次结构图片,Google 地球就可加载最适合当前视图的图像。

要查看如何使用该图片层次结构,请将此示例文件加载到 Google 地球中,并在相关区域上通过放大和缩小来进行尝试:山景城历史 DOQQ

 

使用基于区域的网络链接高效加载大型数据集的示例。原始图片为7008*6720像素。此处显示的斜视图只加载五个小的平铺图片来表示该图片(已添加白色 linestring 来突出平铺图片边界)。该应用显示了代表山景城的历史图像 (1991 DOQQ)。

为超级叠加层准备数据

在该超级叠加层示例中,原始山景图片细分为上百个小的 GroundOverlay。这些叠加层或平铺图片分布在五层的层次结构中。出于示范目的,此处的讨论使用简单的三层层次结构和一组21个叠加层,但相关原则保持不变。请注意,这只是创建基于区域的网络链接层次结构的一种方法,还有其他方法可以实现此机制。

要创建超级叠加层,您需要执行以下操作:

  1. 准备图像,将其细分为可管理的块(推荐使用256*256像素的图像),并
  2. 创建设置区域、链接、网络链接以及此示例中包含 GroundOverlay 的文件的 KML 文件。

准备图像

为平铺图片(具有不同分辨率的细分图片)选择一个标准尺寸,Google 地球会在其相关区域激活时加载这些图片。出于示范目的,我们将对平铺图片使用256*256像素,这是可管理的最小像素。

  1. 从具有完整分辨率的原始图片开始。将该图片细分为 n 张平铺图片,然后将其中每张平铺图片再细分为 n 张平铺图片。
    继续细分直到获得给定大小(在我们的示例中,为256*256像素)的平铺图片。

    让我们假定原始图片为1024*1024像素。
    当我们细分图片时,将产生以下层次结构。
  2.  

     

  3. 将该层次结构中的每张平铺图片重新采样为您选择的标准大小(例如256*256像素)。
    这些重新采样的平铺图片的细节级别更低,但与在更远处视点激活的区域相关联,
    因此用户感觉不到细节方面的损失。

 


下表显示了视点和嵌套区域的定义是如何确定实际加载哪些平铺图片的。同时,为此大型图像示例提供了三个细节级别。当用户从最远处观看该区域时,Google 地球会显示缩略图视图。此视图覆在整个 LatLonAltBox 上(但由于投影很小 - 256个方形像素,因此实际上视觉信息不会有所损失)。当用户放大该场景时,该区域被细分为四个区域。这四张“平铺图片”中,每张平铺图片的大小都与缩略图图片相同,但提供的图像更加详细。

如果用户继续放大该区域,那么是否会显示完整分辨率图像部分,取决于用户与图像的距离。远处的区域保持最初加载的细节级别较低的图像。山景城 DOQQ 示例中,启用“框”并检查地标 AB,这些地标在区域周围使用 LineString 并一次显示层次结构的多个层。

请注意,该示例对所有区域的 minLodPixel 和 maxLodPixel 使用相同值(在层次结构的所有层)。LatLonAltBox 决定应该加载层次结构中的哪一层和区域内的哪些平铺图片。

准备 KML 文件

为每张图片准备一个 KML 文件,将地面叠加层与区域和 NetworkLink 关联起来。本组的每个 KML 文件都具有以下元素:

  • 区域(包含 LatLonAltBox、minLodPixel 和 maxLodPixel,以便 Google 地球可以确定该区域是否在任何给定时间都是活动的)
  • 链接到子文件(层次结构的下一层中的平铺图片)的一组 NetworkLink
  • 该区域的地面叠加层

此示例显示山景城 DOQQ 示例的最高层 KML 文件。对于 maxLodPixel,它会指定-1,这具有“激活到无限大”的特殊含义。如果不指定此值,整个层次结构可能永远无法触发。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<NetworkLink>
<name>SuperOverlay: MV DOQQ</name>
<Region>
<LatLonAltBox>
<north>37.44140625</north>
<south>37.265625</south>
<east>-121.9921875</east>
<west>-122.16796875</west>
</LatLonAltBox>
<Lod>
<minLodPixels>128</minLodPixels>
<maxLodPixels>-1</maxLodPixels>
</Lod>
</Region>
<Link>
<href>http://mw1.google.com/mw-earth-vectordb/kml-samples/mv-070501/1.kml</href>
<viewRefreshMode>onRegion</viewRefreshMode>
</Link>
</NetworkLink>
</kml>

以下文件显示山景城 DOQQ 示例 (179.kml) 中的区域。此文件包含五个 href 标签:四个指向图片层次结构下一层中的四个 KML 文件,一个指向此平铺图片的 GroundOverlay 所用的图片文件。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<Region>
<Lod>
<minLodPixels>128</minLodPixels><maxLodPixels>-1</maxLodPixels>
</Lod>
<LatLonAltBox>
<north>37.430419921875</north><south>37.41943359375</south>
<east>-122.091064453125</east><west>-122.10205078125</west>
</LatLonAltBox>
</Region>
<NetworkLink>
<name>001120</name>
<Region>
<Lod>
<minLodPixels>128</minLodPixels><maxLodPixels>-1</maxLodPixels>
</Lod>
<LatLonAltBox>
<north>37.430419921875</north><south>37.4249267578125</south>
<east>-122.0965576171875</east><west>-122.10205078125</west>
</LatLonAltBox>
</Region>
<Link>
<href>180.kml</href>
<viewRefreshMode>onRegion</viewRefreshMode>
</Link>
</NetworkLink>
<NetworkLink>
<name>001121</name>
<Region>
<Lod>
<minLodPixels>128</minLodPixels><maxLodPixels>-1</maxLodPixels>
</Lod>
<LatLonAltBox>
<north>37.430419921875</north><south>37.4249267578125</south>
<east>-122.091064453125</east><west>-122.0965576171875</west>
</LatLonAltBox>
</Region>
<Link>
<href>185.kml</href>
<viewRefreshMode>onRegion</viewRefreshMode>
</Link>
</NetworkLink>
<NetworkLink>
<name>001122</name>
<Region>
<Lod>
<minLodPixels>128</minLodPixels><maxLodPixels>-1</maxLodPixels>
</Lod>
<LatLonAltBox>
<north>37.4249267578125</north><south>37.41943359375</south>
<east>-122.0965576171875</east><west>-122.10205078125</west>
</LatLonAltBox>
</Region>
<Link>
<href>190.kml</href>
<viewRefreshMode>onRegion</viewRefreshMode>
</Link>
</NetworkLink>
<NetworkLink>
<name>001123</name>
<Region>
<Lod>
<minLodPixels>128</minLodPixels><maxLodPixels>-1</maxLodPixels>
</Lod>
<LatLonAltBox>
<north>37.4249267578125</north><south>37.41943359375</south>
<east>-122.091064453125</east><west>-122.0965576171875</west>
</LatLonAltBox>
</Region>
<Link>
<href>195.kml</href>
<viewRefreshMode>onRegion</viewRefreshMode>
</Link>
</NetworkLink>
<GroundOverlay>
<drawOrder>5</drawOrder>
<Icon>
<href>179.JPEG</href>
</Icon>
<LatLonBox>
<north>37.430419921875</north><south>37.41943359375</south>
<east>-122.091064453125</east><west>-122.10205078125</west>
</LatLonBox>
</GroundOverlay>
</Document>
</kml>

显示3D对象

在KML 2.1中,您可以用 collada 转换文件格式导入3D模型,例如建筑、桥梁、纪念碑和雕塑。模型要通过 SketchUp、3D Studio Max、Softimage XSI 或 Maya 等应用在其各自的坐标空间中进行定义,与 Google 地球无关。3D模型导入到 Google 地球后,模型会进行转换、旋转和缩放,以符合地球坐标系。已加载到 Google 地球中的模型可以使用 <Update> 元素(KML 2.1中另一个新地图项)进行重新定位和重新调整大小。

模型示例

模型在 Google 地球中的使用方式就像其他任何几何对象(点、LineString 或多边形)一样。下面是导入纹理模型的 KML 文件的简单示例。

对该模型的 <Link> 引用可以是绝对或相对的文件指定/网址。

要查看该模型,请加载文件 MackyBldg.kmz,该文件是包含所有必需纹理文件和叠加层文件以及此“doc.kml”文件(包含该模型)的归档:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Placemark>
<name>SketchUp Model of Macky Auditorium</name>
<description>University of Colorado, Boulder; model created by Noël Nemcik.</description> <LookAt>
<longitude>-105.2727379358738</longitude>
<latitude>40.01000594412381</latitude>
<altitude>0</altitude>
<range>127.2393107680517</range>
<tilt>65.74454495876547</tilt>
<heading>-27.70337734057933</heading> </LookAt> <Model id="model_4">
<altitudeMode>relativeToGround</altitudeMode>
<Location>
<longitude>-105.272774533734</longitude>
<latitude>40.009993372683</latitude>
<altitude>0</altitude>
</Location>
<Orientation>
<heading>0</heading>
<tilt>0</tilt>
<roll>0</roll>
</Orientation>
<Scale>
<x>1</x>
<y>1</y>
<z>1</z>
</Scale>
<Link>
<href>files/CU Macky.dae</href>
</Link>
</Model>
</Placemark>
</kml>

该模型通过位置元素的纬度、经度和海拔规范进行地理位置定位。该示例对方向和比例元素使用默认值,此处包含这些值以便使模型更加完整。

方向元素指定模型绕 x(倾斜)、y(滚动)和 z(方位)轴旋转。y 轴指向北且与经度线平行,x 轴指向东且与纬度线平行。旋转值用度数指定,下图显示的是正向旋转。

创建 .kmz 归档

KMZ 归档是用于创建单个 KML 演示的文件集。此归档包含 .kml 文件中所引用的所有本地文件,例如图片、纹理和模型。KMZ 归档是一个独立的文件包,不需要托管到网络服务器上,因此您可以轻松地通过电子邮件发送该文件,并可以将其储存为一个独立单元。Google 地球可以直接读取 .kml 和 .kmz 文件。

该 doc.kml 文件及其引用的本地文件都压缩到一个采用 ZIP 文件格式的归档中。很多应用都可以生成此格式。Windows 系统上的 WinZip、Macintosh 系统上的 Stuffit 以及 Linux 或 Macintosh 系统上的 ZIP 都是可以读写 ZIP 格式的常用应用。您还可以使用 Windows Explorer 或 Mac Finder 直接处理 ZIP 归档。

创建 .zip 文件后,将文件扩展名更改为 .kmz。

包含此 Macky 建筑的完整纹理模型的 KMZ 归档包含以下文件:

  • doc.kml - 上述 KML 文件,可导入 collada (.dae) 模型并将其放置在 Google 地球中。将此文件放在 KMZ (ZIP) 文件的根目录下。
  • textures.txt - 用于将模型文件(此处指 CU Macky.dae)中的纹理路径重新映射到 KMZ 文件中的路径。将此文件放在 KMZ (ZIP) 文件的根目录下。CU Macky .dae 中引用的每个纹理都有一行采用 textures.txt 格式:
<kmz_file_path> <COLLADA_file_path> [<KML_ID_of_model>]

<kmz_file_path> 是 KMZ 归档内指向纹理所在位置的相对路径。此路径是相对于 CU Macky.dae 而言的,该文件位于 KMZ 归档的 files/ 目录中。由于纹理存储在 files/ 目录中,因此 <kmz_file_path> 应以 ../files/ 开头。

<COLLADA_file_path> 是纹理文件显示在 CU Macky.dae 中时的名称。

[KML_ID] 是使用此纹理的模型的 KML ID。纹理可用于多个模型。此参数为可选项。

以下各行摘录于示例的 textures.txt 文件:

<../files/CU-Macky---Center-StairsnoCulling.jpg> <CU-Macky---Center-StairsnoCulling.jpg> <model_4>
<../files/CU-Macky-4sideturretnoCulling.jpg> <CU-Macky-4sideturretnoCulling.jpg> <model_4>
<../files/CU-Macky-Back-NorthnoCulling.jpg> <CU-Macky-Back-NorthnoCulling.jpg> <model_4>
  • files/ 目录 - 包含用于定义模型的几何图形、纹理和材料的 collada 文件。在 Macky 建筑示例中,此目录包含 collada 文件 (CU Macky.dae) 以及包含 JPEG 图片的大量文件,这些图片用来设置建筑的纹理(CU-Macky-BrickwallnoCulling.jpg、CU-Macky--Center-StairsnoCulling.jpg、CU_Macky-EastdetaildoornoCulling.jpg 等)。

该示例说明了在 KMZ 归档中整理文件结构的一种方法。实际上,您可以按您认为符合逻辑的任何结构整理这些文件,就像将文件整理到计算机上的文件夹或目录中一样。例如,将所有图片都整理到 images/ 目录中可能就会十分有用。相对引用(例如用于 NetworkLink、Link、Overlay/Icon 和 Model 中的 <href> 元素中所引用的文件)是相对于 doc.kml 文件指定的。如果包含一个 Images 目录,那么图片的 <href> 规范可能是:images/myBrickTexture.jpg、images/myMountainOverlay.png 等。

更新通过网络链接加载的数据

要逐步修改通过 NetworkLink 加载的数据,请使用 Update 元素,该元素是 NetworkLinkControl 的子元素。Update 可以包含按顺序处理的任意数量的 Change、Create 和 Delete 元素。

下图说明了事件的顺序。

  1. 一个 NetworkLink 将“原始”KML 文件加载到 Google 地球中。之后要更新的元素需要包含首次指定时明确定义的 ID。该 ID 在给定文件中必须是唯一的。
  2. 另一个 NetworkLink 加载第二个 KML 文件,该文件包含对已加载的 KML 对象的更新(更改、创建和删除的任何组合操作)。此更新文件包含标识原始 KML 数据的两个引用:
  3. 为了能够在 Google 地球中查找对象,Update 元素会使用 targetHref 元素来标识定义了要修改的对象的原始文件。而为了标识要修改的对象或新对象的容器,Change、Create 和 Delete 元素会包含用于引用这些对象 ID 的 targetId 属性。

更改示例

以下示例显示了一组 NetworkLink 示例和 KML 数据文件。要运行该示例,请执行以下操作:

  1. Point-load.kml 文件加载到 Google 地球中。该文件包含可加载原始数据文件的 NetworkLink,此 NetworkLink 包含两个点 (Point.kml)。
  2. Update-load.kml 文件加载到 Google 地球中。该文件包含第二个 NetworkLink,此 NetworkLink 可加载包含更新数据(point123的新名称)的文件。

第一个文件包含可加载数据文件的 NetworkLink,它包含两个点。包含这两点的地标拥有指定的 ID。第三个文件包含另一个可添加更新文件的 NetworkLink。Change 元素可修改point123的地标名称。

下面是本示例中使用的四个文件。首先是 Point-load.kml 文件,该文件包含可加载原始数据文件 (Point.kml) 的 NetworkLink。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<NetworkLink>
<name>Loads Point.kml</name>
<Link>
<href>http://developers.google.com/kml/documentation/Point.kml</href>
</Link>
</NetworkLink>
</kml>

以下是包含原始数据(两个点)的 Point.kml 文件。其中 ID 为“point123”的点是我们要修改的点。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<Placemark id="pm123">
<name>point123</name>
<Point> <coordinates>-95.44,40.42,0</coordinates> </Point>
</Placemark> <Placemark id="pm456"> <name>point456</name>
<Point> <coordinates>-95.43,40.42,0</coordinates>
</Point>
</Placemark>
</Document>
</kml>

接下来是第二个 NetworkLink 文件 (Update-load.kml)。该文件可加载包含更新信息的文件。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<NetworkLink>
<name>Update</name>
<Link>
<href>http://developers.google.com/kml/documentation/NetworkLinkControl-Update.kml</href></Link> </NetworkLink>
</kml>

最后是包含更新信息的 KML 文件 (NetworkLinkControl-Update.kml):

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<NetworkLinkControl>
<Update>
<targetHref>http://developers.google.com/kml/documentation/Point.kml</targetHref>
<Change>
<Placemark targetId="pm123"> <name>Name changed by Update Change</name>
<!-- coordinates remain the same -->
</Placemark>
</Change> </Update>
</NetworkLinkControl>
</kml>

到期

默认情况下,数据只通过链接加载到 Google 地球中一次。为避免 KML 数据过时,您可以针对由 <href> 元素(在 Link 或 Icon 元素中)加载的任何数据将 refreshMode 指定为 onExpire。默认情况下,HTTP 到期标头会指定到期时间。现在,您还可以在 KML 的 NetworkLinkControl 中指定到期时间。该时间以 XML dateTime 形式表示(参见 XML 架构第二部分:数据类型第二版)。如果同时指定了 HTTP 标头和 KML 到期时间,则 KML 到期时间的优先级更高。

示例1:使用 HTTP 服务器到期时间示例

该示例仅用于演示。其中显示了带有图标的 GroundOverlay,该图标会将 refreshMode 设置为 onExpire。鉴于未设置 KML 到期时间,该示例会使用 HTTP 服务器到期时间。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>refreshMode onExpire</name>
<Snippet maxLines="10">
Image automatically reloads according to http
server expiration.
</Snippet>
<GroundOverlay>
<Icon>
<href>http://www.someserver.com/image.jpeg</href>
<refreshMode>onExpire</refreshMode>
</Icon>
<LatLonBox>
<!-- from edit session in earth -->
<!-- The roof of a building in the Presidio -->
<north>37.80385180177469</north>
<east>-122.4558710620651</east>
<south>37.80337403503347</south>
<west>-122.4564295653771</west>
</LatLonBox>
</GroundOverlay>
</Document>
</kml>

示例2:使用 KML 到期时间示例

以下示例中,地标投放于随机选择的坐标中。该示例包含一个 refreshMode 为 onExpire 的 Link。在这种情况下,到期日期/时间是通过新的 KML <expires> 元素指定的(在 Python 脚本中)。该 KML 到期时间优先于 HTTP 标头中可能已指定的任何时间。

以下 KML NetworkLink 包含具有 <href> 和 <refreshMode> 元素的 Link:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<NetworkLink>
<Link>
<href>http://dev.someserver.com/cgi-bin/expires.py</href>
<refreshMode>onExpire</refreshMode>
</Link>
</NetworkLink>
</Document>
</kml>

以下 Python 脚本将到期时间设置为 [现在 + 11秒],并刷新地标的坐标:

#!/usr/bin/python

import random
import time
lat = random.random() * 180. - 90.
lon = random.random() * 360. - 180.
now = time.time()
future = time.gmtime(now + 11)
y = future[0]
mo = future[1]
d = future[2]
h = future[3]
mi = future[4]
s = future[5]
iso8601 = '%04d-%02d-%02dT%02d:%02d:%02dZ' % (y,mo,d,h,mi,s)
print 'Content-type: application/vnd.google-earth.kml+xml'
print
print '<?xml version=\"1.0\" encoding=\"UTF-8\"?>'
print '<kml xmlns=\"http://earth.google.com/kml/2.1\">'
# must be child of <kml>
print '<NetworkLinkControl>'
print '<expires>%s</expires>' % iso8601
print '</NetworkLinkControl>'
print '<Placemark>'
print '<name>placemark expires %s</name>' % iso8601
print '<Point>'
print '<coordinates>%f,%f,0</coordinates>' % (lon,lat)
print '</Point>'
print '</Placemark>'
print '</kml>'

单选样式项文件夹

您现在可以通过使用 ListStyle 元素并将 listItemType 指定为 radioFolder,来创建单选样式项文件夹。以下示例说明了这种新列表样式元素的用法。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>ListStyle radiofolder</name>
<Folder>
<name>radioFolder Folder</name>
<Style>
<ListStyle>
<listItemType>radioFolder</listItemType>
</ListStyle>
</Style>
<Placemark>
<name>north</name>
<Point>
<coordinates>-114,41.79,0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>south</name>
<Point>
<coordinates>-114,41.78,0</coordinates>
</Point>
</Placemark>
</Folder>
</Document>
</kml>

下面展示了此文件夹及其地标子元素是如何显示在“位置”面板中的: