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 声明或乱写

-
必须是第一行,前面**绝对不能有空格、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 没有
标签,强行写其他椭球参数会被无视
错当成可选标签。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命令?(代码示例)
千库网官网入口推荐 千库网设计创意平台入口

