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

发布时间 - 2026-01-29 00:00:00    点击率:
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 结构层面,而非地理逻辑。

  • ParseError: mismatched tag → 实际是某处 没闭合,或 写成了 (少个 s)
  • 地标显示在赤道上或完全错位 → 坐标字符串里用了中文逗号(,)或空格分隔,应为英文半角逗号+无空格:"114.321,19.876,0",不是 "114.321,19.876,0"
  • 样式不生效(图标/颜色丢失)→ 定义在 外部但未用 id 引用,或引用写成 #mystyle 却漏了开头的 #
  • 文件能打开但无内容 → 被误写为 (XML 标签大小写敏感)

KML 不是万能容器,别硬塞非地理数据

KML 设计目标很明确:表达地球表面的点、路径、区域及其可视化样式。它**不支持表格数据、时间序列聚合、属性字段类型定义(如整数/日期)或空间索引**。想存“某岛2025年渔船停靠次数”,KML 只能塞进 当纯文本,无法被 GIS 工具识别为数值字段。

  • 需要做统计分析?先转成 GeoJSON 或 Shapefile,再导入 QGIS/ArcGIS
  • 要展示动态轨迹?用 (Google Earth 扩展),但标准 KML 解析器(如 GDAL)可能忽略
  • 含大量图片或模型?打包成 .kmz(ZIP 压缩包),直接放 .kml 里引用相对路径即可
  • 坐标系只能是 WGS84(EPSG:4326)——KML 没有 标签,强行写其他椭球参数会被无视
真正卡住人的,从来不是“怎么写一个点”,而是命名空间漏了冒号、coordinates 里多了一个空格、或者把 错当成可选标签。KML 的规范性比灵活性重要得多。


# python  # js  # json  # node  # go  # 编码  # app  # 工具  # google  # .net  # 2025年  # 2025  # 命名空间  # xml  # 字符串  # dom  # bom  # arcgis  # http  # 文本文件  # 漏了  # 的是  # 半角  # 很多人  # 会不会  # 而在  # 并在  # 用了  # 这类 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 公司网站制作价格怎么算,公司办个官网需要多少钱?  详解vue.js组件化开发实践  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel怎么在Controller之外的地方验证数据  如何快速查询域名建站关键信息?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  如何在香港服务器上快速搭建免备案网站?  Python函数文档自动校验_规范解析【教程】  如何用PHP工具快速搭建高效网站?  如何在云主机快速搭建网站站点?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  免费视频制作网站,更新又快又好的免费电影网站?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  微信小程序 闭包写法详细介绍  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  canvas 画布在主流浏览器中的尺寸限制详细介绍  如何选择可靠的免备案建站服务器?  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  如何在阿里云香港服务器快速搭建网站?  如何快速上传自定义模板至建站之星?  如何确保FTP站点访问权限与数据传输安全?  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Python文本处理实践_日志清洗解析【指导】  Laravel如何配置和使用缓存?(Redis代码示例)  如何在腾讯云服务器上快速搭建个人网站?  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Laravel PHP版本要求一览_Laravel各版本环境要求对照  教你用AI将一段旋律扩展成一首完整的曲子  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Python文件流缓冲机制_IO性能解析【教程】  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  零基础网站服务器架设实战:轻量应用与域名解析配置指南  b2c电商网站制作流程,b2c水平综合的电商平台?  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  原生JS实现图片轮播切换效果  长沙企业网站制作哪家好,长沙水业集团官方网站?  Python图片处理进阶教程_Pillow滤镜与图像增强  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  如何快速查询网址的建站时间与历史轨迹?  如何基于PHP生成高效IDC网络公司建站源码?  Laravel如何创建自定义Artisan命令?(代码示例)  千库网官网入口推荐 千库网设计创意平台入口