c++如何解析GeoJSON中的FeatureCollection地理要素集【实战】

轻墨大大_1475

轻墨大大_1475

2026-04-16

445人浏览

原创

最省事的方法是直接用 nlohmann/json 解析 geojson featurecollection,需逐层防御性访问字段、校验结构合法性、避免隐式拷贝,并为坐标系和语义模糊性留出上层干预接口。

c++如何解析geojson中的featurecollection地理要素集【实战】

用 nlohmann/json 解析 GeoJSON FeatureCollection 最省事

GeoJSON 本质是 JSON,C++ 没原生支持,硬写解析器纯属重复造轮子。直接用 nlohmann/json 是最稳妥的选择——它能自动映射嵌套结构,且对 FeatureCollection 的 type、features、properties 等字段名完全兼容,无需预定义 schema。

注意:必须确保输入 JSON 合法(比如 features 是数组、每个 feature 有 geometry 和 properties),否则 json::parse() 会抛 json::parse_error 异常,不处理会导致崩溃。

  • 用 json j = json::parse(json_str) 加载字符串;若从文件读,先用 std::ifstream 读入 std::string 再 parse
  • 检查根对象类型:if (j.at("type") != "FeatureCollection"),避免误传 Feature 或 Geometry
  • j.at("features") 返回的是 json::array_t,遍历时用 for (const auto& f : j.at("features")),别用 size() + 下标——nlohmann 的 range-for 更安全

提取单个 Feature 的 geometry 和 properties 要分层访问

GeoJSON 的 Feature 是三层嵌套:feature → geometry → coordinates 和 feature → properties → {任意键值}。nlohmann/json 不做类型推断,所有字段访问都得显式调用 .at() 或 .value(),否则遇到缺失字段会抛异常。

典型错误是直接写 f["geometry"]["coordinates"] ——一旦某个 feature 缺 geometry,程序就 terminate。必须逐层防御性访问。

Comprehensive Three.js 3D graphics reference
Comprehensive Three.js 3D graphics reference

详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。

下载
  • 先确认 f.contains("geometry"),再 f.at("geometry").contains("type") 和 f.at("geometry").contains("coordinates")
  • 坐标数组类型不确定:Point 是 [x,y](json::array_t 长度为 2),LineString 是 [[x,y], [x,y]](二维数组),Polygon 是三维(外环+内环)。用 f.at("geometry").at("coordinates").size() 判断维度,别硬转 std::vector<:vector>></:vector>
  • properties 是自由结构,用 f.at("properties").is_object() 检查后,再用 .value("name", "") 安全取默认值,避免 .at("name") 崩溃

坐标系和精度问题在解析层无法解决,但必须留出接口

nlohmann/json 只管把数字当 double 解出来,它不管这是 WGS84 经纬度还是 Web Mercator 米制坐标。GeoJSON 规范明确要求坐标为 [longitude, latitude](即 EPSG:4326),但实际数据经常不守规矩——比如国内某些导出工具会输出 GCJ-02 偏移坐标,或把 coordinates 顺序写成 [lat, lon]。

解析代码里不做坐标转换,但必须让调用方能轻易干预。常见做法是在解析 loop 里暴露原始 coordinates 数组引用,而不是立刻转成自定义 Point 结构体。

  • 不要写 auto pt = Point{coord[0].get<double>(), coord[1].get<double>()}</double></double> 这种紧耦合代码
  • 推荐返回 std::vector<:vector>></:vector> 或 json 类型的 coordinates 字段,由上层决定是否调用 PROJ 或 GDAL 转换
  • 如果必须存为内部结构,用 struct Coord { double x; double y; }; 而非 lat/lon 命名,避免语义误导

性能敏感时避免重复解析和深拷贝

一个含上千 features 的 GeoJSON 文件,用 json::parse() 生成的 DOM 树内存占用可能达数 MB,且每次访问 .at("features")[i].at("geometry") 都是 O(1) 但带 hash 查找开销。高频场景(如实时渲染)下,反复解析同一份数据是明显瓶颈。

真正该优化的不是解析逻辑本身,而是复用策略和视口裁剪——解析是一次性的,后续操作应基于内存中已有的 json 对象,而非反复从字符串重 parse。

  • 把解析结果缓存在类成员变量里,用 const json& 引用传递,禁止 json j = parsed_json 这种隐式拷贝
  • 如果只关心视口内的 features,解析完立即用 bounding box(geometry 的 coordinates 极值)做过滤,别等全部解析完再遍历
  • 不用 json::dump() 回写调试——日志直接打印 j.at("features").size() 和前几个 f.at("properties").dump() 就够了,dump 整体太慢
解析 GeoJSON 的难点从来不在语法层面,而在于地理语义的模糊性:坐标顺序、CRS 声明缺失、空 geometry、混合 geometry type……这些都不会报 JSON 错误,但会让下游计算彻底失效。所以每一步访问都得带校验,宁可多几行 contains(),也不要靠文档赌数据质量。

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

相关文章

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

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

下载

相关标签:

js json c++

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

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2168

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

979

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

387

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

366

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1177

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.6万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.7万人学习