WebGIS开发入门教程四: GeoJSON咋读?数据怎么解析?
你写的GeoJSON为啥总报错?可能是这3个坑没踩过
上周有个读者在后台留言:‘Dr. Gis,我照着教程把GeoJSON加载进Leaflet,地图一片空白,控制台还报错Uncaught TypeError: Cannot read property 'features' of undefined...’——别慌,这几乎是每个WebGIS新手必经的‘成人礼’。我在参与某智慧城市项目时,也曾在凌晨三点被类似问题折磨到怀疑人生。今天这篇,就是帮你把GeoJSON从‘玄学格式’变成‘透明积木’。

GeoJSON不是JSON的马甲,它是地理数据的乐高说明书
很多人以为GeoJSON就是加了坐标的JSON,就像给普通快递单贴个GPS标签——大错特错。它本质是一套严格的空间数据结构规范,就像乐高积木的拼装说明书:每个零件(点/线/面)都有固定卡槽(geometry.type),每组组件(feature)必须带属性清单(properties),整盒积木(FeatureCollection)还得有统一包装盒(type: 'FeatureCollection')。
实战血泪教训:某次国土调查项目,我们收到第三方提供的‘GeoJSON’文件,打开发现geometry字段写成geometery——少了个r。结果前端地图渲染直接崩溃,排查了整整两天才定位到这个拼写错误。从此团队立下铁律:所有GeoJSON必须用geojsonlint.com在线校验!
三步拆解法:像外科医生一样解剖GeoJSON
面对动辄上万行的GeoJSON文件,别傻乎乎肉眼扫描。记住这个黄金公式:看骨架→查器官→验血液。
- 看骨架(根节点结构):顶级对象必须包含type和features两个字段,就像人体必须有脊椎和四肢。用浏览器开发者工具console.log(data)后,先确认data.type === 'FeatureCollection'。
- 查器官(单个要素):遍历features数组时,每个元素必须是标准feature对象——包含geometry(空间形态)和properties(属性表)。特别注意geometry.coordinates的嵌套层数:Point是[经度,纬度],LineString是[[经1,纬1],[经2,纬2]],Polygon还要再多包一层[]。
- 验血液(坐标值合法性):我见过最离谱的bug是坐标写成[120.5, 300.2]——纬度超过90度!用这段代码快速筛查:
// 检查坐标范围是否合法 features.forEach(feature => { const coords = feature.geometry.coordinates; if (feature.geometry.type === 'Point') { if (Math.abs(coords[1]) > 90) console.warn('纬度越界:', coords); } });
实战:用JavaScript把GeoJSON变成可交互地图
假设你拿到一个城市公园数据集,目标是在Leaflet上显示并点击弹出公园名称。核心就三行魔法:
// 1. 异步加载GeoJSON文件
fetch('parks.geojson')
.then(response => response.json())
.then(data => {
// 2. 创建GeoJSON图层
L.geoJSON(data, {
// 3. 绑定点击事件
onEachFeature: (feature, layer) => {
layer.bindPopup(feature.properties.name);
}
}).addTo(map);
});但真实项目远比demo复杂。比如某商业分析系统需要动态过滤商场数据,这时就要活用L.geoJSON的filter参数:
L.geoJSON(data, {
filter: function(feature) {
// 只显示评分大于4星的商场
return feature.properties.rating >= 4;
},
onEachFeature: (feature, layer) => {
layer.bindPopup(`${feature.properties.name}
评分: ${feature.properties.rating}`);
}
}).addTo(map);避坑指南:那些年我们踩过的GeoJSON地雷
| 错误现象 | 根本原因 | 解决方案 |
|---|---|---|
| 地图空白+控制台报错 | 文件路径错误或跨域问题 | 用VS Code Live Server本地调试,或配置CORS |
| 图形位置偏移到海洋 | 经纬度顺序颠倒(应为[经度,纬度]) | 用QGIS打开源文件检查坐标系 |
| 属性字段显示undefined | properties对象缺失或字段名大小写错误 | console.log(feature)逐层展开检查 |
终极心法:把GeoJSON当对话对象而非数据尸体
GeoJSON解析的本质,是教会计算机理解人类的空间语言。下次遇到报错,别急着Google,先问自己三个问题:我的数据骨架完整吗?每个器官摆放正确吗?血液成分合格吗?这套思维框架,能让你在WebGIS开发中少走三年弯路。
你在解析GeoJSON时踩过什么奇葩的坑?或者有什么独门调试技巧?评论区留下你的故事——点赞最高的三位,送你《GeoJSON规范速查手册》电子版(含常见错误对照表)!
-
ArcPy能做什么副业?GIS数据处理接单实战攻略(附:需求渠道清单) 2026-03-03 08:30:02
-
安睿驰数据如何批量处理?ArcPy自动化方案帮你解放双手(含:代码模板) 2026-03-03 08:30:02
-
安若初裴翊在GIS数据处理中能用ArcPy解决吗?(附:批量处理脚本) 2026-03-03 08:30:02
-
ArcPy如何批量处理安然产品数据?GIS自动化巡检方案(含:脚本源码) 2026-03-03 08:30:02
-
ArcPy如何批量处理平安产品带图片?GIS属性关联与自动化制图全解(附:完整代码) 2026-03-03 08:30:02
-
批量处理GIS数据太慢?ArcPy自动化脚本开发教程(附:常用代码集) 2026-03-03 08:30:01
-
ArcPy批量处理数据卡顿?优化脚本运行效率的实战技巧(附:代码模板) 2026-03-03 08:30:01
-
城乡规划数据批量处理太慢?ArcPy脚本自动化方案(含:蔼若春代码实例) 2026-03-03 08:30:01
-
安仁承坪腰鼓队GIS空间分析,ArcPy门票数据自动化怎么搞?(附:Python脚本) 2026-03-03 08:30:01
-
ArcGIS入门学习路径怎么规划?新手必备资源包(含:软件安装与操作手册) 2026-03-03 08:30:01
-
ArcGIS学习效率低怎么办?独家整理从入门到精通的实战心法(附:工具包) 2026-03-02 08:30:02
-
ArcGIS自学从入门到精通有多难?GIS研习社独家资源包(含:实战案例) 2026-03-02 08:30:02
-
ArcGIS学习效率低?arcgis基础教程视频合集(含:练习数据) 2026-03-02 08:30:02
-
ArcGIS实战教程:空间分析结果总是出错?排查思路与核心参数详解!(附:检查清单) 2026-03-02 08:30:02
-
ArcGIS初学总报错?环境配置和工具箱核心操作避坑指南(含:参数速查表) 2026-03-02 08:30:02
-
新手入门ArcGIS学习卡壳?arcgis基础教程实操详解(附:数据集) 2026-03-02 08:30:02
-
ArcGIS模型构建器总是报错?高效自动化制图的流程优化方案(附:脚本工具箱) 2026-03-02 08:30:02
-
ArcGIS初学者如何快速上手?掌握这4大核心功能与实操技巧(附:学习路线图) 2026-03-02 08:30:02
-
ArcGIS零基础入门如何避坑?实战教学路线图(附:数据练习包) 2026-03-02 08:30:02
-
QGIS学习中如何处理dwg文件,附:CAD数据无缝衔接与坐标纠正常见问题集 2026-03-02 08:30:02