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

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



















