跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

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

用 tinyxml2 解析 KML 的 标签最省事:通过逐层查找元素并调用 GetText() 获取内容,自动处理 CDATA 和空白;坐标按空格/换行分隔、逗号分割为 lon,lat,alt 三元组,解析时需切 C locale 并 trim 空白;忽略 gx: 扩展标签,递归遍历 Folder 防嵌套过深。 用 tinyxml2 解析 KML 的
标签最省事 KML 是 XML 格式,不用自己写正则或状态机去抠坐标。tinyxml2 轻量、头文件即用、无依赖,C++ 项目里加个
tinyxml2.h
和
tinyxml2.cpp
就能跑。它能准确定位到
元素,且自动处理 CDATA 和空白字符——这点很关键,因为 Google Earth 导出的 KML 常把坐标塞在
里,直接读
FirstChild()->Value()
会返回空。 实操建议: 立即学习 “ C++免费学习笔记(深入) ”; 用
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++免费学习笔记(深入) ”; 解析前临时切回 "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知道 CSDN推出的一款AI技术问答工具 下载 实操建议: 立即学习 “ C++免费学习笔记(深入) ”; 别用
std::getline
按换行切——KML 坐标里换行只是格式美化,实际分隔符是空格和制表符 用
std::istringstream iss(coords_text); std::string token;
配合
iss >> token
逐个读取非空白 token,每个 token 就是一个
"lon,lat,alt"
字符串 注意
的第一个和最后一个点通常重合(闭合环),是否去重取决于你的业务逻辑,不要默认删掉末尾点 忽略
和时间动画标签,除非你真需要 Google Earth 专有扩展标签如
、
或
在标准 KML 解析中属于“可选扩展”。tinyxml2 能读到它们,但如果你只关心静态坐标点,硬解析这些标签只会增加出错概率和维护成本。 实操建议: 立即学习 “ C++免费学习笔记(深入) ”; 只响应命名空间为
""
(空)或
"http://www.opengis.net/kml/2.2"
的元素,跳过所有带
gx:
前缀的节点 用
element->Name()
判断节点名,不要依赖
element->Value()
(它返回的是节点类型名,不是标签名) 如果用户导入的是 Google Earth Pro 导出的 KML,且明确要求支持飞行路径动画,再回头补
gx:coord
解析;否则先跑通基础点位就足够 真正麻烦的是嵌套
和
——它们会让 Placemark 不在根 Document 下一层。递归遍历比写死层级更可靠,但也要防深度过大导致栈溢出;建议加个层级计数器,超过 10 层就报 warning 并终止。

相关文章