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规范速查手册》电子版(含常见错误对照表)!
-
GIS坐标系总是搞混?各行业投影选择与WGS84、CGCS2000转换实战技巧(含:对照表) 2026-01-14 08:30:02
-
GIS坐标系位置总对不上?三步搞定数据偏移修正(附:参数对照表) 2026-01-14 08:30:02
-
GIS坐标系6位转8位总出错?核心算法与精度提升技巧详解(附:参数对照表) 2026-01-14 08:30:02
-
GIS坐标系转换为何总出错?常见误区排查与修正方案(附:对照表) 2026-01-13 08:30:02
-
GIS坐标系转换总出错?核心参数与校正流程详解(附:参数表) 2026-01-13 08:30:02
-
GIS坐标系怎么设置?从定义到投影转换的实战指南(附:参数对照表) 2026-01-13 08:30:02
-
GIS坐标系到底用哪个?盘点国内主流坐标系及转换技巧(附:参数表) 2026-01-13 08:30:02
-
GIS坐标系转换工具怎么选?高精度投影转换实战技巧(附:对照表) 2026-01-13 08:30:02
-
GIS坐标系到底怎么选?一文搞懂投影与转换(含:常用参数表) 2026-01-13 08:30:02
-
GIS坐标系与投影傻傻分不清?GIS中地理坐标系转投影坐标系实战指南(含:常用投影参数表) 2026-01-13 08:30:01
-
GIS坐标系与投影总是报错?ArcGIS坐标定义与转换参数详解(附:对照表) 2026-01-13 08:30:01
-
GIS坐标系与投影总报错?地理坐标系和投影坐标系的核心区别(含:转换公式) 2026-01-13 08:30:01
-
WGS84坐标系转换CGCS2000总出错?原理剖析与实战转换步骤(附:常用GIS软件参数表) 2026-01-13 08:30:01
-
ArcGIS地理坐标系和投影坐标系有何区别?一文读懂核心差异与转换技巧(含:实战案例) 2026-01-12 08:30:02
-
ArcGIS坐标系选择总出错?一文搞懂GIS地理坐标与投影转换(附:常用参数对照表) 2026-01-12 08:30:02
-
WGS84坐标系如何正确选择投影?常用GIS投影坐标系推荐(含:EPSG代码与参数) 2026-01-12 08:30:02
-
GIS投影后坐标没变化?定义坐标系与投影工具使用误区详解(附:对照表) 2026-01-12 08:30:02
-
GIS投影总报错?WGS84转CGCS2000实战步骤与参数详解(附:坐标系对照表) 2026-01-12 08:30:02
-
GIS投影坐标总是偏移?一分钟搞定坐标系定义与转换(附:高精度参数表) 2026-01-12 08:30:02
-
GIS坐标系与投影总出错?盘点常见投影变形问题与修正方案(附:WGS84与CGCS2000转换参数表) 2026-01-12 08:30:02