2.5. KML-我从 Google 来¶
2.5.1. 概述¶
KML(OpenGIS® KML Encoding Standard)从 2.2.0 版本开始由 Google 提交到 OGC 并被接受为标准, 当前 OGC KML 的版本也就是 2.2.0。
KML 和 GML 在名称上类似,但是功能有很大不同。 GML 主要用于地理数据的交换; 而 KML 主要用于地理数据的可规化,它不仅包括地理数据的描述,还包括数据的符号化方式、用户规定的控制等信息。
2.5.2. KML Schema¶
KML 的 Schema 可以从 http://schemas.opengis.net/kml/ 访问到。 所有 KML 中耳熟能详的 Placemark、LookAt 等名称都可以在这里找到定义, 相对 OGC 给出的文档, 更好的关于 KML Schema 的参考在 Google Code 上 http://code.google.com/intl/zh-CN/apis/kml/documentation/kml_tut.html , 这里还有关于Schema 对象的关系,如图 11。
图 11 KML Schema 对象关系图
注意,在图 11 中的方框中的对象是逡辑上的对象,并不真实存在于Schema 定义中。 还有,红色标注的对象是 Google 对 KML 2.2.0 的扩展,在 Google Earth 5.0以上版本中被支持, 因此,对于需要了解KML标准的人来说,这些红色的内容都可以被忽略。
2.5.3. KML 示例¶
关于地理数据的描述,下面是一个最简单的描述“地标”的KML,它 包括了一个点要素信息:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Placemark>
<name>Simple placemarkname>
<description>Attached to the ground. Intelligently places itself
at the height of the underlying terrain.description>
<Point>
<coordinates>-122.0822035425683,37.42228990140251,0coordinates>
Point>
Placemark>
kml>
下面是另外一个定义了显示样式的多边形数据:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Style id="transBluePoly">
<LineStyle>
<width>1.5width>
LineStyle>
<PolyStyle>
<color>7dff0000color>
PolyStyle>
Style>
<Placemark>
<name>Building 41name>
<styleUrl>#transBluePolystyleUrl>
<Polygon>
<extrude>1extrude>
<altitudeMode>relativeToGroundaltitudeMode>
<outerBoundaryIs>
<LinearRing>
<coordinates> -122.0857412771483,37.42227033155257,17
-122.0858169768481,37.42231408832346,17
-122.085852582875,37.42230337469744,17
-122.0858799945639,37.42225686138789,17
-122.0858860101409,37.4222311076138,17
-122.0858069157288,37.42220250173855,17
-122.0858379542653,37.42214027058678,17
-122.0856732640519,37.42208690214408,17
-122.0856022926407,37.42214885429042,17
-122.0855902778436,37.422128290487,17
-122.0855841672237,37.42208171967246,17
-122.0854852065741,37.42210455874995,17
-122.0855067264352,37.42214267949824,17
-122.0854430712915,37.42212783846172,17
-122.0850990714904,37.42251282407603,17
-122.0856769818632,37.42281815323651,17
-122.0860162273783,37.42244918858722,17
-122.0857260327004,37.42229239604253,17
-122.0857412771483,37.42227033155257,17
coordinates>
LinearRing>
outerBoundaryIs>
Polygon>
Placemark>
Document>
kml>
这是一个定义了视点属性的点要素:
- ::
<?xml version=”1.0” encoding=”UTF-8”?> <kml xmlns=”http://www.opengis.net/kml/2.2”> <Placemark> <name>Machu Picchu, Peruname> <LookAt> <longitude>-72.503364longitude> <latitude>-13.209676latitude> <altitude>0altitude> <range>14794.882995range> <tilt>66.768762tilt> <heading>71.131493heading> LookAt> <Point> <coordinates>-72.516244,-13.162806,0coordinates> Point> Placemark> kml>
2.5.4. ArcGIS 对 KML 的支持¶
ArcGIS 10 中支持 KML 2.2.0 版本。
1. ArcToolbox 输出 KML¶
我们可以通过 ArcToolbox 中的“To Kml”工具箱将地图或图层输出为 KML 格式。 比如使用“Map To Kml”工具,如图 12 所示:
图 12 使用 ArcToolbox 导出 KML
这样导出的 KML 为 KMZ 文件,如果在 Google Earth 中直接打开导出的KMZ 文件, 可以看到在 Google Earth 中显示的地图和 MXD 中的基本一致。 “基本一致”表示还稍有不同,比如在图 13 中蓝色的多边形对象在导出 KML 并加载到 GoogleEarth [14] 后会被下层的多边形覆盖而导致不可见。 不过,这个是 Google Earth 的问题,因为从图层属性中可以看到,这些蓝色多边形所在的“Lakes”图层数据都存在,可惜没被正确显示,如图 14 的对比效果。
图 13 ArcMap 中显示的地图效果
图 14 Google Earth 中显示 KML 的覆盖问题
由于我们选择了导出矢量的数据,因此如果解压缩导出的 KMZ 文件,可以看到其中叧 包括了一个 doc.kml 文件, 有兴趣可以自己打开这个 XML 文件对照 KML 标准看一下。 如果导出图片格式,KMZ 中将会 包括一个输出的图片,在 doc.xml 则是简单地将这个图片引用进来, 这样的 KML 在 Google Earth 中显示并放大后会出现如图 16 的锯齿。
图 15 Google Earth 中显示 ArcGIS 导出的矢量 KML
图 16 导出图片结果的 KML 在 Google Earth 中放大的效果
2. ArcGIS Server 发布 KML 服务¶
在 ArcGIS Server 中,通过勾选 KML 这个 Capability 可以启用服务的 KML 访问,如图 17。
图 17 ArcGIS Server 发布 KML 服务
当发布完这个 KML 服务后,我们就可以直接向 ArcGIS Server 的 REST 接口发送返回 KMZ 格式的请求, 然后将这个请求的地址添加到 Google Earth 的网络链接中。
图 18 将 ArcGIS Server 发布的 KML 服务添加到 Google Earth 的效果