c++如何解析Google Earth的KML文件坐标点【实战】

风辰同学_7662

风辰同学_7662

2026-04-08

863人浏览

原创

用 tinyxml2 解析 KML 的 标签最省事:通过逐层查找元素并调用 GetText() 获取内容,自动处理 CDATA 和空白;坐标按空格/换行分隔、逗号分割为 lon,lat,alt 三元组,解析时需切 C locale 并 trim 空白;忽略 gx: 扩展标签,递归遍历 Folder 防嵌套过深。

c++如何解析google earth的kml文件坐标点【实战】

用 tinyxml2 解析 KML 的 标签最省事

KML 是 XML 格式,不用自己写正则或状态机去抠坐标。tinyxml2 轻量、头文件即用、无依赖,C++ 项目里加个 tinyxml2.h 和 tinyxml2.cpp 就能跑。它能准确定位到 元素,且自动处理 CDATA 和空白字符——这点很关键,因为 Google Earth 导出的 KML 常把坐标塞在 里,直接读 FirstChild()->Value() 会返回空。

实操建议:

  • 用 XMLDocument::FirstChildElement("kml") 入口,再逐层查 "Document" → "Placemark" → "Point" → "coordinates",避免硬写 XPath(tinyxml2 不支持)
  • 对 元素,优先调用 GetText() 而非 FirstChild()->Value(),它会自动合并 CDATA 和文本节点
  • 坐标字符串形如 "116.404,39.915,0",逗号分隔经度、纬度、海拔;注意顺序是 lon,lat,alt,不是 lat,lon

std::stod 解析坐标时要注意 locale 和异常

Google Earth 导出的 KML 坐标小数点是英文句点(.),但如果你的程序 locale 设成了中文(比如 Windows 控制面板设了中文区域),std::stod 可能把 "116.404" 当成非法数字而抛 std::invalid_argument。

实操建议:

  • 解析前临时切回 "C" locale:std::locale::global(std::locale("C")),或者更稳妥地用 std::stod(str, nullptr) 并捕获异常
  • 每个坐标三元组要按逗号分割,但注意 KML 允许坐标间有空格或换行,所以先 std::stringstream 拆串,再对每个子串 trim()(手动跳过前后空白)
  • 海拔值可能为空(如 "116.404,39.915"),解析第三个字段前先检查分割后 vector size 是否 ≥ 3

处理 或 里的多点坐标

Placemark 不一定只含单点;若你在 Google Earth 里画了路径或面,KML 会用 或 ,其 内是一长串空格/换行分隔的三元组,例如:"116.4,39.9,0 116.5,39.8,0 116.6,39.7,0"。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

  • 别用 std::getline 按换行切——KML 坐标里换行只是格式美化,实际分隔符是空格和制表符
  • 用 std::istringstream iss(coords_text); std::string token; 配合 iss >> token 逐个读取非空白 token,每个 token 就是一个 "lon,lat,alt" 字符串
  • 注意 的第一个和最后一个点通常重合(闭合环),是否去重取决于你的业务逻辑,不要默认删掉末尾点

忽略 和时间动画标签,除非你真需要

Google Earth 专有扩展标签如 、 或 在标准 KML 解析中属于“可选扩展”。tinyxml2 能读到它们,但如果你只关心静态坐标点,硬解析这些标签只会增加出错概率和维护成本。

实操建议:

  • 只响应命名空间为 ""(空)或 "http://www.opengis.net/kml/2.2" 的元素,跳过所有带 gx: 前缀的节点
  • 用 element->Name() 判断节点名,不要依赖 element->Value()(它返回的是节点类型名,不是标签名)
  • 如果用户导入的是 Google Earth Pro 导出的 KML,且明确要求支持飞行路径动画,再回头补 gx:coord 解析;否则先跑通基础点位就足够

真正麻烦的是嵌套 和 ——它们会让 Placemark 不在根 Document 下一层。递归遍历比写死层级更可靠,但也要防深度过大导致栈溢出;建议加个层级计数器,超过 10 层就报 warning 并终止。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7219

3

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.01

5004

5

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2024.08.01

6497

7

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2024.11.28

2602

7

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

2023.09.14

15046

6

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1765

5

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

2023.12.21

4197

3

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2024.03.01

6361

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1878

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习