KML文件是Keyhole Markup Language的缩写,属于一种用来表达地理空间信息的文件格式。它通常以.kml作为文件后缀,内部采用标签化的方式记录地球表面上各种要素的位置与外观。比如我们想在地图上标出一家公司总部,或者画一条自驾游路线,都可以写进KML文件,再导入谷歌地球、谷歌地图或其他兼容软件中查看。

要理解KML,必须先看它和XML的关系。XML是可扩展标记语言,本身只是一套语法规则,不规定具体业务标签。KML则是基于XML规则定义好的一套地理标签集合。因此任何KML文档在结构上都是XML文档,但XML文档不一定是KML。下面从几个层面详细说明。
一、KML的基本结构源于XML
一个最简单的KML文件,开头必须声明XML版本,并使用<kml>作为根元素。这和写普通XML文件完全一致。XML要求所有标签正确闭合、属性加引号、区分大小写,KML也强制遵守。如果少写结束标签或嵌套错乱,不仅KML软件无法解析,标准XML解析器也会直接报错。
KML还使用了XML的命名空间机制。通过在根元素上声明 xmlns,告诉解析器这些标签属于OGC的KML规范。这种用法正是XML提供的扩展能力,让不同领域的标记语言可以共存而互不冲突。下面给出一个最小可用示例。
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Placemark>
<name>示例标注点</name>
<Point>
<coordinates>116.397,39.908,0</coordinates>
</Point>
<Placemark>
</Document>
</kml>
上面代码里,<coordinates>中的三个数字分别代表经度、纬度和海拔。这种表达方式完全建立在XML文本结构之上,没有任何二进制内容。也正因如此,我们可以用记事本或任意XML编辑器打开并修改KML。
二、KML是XML在地理领域的方言
如果说XML是通用语法,那KML就是特定词汇表。XML只说“你可以用标签包数据”,KML则规定“用<Placemark>表示地物,用<LineString>表示线,用<Style>定义样式”。这些词汇由开放地理联盟制定,属于公开标准。我们写KML时,本质是在用XML语法说地理相关的专用语言。
由于KML依赖XML,所以所有XML工具链都能处理KML。例如用Python的 xml.etree.ElementTree 读取KML,和读取普通配置文件没有区别。反过来,如果我们把一个HTML片段塞进KML文件,只要不符合KML标签定义,地图软件就会忽略或报错,但纯XML解析仍可能成功,这说明约束来自KML层而非XML层。
import xml.etree.ElementTree as ET
tree = ET.parse('sample.kml')
root = tree.getroot()
# 命名空间需匹配kml定义
ns = {'k': 'http://www.opengis.net/kml/2.2'}
for pm in root.findall('.//k:Placemark', ns):
name = pm.find('k:name', ns)
if name is not None:
print(name.text)
上述脚本直接把KML当XML解析,提取出所有标注名称。这进一步证明KML与XML是“实例与规范”的关系,而非两种并列格式。
三、常见误区与注意事项
有人以为KML是谷歌私有的二进制地图格式,这是错误认知。KML自2008年起就是OGC开放标准,且文件本质为文本。还有人把KMZ和KML混为一谈:KMZ其实是KML文件经过ZIP压缩后的包裹,里面可能包含图片等附件,但解压后核心仍是XML文本。
另一个容易忽略的点是XML合法性不等于KML有效性。一个XML文档良构,却写了KML规范不允许的标签组合,地图软件依然无法渲染。我们可以借助XML Schema(KML的xsd文件)做校验,这同样是XML技术体系提供的支持。
| 对比项 | XML | KML |
|---|---|---|
| 定位 | 通用标记语言语法 | 地理信息专用标记语言 |
| 标签定义 | 由使用者自定义 | 由OGC标准固定 |
| 解析方式 | 任意XML解析器 | XML解析器加KML语义理解 |
总结来看,KML文件就是遵循XML语法、填充了地理标签的数据文档。掌握XML基础,就能轻松读写KML;而理解KML的专属标签,才能正确表达空间信息。二者是底层规范与应用方言的紧密依存关系。