本章首先对KML的语法进行了简单的介绍了,然后介绍了KML服务,展示了如何将MapGuide的数据导出为KML,使Google Earth成为MapGuide的客户端。
1.1 KML
Google Earth是Google公司开发的虚拟地球软件,它可以带您飞往地球上的任何地方,您可以在 Google Earth上看到卫星图像、地图、地形和 3D 建筑等。而且,Google Earth支持使用KML将外部数据叠加在自身的数据上,KML定义了如何将外部的向量和图像数据动态地加载和显示在Google Earth中。
1.1.1 KML简介
KML全称是Keyhole Markup Language KML,是一个基于XML语法和文件格式的文件,用来描述和保存地理信息如点、线、图片、折线并在Google Earth客户端之中显示,KML提供以下功能:
l 指定一个地点的图标和标注来区分每一个地点。
l 为每一个视图指定明确的视角来创建不同的特写镜头。
l 使用指定到屏幕或地理位置的图片标注。
l 为特定种类的标注定义显示样式。
l 为标注指定基于简单HTML语法的描述,支持超级链接和图片的显示。
l 使用目录(folders)对标注进行树形的分类管理(为了便于理解和符合习惯,将“folder”翻译为“目录”,实际上是代表一组地理标注)。
l 基于时间戳记的标注可以用来进行动态的播放。
l 从本地或远程的网络地址动态的加载KML文件。
l 当Google Earth客户端视图变化时,自动将视图信息发送给指定的源服务器并从服务器获取相关的标注信息。
KML被Google Earth显示的过程和HTML网页被浏览器处理差不多,而且和HTML一样,KML也使用一种基于标签(名称和属性)的语法格式来描述地里标注信息,可以说,Google Earth是一个KML文件浏览器。
将MapGuide中的地图导出为KML时,我们希望导出的KML数据在Google Earth中能够有MapGuide一致的显示效果和行为,所以导出的KML应该保持和MapGuide中原始地图相同的地图数据、类似的地图样式和浏览行为,为此MapGuide用到了许多KML的高级功能,如Region。
1.1.2 地标
地标是 Google 地球中最常用的地图项之一。它使用黄色图钉作为图标,在地球表面标记出位置。最简单的地标只包含一个 <Point> 元素,它指定地标的位置。您可以指定地标的名称和自定义图标,还可以为地标添加其他几何元素。
在 Google 地球中打开 KML Samples 文件,并展开“Placemarks”子文件夹。该文件夹包含三种不同类型的地标:“简单”、“浮动”和“凸出”。简单地标的 KML 代码如下:
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Placemark> <name>Simple placemark</name> <description> Attached to the ground. Intelligently places itself at the height of the underlying terrain. </description> <Point> <coordinates>-122.0822035425683,37.42228990140251,0</coordinates> </Point> </Placemark> </kml> |
该文件的结构分解如下:
l XML 标头。这是每个 KML 文件的第 1 行。该行前面不能有空格或其他字符。
l KML 名称空间声明。这是每个 KML 2.2 文件的第 2 行。
l 包含以下元素的地标对象:
Ø 用于标识地标的“名称”。
Ø 附着到地标的“气泡框”中显示的“说明”。
Ø 指定地标在地球表面位置的“点”-“经度”、“纬度”及“高度”(可选)。
用户通常认为的 Google Earth中的“地标”,实际上是 KML 中的 <Placemark> 元素,包含一个 <Point> 子元素。点地标是您在 Google Earth的三维查看器中绘制图标和标签的唯一途径。默认情况下,该图标是您熟悉的黄色图钉。在 KML 中,<Placemark> 可包含一个或多个几何元素,例如 LineString、Polygon 或 Model。但只有具有点的 <Placemark> 可以有图标和标签。点用于放置图标,但点本身并无图形表示。
1.1.3 地标中的描述性 HTML
如果您想在 <description> 标签内编写标准的 HTML,可将它放在 CDATA 标签内。如果不放在 CDATA 标签内,必须写上尖括号作为实体引用,以避免 Google Earth错误地对 HTML 进行语法解析(例如,符号 > 写为 >,符号 < 写为 <)。这是 XML 的标准功能,不是 Google Earth所特有的。
请考虑具有 CDATA 标签和不具有 CDATA 标签的 HTML 标记的不同。请先查看下面具有 CDATA 标签的 <description>:
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <Placemark> <name>CDATA example</name> <description> <![CDATA[ <h1>CDATA Tags are useful!</h1> <p><font color="red">Text is <i>more readable</i> and <b>easier to write</b> when you can avoid using entity references.</font></p> ]]> </description> <Point> <coordinates>102.595626,14.996729</coordinates> </Point> </Placemark> </Document> </kml> |
下面是不具有 CDATA 标签的 <description>,这样特殊字符必须使用实体引用:
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <Placemark> <name>Entity references example</name> <description> <h1>Entity references are hard to type!</h1> <p><font color="green">Text is <i>more readable</i> and <b>easier to write</b> when you can avoid using entity references.</font></p> </description> <Point> <coordinates>102.594411,14.998518</coordinates> </Point> </Placemark> </Document> </kml> |
1.1.4 地面叠加层
通过地面叠加层,可在 Google 地球的地形上“叠加”图像。<Icon> 元素包含了指向叠加图像“.jpg”文件的链接。以下是 KML Samples 文件中的地面叠加层示例,展示了 2001 年喷发的埃特纳火山:
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Folder> <name>Ground Overlays</name> <description>Examples of ground overlays</description> <GroundOverlay> <name>Large-scale overlay on terrain</name> <description>Overlay shows Mount Etna erupting on July 13th, 2001.</description> <Icon> <href>http://code.google.com/apis/kml/documentation/etna.jpg</href> </Icon> <LatLonBox> <north>37.91904192681665</north> <south>37.46543388598137</south> <east>15.35832653742206</east> <west>14.60128369746704</west> <rotation>-0.1556640799496235</rotation> </LatLonBox> </GroundOverlay> </Folder> </kml> |
该示例使用文件夹(名为“Ground Overlays”)作为对其内容进行分组和标记的机制。请注意在您将 KML Samples 文件载入 Google 地球中时,该文件夹在“位置”面板中是如何显示的。
地面叠加层的定位由 <LatLonBox> 标签控制。边框值以南纬、北纬和东经、西经形式给出。此外,旋转值是针对 y 轴与网格北端不重合的图像给出的。该示例为叠加层使用 JPEG 图像。Google 地球还支持 BMP、GIF、TIFF、TGA 和 PNG 格式。
1.1.5 路径
在 Google Earth中可以创建多种不同类型的路径,并且可轻松地利用您的数据充分发挥创造力。在 KML 中,路径是用 <LineString> 元素创建的。看一看 Paths 文件夹中的“Absolute Extruded”示例,您就会明白如何用以下代码来生成形状:
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <name>Paths</name> <description>Examples of paths. Note that the tessellate tag is by default set to 0. If you want to create tessellated lines, they must be authored (or edited) directly in KML.</description> <Style id="yellowLineGreenPoly"> <LineStyle> <color>7f00ffff</color> <width>4</width> </LineStyle> <PolyStyle> <color>7f00ff00</color> </PolyStyle> </Style> <Placemark> <name>Absolute Extruded</name> <description>Transparent green wall with yellow outlines</description> <styleUrl>#yellowLineGreenPoly</styleUrl> <LineString> <extrude>1</extrude> <tessellate>1</tessellate> <altitudeMode>absolute</altitudeMode> <coordinates> -112.2550785337791,36.07954952145647,2357 -112.2549277039738,36.08117083492122,2357 -112.2552505069063,36.08260761307279,2357 -112.2564540158376,36.08395660588506,2357 -112.2580238976449,36.08511401044813,2357 -112.2595218489022,36.08584355239394,2357 -112.2608216347552,36.08612634548589,2357 -112.262073428656,36.08626019085147,2357 -112.2633204928495,36.08621519860091,2357 -112.2644963846444,36.08627897945274,2357 -112.2656969554589,36.08649599090644,2357 </coordinates> </LineString> </Placemark> </Document> </kml> |
该代码生成的其实只是高于地面的一条线。<tessellate> 标签把线切成小段,而 <extrude> 标签将线向下延伸到地面。
1.1.6 多边形
您可以使用多边形来创建简单的建筑物及其他形状。有关示例,请查看 KML Samples 文件中的“Polygons”文件夹。
五角大楼的示例是通过绘制简单的内外壳,然后将它们向下凸出到地面生成的。代码如下:
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Placemark> <name>The Pentagon</name> <Polygon> <extrude>1</extrude> <altitudeMode>relativeToGround</altitudeMode> <outerBoundaryIs> <LinearRing> <coordinates> -77.05788457660967,38.87253259892824,100 -77.05465973756702,38.87291016281703,100 -77.05315536854791,38.87053267794386,100 -77.05552622493516,38.868757801256,100 -77.05844056290393,38.86996206506943,100 -77.05788457660967,38.87253259892824,100 </coordinates> </LinearRing> </outerBoundaryIs> <innerBoundaryIs> <LinearRing> <coordinates> -77.05668055019126,38.87154239798456,100 -77.05542625960818,38.87167890344077,100 -77.05485125901024,38.87076535397792,100 -77.05577677433152,38.87008686581446,100 -77.05691162017543,38.87054446963351,100 -77.05668055019126,38.87154239798456,100 </coordinates> </LinearRing> </innerBoundaryIs> </Polygon> </Placemark> </kml> |
1.1.7 几何图形样式
如果您在 KML 文档开头定义了样式,并定义了它的 ID,就可以在文档其他地方定义的几何图形、地标和叠加层中使用该样式。因为可有多个元素使用同一个样式,因此以这种方式定义和使用的样式称为“共享样式”。您只需定义指定样式一次,即可用 <styleUrl> 元素多次引用它。如果样式定义位于同一文件内,请在样式 ID 前加 # 号。如果样式定义位于外部文件中,请在 <styleUrl> 元素中包含完整的网址。
KML Samples 文件包含许多共享样式,每个样式都在文件开始时使用 ID 进行定义。请注意,您的 ID 最好是描述性的字符串,因为这样您可以很容易地判断其作用。以下是一个样式的示例(“transBluePoly”),它将多边形面定义为透明蓝色,将多边形边的线宽定义为 1.5(默认颜色为白色)。Google 园区 41 号楼的示例会使用该样式(在“Polygons”文件夹中):
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <Style id="transBluePoly"> <LineStyle> <width>1.5</width> </LineStyle> <PolyStyle> <color>7dff0000</color> </PolyStyle> |