KML全称为Keyhole Markup Language,是一种基于XML的标记语言,最初由Keyhole公司开发,后被Google收购并广泛应用于Google Earth、Google Maps等地理信息产品中,目前已经成为开放地理空间联盟的官方标准之一,主要用于描述地理空间要素的位置、样式和附属信息。

KML文件的基础结构
KML文件严格遵循XML的语法规则,所有标签必须正确闭合,且区分大小写。一个最简单的KML文件包含文档声明、根标签<kml>、命名空间声明以及核心内容标签<Document>或<Placemark>。
下面是一个最基础的KML文件示例,其中定义了一个位于北京的标注点:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>示例KML文档</name>
<Placemark>
<name>北京天安门</name>
<description>中华人民共和国首都核心地标</description>
<Point>
<coordinates>116.3974,39.9093,0</coordinates>
</Point>
<Placemark>
</Document>
</kml>
核心标签含义说明
KML的标签体系围绕地理要素的描述展开,以下是几个最常用的核心标签:
<kml>:根标签,所有KML内容都必须包裹在这个标签内部,同时需要声明对应的命名空间。<Document>:用于组织多个地理要素,可以包含样式定义、文件夹分组等内容,是常用的内容容器。<Placemark><Point>:定义点要素,内部通过<coordinates>标签存储经纬度坐标。<LineString>:定义线要素,<coordinates>标签中可以存储多个坐标点,按顺序连接形成线段。<Polygon>:定义多边形要素,需要指定外边界坐标和内边界坐标(可选),用于描述面状区域。<coordinates>:坐标存储标签,格式为经度,纬度,海拔,多个坐标之间用空格分隔,海拔参数可选,默认值为0。
坐标数据解析规则
KML中的坐标采用WGS84坐标系,也就是我们常说的GPS坐标系,坐标顺序和常见的经纬度顺序一致,先写经度再写纬度,最后可选海拔值。如果需要解析KML文件中的坐标数据,可以按照XML解析的逻辑读取对应标签的内容,再按规则拆分字符串即可。
下面是一个使用Python解析KML文件中所有点要素坐标的示例代码:
import xml.etree.ElementTree as ET
def parse_kml_points(kml_path):
# 定义KML命名空间,避免解析时标签匹配失败
namespaces = {'kml': 'http://www.opengis.net/kml/2.2'}
# 解析KML文件
tree = ET.parse(kml_path)
root = tree.getroot()
points = []
# 查找所有Placemark标签
for placemark in root.findall('.//kml:Placemark', namespaces):
name_tag = placemark.find('kml:name', namespaces)
point_tag = placemark.find('.//kml:Point', namespaces)
if point_tag is not None:
coord_tag = point_tag.find('kml:coordinates', namespaces)
if coord_tag is not None:
coord_str = coord_tag.text.strip()
# 拆分坐标字符串,格式为经度,纬度,海拔
lon, lat, alt = coord_str.split(',')
point_info = {
'name': name_tag.text if name_tag is not None else '未命名点',
'longitude': float(lon),
'latitude': float(lat),
'altitude': float(alt) if alt else 0.0
}
points.append(point_info)
return points
# 调用示例,假设kml文件名为test.kml
if __name__ == '__main__':
result = parse_kml_points('test.kml')
for item in result:
print(f"名称:{item['name']},经度:{item['longitude']},纬度:{item['latitude']}")
KML与其他地理格式的差异
常见的地理数据格式还有Shapefile、GeoJSON等,和KML相比各有特点:
| 格式名称 | 文件结构 | 适用场景 | 样式支持 |
|---|---|---|---|
| KML | 单XML文件 | Google Earth、地图标注展示 | 原生支持样式、动画等扩展配置 |
| Shapefile | 多文件组合(.shp/.dbf/.shx等) | 专业GIS软件数据处理 | 样式需要额外配置,不支持原生存储 |
| GeoJSON | 单JSON文件 | Web前端地图开发 | 样式需要在前端代码中单独定义 |
常见问题说明
KML文件可以用什么软件打开
主流的地理信息软件都支持KML文件打开,比如Google Earth、QGIS、ArcGIS等,普通用户也可以直接把KML文件拖入浏览器版本的Google Maps中查看内容。
KML文件的编码要求
KML文件推荐使用UTF-8编码,避免出现中文乱码问题,文档声明中需要明确标注encoding="UTF-8",如果文件中包含非英文字符,必须保证文件实际编码和声明编码一致。
如何给KML要素添加自定义样式
KML支持通过<Style>标签定义要素的显示样式,比如标注点的图标、线的颜色宽度、面的填充色等,定义的样式可以通过id关联到对应的<Placemark>标签上,实现自定义显示效果。
下面是一个带自定义样式的KML标注点示例,标注点会显示为红色图标:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>带样式的KML示例</name>
<Style id="redIcon">
<IconStyle>
<color>ff0000ff</color>
<Icon>
<href>http://ipipp.com/icon.png</href>
</Icon>
</IconStyle>
</Style>
<Placemark>
<name>红色标注点</name>
<styleUrl>#redIcon</styleUrl>
<Point>
<coordinates>121.4737,31.2304,0</coordinates>
</Point>
</Placemark>
</Document>
</kml>