跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

KML是什么 如何用XML来表示地理标记

KML是严格遵循XML语法并声明OGC官方命名空间的文本文件,必须以UTF-8编码开头、使用kml 2.2命名空间、所有要素置于Placemark内、坐标顺序为经度,纬度,高度。 KML 就是带地理坐标的 XML 文件,不是“类XML”而是标准 XML KML(Keyhole Markup Language)本质就是一份严格遵循 XML 语法、且必须声明 OGC 官方命名空间的文本文件。它不是自定义标签的简化格式,不能省略 XML 声明或乱写命名空间——否则 Google Earth 或 QGIS 会直接拒读。
必须是第一行,前面**绝对不能有空格、BOM 或换行** 第二行必须是
,用的是 KML 2.2 命名空间(当前最广泛兼容的版本) 所有地理要素(点、线、面)都必须包裹在
内,不能直接挂在
下(虽某些解析器容忍,但属非规范写法) 坐标顺序固定为
经度,纬度,高度
(注意:不是纬度优先),例如
-122.0822,37.4223,0
用 Python minidom 手动拼出合法 KML 的关键步骤 很多人用字符串拼接写 KML,结果因引号嵌套、转义、缩进混乱导致解析失败。用
xml.dom.minidom
虽略 verbose,但能保证结构合法。重点不在“会不会创建节点”,而在**命名空间和子元素层级是否精准匹配 KML Schema**。 必须用
createElementNS("http://www.opengis.net/kml/2.2", "kml")
创建根节点,不能只用
createElement("kml")
是
的**唯一合法直接子元素**(KML 2.2 规范强制要求)
是
的子元素,其内容必须是纯文本节点(
createTextNode
),不能是子标签或属性 中文
或
需确保整个 Python 文件以 UTF-8 保存,并在 XML 声明中明确
encoding="UTF-8"
from xml.dom.minidom import Document doc = Document() kml = doc.createElementNS("http://www.opengis.net/kml/2.2", "kml") doc.appendChild(kml) document = doc.createElement("Document") kml.appendChild(document) placemark = doc.createElement("Placemark") document.appendChild(placemark) name = doc.createElement("name") name.appendChild(doc.createTextNode("南山岛")) placemark.appendChild(name) point = doc.createElement("Point") coordinates = doc.createElement("coordinates") coordinates.appendChild(doc.createTextNode("114.321,19.876,0")) point.appendChild(coordinates) placemark.appendChild(point) with open("example.kml", "w", encoding="utf-8") as f: f.write(doc.toprettyxml(indent=" ", encoding="utf-8").decode("utf-8"))
常见解析失败错误及对应原因 不是代码报错,而是打开 KML 时 Google Earth 显示“无法读取此文件”或 QGIS 提示“无效 KML”——这类问题几乎全出在 XML 结构层面,而非地理逻辑。 Google Antigravity 谷歌推出的AI原生IDE,AI智能体协作开发 下载
ParseError: mismatched tag
→ 实际是某处
没闭合,或
写成了
(少个 s) 地标显示在赤道上或完全错位 → 坐标字符串里用了中文逗号(,)或空格分隔,应为英文半角逗号+无空格:
"114.321,19.876,0"
,不是
"114.321,19.876,0"
样式不生效(图标/颜色丢失)→