简介:一套覆盖全球各国/地区的地图GeoJSON数据包,面向前端开发者、GIS爱好者及数据可视化工程师,用于快速获取行政区划边界多边形,省去自行抓取或整理地图数据的步骤。数据源自Natural Earth,经整理后按国家/地区拆分为独立JSON文件,可直接用于Web地图、地理数据展示、区域统计等场景。资源包采用ZIP封装,约1.69MB,解压后含3400余个JSON文件,另附2份Markdown说明文档与许可文件,体积小巧、目录结构清晰,便于按需加载单个国家地图。目前已吸引3680人浏览/学习,适合需要轻量级、离线可用的世界地图数据的项目,也适合用于快速搭建涉及多国地图的Web可视化或GIS原型。 做数据可视化这几年,我最大的体会就是:地图数据这东西,真不是你想画就能画的。尤其涉及全球维度的时候,光“地图轮廓从哪来”这一件事,就能耗掉你大半天。这份“世界国家geojson大全,各国地图json数据下载”的资源合集,我实际用下来之后,觉得非常有必要专门写一篇文章,把这里面的门道、坑点和实操方法都梳理一遍。
它具体是什么呢?简单说,就是把全世界各个国家和地区的地图边界,做成标准的GeoJSON格式文件,按国家/地区为单位打包整理好,支持离线下载、离线使用。你没看错,就是那种可以直接扔进代码里,配合ECharts、Leaflet、Mapbox这类前端库渲染出来的边界数据。这篇文章我会从GeoJSON格式本身讲起,到数据该怎么校验、怎么用、以及我掉进去过的几个大坑,一次性给你讲明白。
1. 这份“世界国家geojson大全”到底解决了什么问题
1.1 每个做可视化的人都会遇到的“找数据困境”
先说说我为什么会盯上这份资源。之前接了好几个可视化大屏的项目,数据本身不复杂,复杂的是“地图怎么出来”。国内地图还好说,找现成的中国地图GeoJSON比较容易;但一到世界地图,问题就来了:要么数据源分散在一个个零散的帖子和Github仓库里,要么下载下来是乱七八糟的TopoJSON格式,要么精度差得离谱,放大之后边界全是锯齿。
这份“世界国家geojson大全”最大的价值,就是把零散的各国地图数据汇总到了一处。它并不是只给你一个“整个世界”的合并文件,而是把每个国家独立拆开,你可以按需下载。这个设计思路很关键——做全球地图的时候用整体文件,做某个国家的下钻分析时就直接加载单独的国家文件,不用自己写一堆裁剪逻辑。
1.2 从“找数据”到“用数据”的完整闭环
多数做前端的人,拿到GeoJSON之后第一反应是“这玩意儿怎么打开?”。这里要明确一下:GeoJSON本质就是一个JSON文件,只不过它的结构和字段有固定规范,专门用来表达地理要素。
我见过太多人卡在这一步——数据下好了,但不知道怎么验证、怎么在项目里接通。这份资源对于“下载→校验→项目接入”的完整链路是有帮助的,因为它提供的是一个相对标准的目录结构,文件名、编码格式和字段属性都是统一的。相比从各种渠道东拼西凑,使用这份统一的资源,你在做项目的时候能省去大量整理数据的时间,直接把精力投入到业务逻辑上去。对我这种经常要在短期内交付demo的人来说,这就是“开箱即用”的价值所在。
2. 核心前提:看懂GeoJSON这几种“形状”
2.1 GeoJSON的数据结构其实就那几样
很多人被GeoJSON吓到,觉得是某种神秘的GIS专用格式。其实你把它拆开,核心就几个概念:点(Point)、线(LineString)、面(Polygon),以及由它们组合出的“多面(MultiPolygon)”。如果是一个完整的地图文件,最外层通常是FeatureCollection,里面每个Feature代表一个地理实体,比如一个国家或一个省份。
我用大白话解释一下:
- 点:就是一个坐标对,比如
[116.4, 39.9],表示某个经纬度位置。 - 线:一串坐标对按顺序连起来,比如河流、道路。
- 面:一串坐标对首尾闭合,围成一个区域,比如湖泊、国家边界。
- MultiPolygon:多个面组合在一起。这个很常见,因为一个国家的领土就可能包含大陆部分和岛屿,多个不相连的区域就需要用MultiPolygon来表达。
拿到一个GeoJSON文件之后,先看它的顶层的type字段,是FeatureCollection还是Feature,再逐层往下看geometry的type。大多数时候,你只需要关注Polygon和MultiPolygon这两种类型,因为地图里的国家边界和行政区域边界基本都靠它们表达。
2.2 坐标系和坐标“反了”的问题
这是新手最容易踩的坑之一。GeoJSON里坐标的写法是经度在前,纬度在后,也就是[经度, 纬度]。比如北京大概是[116.4, 39.9],不是[39.9, 116.4]。听起来简单,但很多人在手写坐标或处理数据库导出的数据时,会把顺序搞反,结果地图上的点全部跑到海里去了。
还有一个问题是坐标系本身。GeoJSON标准默认使用WGS84坐标系,也就是GPS用的那个经纬度坐标系统。你在国内用的某些地图服务,比如高德、百度,默认坐标是经过偏移加密的(GCJ-02或BD-09),不能直接拿来当GeoJSON用。如果你把自己采集的坐标直接塞进地图里,会发现位置有几百米甚至几公里的偏移。正确做法是:使用GeoJSON时,统一确认坐标是WGS84原始经纬度。
提示:如果边界数据里特别标注了“已纠偏”或“GCJ-02”,就要额外做一次坐标转换,否则叠加到底图上一定对不齐。
2.3 属性字段是“挂”在数据上的信息
除了几何形状,每个Feature还可以带一组属性(properties)。在世界地图GeoJSON里,常见的属性字段包括国家名称(name)、两位国家代码(iso_a2)、三位国家代码(iso_a3)等。这些字段在实际项目中非常有用——比如你要给不同国家着色,可以读取name或iso_a2来做数据关联。如果源数据里缺少iso_a3这种标准编码,而你正好需要和业务数据库里的国家代码做匹配,那就很麻烦。所以下载以后第一件事,就是先看属性字段齐不齐、命名规则是什么。
3. 实操:从下载到在浏览器里画出一张世界地图
3.1 下载之后先检查目录结构和文件编码
这份资源下载下来之后,一般会有两类文件:一类是按国家命名的独立GeoJSON文件,另一类是整个世界合并好的总文件。我的习惯是先建一个专门存放地理数据的目录,比如assets/map/,因为后续做项目时,地图数据文件往往会同时包含世界地图、某个洲的地图、某个单独国家的地图,不分开的话,后期维护特别混乱。
然后是编码问题。早期的很多地图数据文件用的还是ANSI或GBK编码,但现在规范的GeoJSON基本都统一成UTF-8。如果你用文本编辑器打开后看到一堆乱码,八成是编码不匹配。这时候不要直接在代码里加载,先用VS Code或者Notepad++把文件另存为UTF-8格式,能省掉后面很多奇怪的中文乱码问题。
3.2 用QGIS或在线工具快速校验坐标数据
拿到文件之后,不建议直接写代码硬调,先用可视化工具看一眼数据长什么样。我自己常用的方案是QGIS这个桌面GIS软件,拖进去就能直接看到所有图形是否正确、边界有没有异常、会不会出现某个国家的图形跑到了别的地方。如果只是临时看一眼,也可以用支持GeoJSON的在线预览工具,把文件拖进去就能渲染出地图轮廓。
为什么要做这一步验证?因为有些网上流传的GeoJSON文件,坐标边界明显有问题,比如某些岛屿的经纬度写错,导致地图上出现一个“飞走”的小岛。如果是给客户演示时出现这种情况,非常尴尬。校验这一步花不了几分钟,但能让后期省心不少。
3.3 在ECharts里快速接通GeoJSON
前端常见的用法之一,就是配合ECharts做地图图表。ECharts很早就支持通过registerMap接口注册GeoJSON数据。
基本流程分三步:
- 加载GeoJSON文件(可以用
fetch请求,或者直接引入本地文件内容)。 - 调用
echarts.registerMap('world', geoJson)注册地图。 - 在
series里配置type: 'map',把map属性设为刚才注册的名称,比如'world'。
我实际跑下来的代码大致长这样:
fetch('./assets/map/world.geojson') .then(res => res.json()) .then(geoJson => { echarts.registerMap('world', geoJson); const chart = echarts.init(document.getElementById('map-container')); chart.setOption({ series: [{ type: 'map', map: 'world', roam: true, // 允许缩放拖拽 data: [ { name: 'China', value: 100 }, { name: 'United States of America', value: 80 } ] }] }); });这里有一个常见的坑:ECharts里地图数据中国家的name,必须和你要关联的数据里的name完全一致,包括大小写和空格。比如数据里写的是“USA”,但GeoJSON里的name是“United States of America”,那就关联不上,图表上显示的就是空白。最快的排查方式,是在回调里先console.log(geoJson.features.map(f => f.properties.name)),把全部名字打印一下,对照着看你的数据源该用什么作为关联键。
如果项目用的是Leaflet,更简单,直接把GeoJSON丢给L.geoJSON()就能渲染:
const map = L.map('map').setView([20, 0], 2); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map); fetch('./assets/map/world.geojson') .then(res => res.json()) .then(data => { L.geoJSON(data, { style: { color: '#3388ff', weight: 1 } }).addTo(map); });3.4 数据过大时先做顶点简化
你下载下来的世界地图GeoJSON文件,可能动辄几十MB。直接塞进前端页面,首屏加载会非常慢,手机端甚至会卡死。我碰到过一个真实案例,一个完整的全球边界数据文件有50多MB,加载出来页面直接白屏好几秒。
解决方案是“顶点简化”,也就是在地图精度变化不明显的前提下,去掉多余的点。DataV.GeoAtlas这类免费地理数据服务提供的国内地图数据,会考虑到这一点。对于海外的世界地图数据,你可以用mapshaper这款开源命令行工具来做简化:
mapshaper world.geojson -simplify 10% -o world_simplified.geojson-simplify 10%的意思是保留大约10%的顶点。经过处理之后,文件体积可以下降到原来的十分之一甚至更低,但地图轮廓肉眼看不出太大差异。这种优化对在线项目来说非常重要。
4. 实战避坑:这些JSON地图的坑我全踩过
4.1 地图边界不符合预期,先查版本
这里单独提醒一下:世界地图数据会根据政治、外交、地理认知的变化而更新。你要知道的是,不同组织、不同时期发布的地理信息数据,对“某地属于哪个国家”的标注可能不同。在使用任何世界地图数据时,请务务必对边界标注抱有合理预期,处理方式就是把边界数据当作一个纯粹的、用于图形展示的数据源,谈论技术应用即可,避免一切与政治立场和领土主张相关的延伸讨论。我在项目里只把它当可视化素材用,渲染出来用于数据展示,不做任何引申。
4.2 加载失败:跨域问题和JSON解析错误
前端本地打开HTML文件,用fetch加载本地GeoJSON文件时,经常因为浏览器跨域限制直接报错。这不是数据的问题,是浏览器的安全策略问题。解决的方法一般有三种:
- 通过本地开发服务器运行项目,比如
npx serve、python -m http.server这类工具,在http://localhost下访问,就没有跨域限制。 - 把GeoJSON内容直接作为JS变量导出,用
import worldMap from './world'这种方式引用。 - 使用构建工具(如Vite、Webpack)的静态资源处理能力来加载。
另外常见的错误是SyntaxError: Unexpected token,一般原因就是文件不是有效的JSON,比如用记事本编辑后不小心保存成了带有BOM头的格式,或者多了一个逗号。这种错误排查其实不难,把文件内容粘贴到任何一个JSON格式化工具里跑一遍,有错误会直接指出来。
4.3 坐标顺序搞反,图形“满天飞”
前面提到过坐标顺序问题,这里再补充一种情况:有些源数据的边界坐标存储的是[纬度, 经度],而GeoJSON标准要求[经度, 纬度]。如果你下载的数据是从某个旧系统导出的,读取出来之后地图图形会全部乱掉。
这种问题在预览工具里一眼就能看出来,因为图形的位置完全不对,甚至会跨越整个地球。一旦发现,你不能手动改坐标顺序,因为数据量太大了。正确的做法是写一个脚本,遍历所有坐标点,把每对值[x, y]转成[y, x]。用JavaScript或者Python写都行,核心代码就几行:
import json with open('world.geojson', 'r', encoding='utf-8') as f: data = json.load(f) def swap_coords(geom): if geom['type'] == 'Polygon': for ring in geom['coordinates']: for coord in ring: coord[0], coord[1] = coord[1], coord[0] elif geom['type'] == 'MultiPolygon': for polygon in geom['coordinates']: for ring in polygon: for coord in ring: coord[0], coord[1] = coord[1], coord[0] for feature in data['features']: swap_coords(feature['geometry']) with open('world_fixed.geojson', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False)这里要注意:切换坐标时,如果文件里有嵌套多个多边形,一定要逐层递归处理,不能用一次性整体替换的方式,否则容易出问题。
4.4 常见错误速查表
| 表现 | 可能原因 | 排查思路 |
|---|---|---|
| 地图加载后一片空白 | 名称匹配失败或数据未正确注册 | 打印GeoJSON的name列表,核对数据源 |
| 图形位置不对,出现在海里 | 经纬度顺序颠倒 | 用预览工具确认,写脚本批量交换坐标 |
| 文件里有方块乱码 | 文件编码不是UTF-8 | 用编辑器强制转成UTF-8 |
| 页面加载卡顿 | 顶点数太多,文件过大 | 用mapshaper简化,保留5%-10%顶点 |
| 中文国家名显示为乱码 | 编码不一致或字体问题 | 统一UTF-8,检查前端传入数据编码 |
| 下载后打不开 | 文件不完整或格式损坏 | 用JSON格式化工具校验结构 |
5. 我的一点个人经验
这份资源我在项目里用了不下三次。第一次是给客户做一个全球业务分布图,客户明确要求“离线也能打开”,这就必须用本地GeoJSON,不能依赖在线瓦片和远程地图服务。当时我拿到这份大全的数据,先做了简化处理,再在页面里把地图渲染出来,整个流程非常顺畅。
第二次是做一个国家下钻的demo,需要用到一个国家的单独数据。我当时担心数据里只有几何信息,缺少国家代码,结果打开properties一看,字段还都比较完整,省了我不少对齐数据的功夫。
如果要在最后分享一点心得,我想说:做地图可视化,数据质量和数据格式是基础,业务效果好不好,很大程度就压在这上面。这份“世界国家geojson大全”给了一个很不错的起点,但你在任何项目里真正使用的时候,都不能跳过校验和简化这两个步骤。一次花十几秒的数据预览,可以帮你免去无数个因边界异常、坐标偏移导致的深夜加急修复。
另外,把常用的GeoJSON文件和对应的属性字段整理成自己的小工具库,是个受益终身的习惯。你永远不知道下一个项目会在哪个环节追问你“能不能把某个国家单独高亮”,到那个时候,你会感谢今天认真整理过数据的自己。
本文还有配套的精品资源,点击获取