☰
世界国家GeoJSON数据集:WGS84坐标基准与拓扑校验实践指南
2026/10/21 4:06:11 网站建设 项目流程

简介:本资源是一套覆盖全球所有国家及地区的标准GeoJSON地理边界数据集,面向GIS开发人员、数据可视化工程师、前端地图应用开发者及地理信息相关专业学习者,用于快速集成高精度行政区域轮廓至Web地图、空间分析或教学演示项目。数据源自权威开源项目“Natural Earth”,经标准化处理,确保多边形拓扑正确、视觉协调,适配Leaflet、Mapbox、ECharts等主流可视化框架。压缩包共2000个文件,主体为3442个按国家/地区命名的GeoJSON文件(如USA.geo.json、RUS.geo.json、IDN.geo.json等),辅以2个说明文档(md)和1份UNLICENSE开源协议,总大小仅1.69MB,轻量易集成。目前已有3695人学习下载,开箱即用,无需额外清洗或坐标转换,可直接加载至GIS软件或JavaScript环境进行区域着色、交互高亮、人口热力叠加等典型应用。

1. 世界国家 GeoJSON 全集:不是“拿来就能画图”的万能底图,而是你 GIS 流程里最常被低估的坐标基准层

你是不是也试过:用某开源地图库加载一个world.json,结果发现中国南海诸岛没显示、法国海外省位置错乱、格陵兰岛面积膨胀到离谱、甚至俄罗斯西伯利亚部分区域直接“消失”?这不是代码写错了,是 GeoJSON 数据源本身就有隐性缺陷——坐标系不统一、拓扑未校验、边界版本陈旧、多边形嵌套逻辑混乱。这份「世界国家 GeoJSON 大全(old)」不是新鲜发布的标准数据包,而是一份经多年工程验证、覆盖 250+ 主权实体与争议区域的稳定快照版地理数据集。它不追求最新政治变动(如新承认国家),但胜在每一份.geojson文件都通过topojson拓扑校验、ogr2ogr坐标系强制归一化(WGS84 / EPSG:4326)、mapshaper边界简化保形处理。适合做离线 GIS 分析底图、D3.js 可视化静态基底、QGIS 批量裁切参考、或作为你训练地理语义分割模型时的 mask 生成依据。如果你正卡在“地图渲染对不上实际国界”“GeoJSON 加载报 topology error”“不同国家 polygon 无法 union 合并”这类问题上,这份数据不是“又一个下载链接”,而是你调试链路里缺失的那块坐标锚点。


2. 数据结构解析与坐标系确认:为什么必须先看crs字段和bbox范围?

GeoJSON 规范虽小,但字段语义极重。尤其当你要把这份“大全”接入真实项目时,跳过结构校验等于埋雷。这份数据集虽标注为 “old”,但其内部结构设计反而更贴近生产环境需求:所有文件均显式声明crs(尽管 GeoJSON RFC 7946 已弃用该字段,但旧工具链仍依赖),且每个 Feature 的geometry.coordinates层级严格遵循 WGS84 经纬度顺序(lon, lat),无反向或混合坐标系混用。

2.1 文件组织逻辑:按主权实体 + 行政层级分层,非简单国家列表

数据包解压后呈现三级目录结构:

world_geojson_old/ ├── countries/ # 主权国家(含争议实体,如科索沃、巴勒斯坦) │ ├── china.geojson │ ├── usa.geojson │ └── ... ├── dependencies/ # 海外领地、自治邦(如法属波利尼西亚、百慕大) │ ├── french-polynesia.geojson │ └── ... └── disputed/ # 明确标注边界的争议区域(如克什米尔、南奥塞梯) ├── kashmir.geojson └── ...

提示:disputed/目录下文件不含主权主张,仅提供联合国地图服务中常用边界的几何表达,用于可视化对比,不可作为法律依据。所有文件名均采用 ISO 3166-1 alpha-2 小写编码(如cn.geojson,us.geojson),便于程序批量读取。

2.2 验证 CRS 与坐标范围:两行命令筛出“假 GeoJSON”

很多所谓“世界 GeoJSON”实为 Web Mercator(EPSG:3857)投影坐标,直接丢进 D3 或 Leaflet 会严重变形。本数据集每份文件均通过以下脚本批量验证:

# 检查是否含 crs 字段(兼容旧规范) jq -r '.crs.properties.name // "NO_CRS_FIELD"' china.geojson # 提取 bbox 并验证是否在 WGS84 合理范围内(经度 -180~180,纬度 -90~90) jq -r '.bbox | select(length == 4) | "minLon: \(.[0]) | minLat: \(.[1]) | maxLon: \(.[2]) | maxLat: \(.[3])"' china.geojson

预期输出:

urn:ogc:def:crs:OGC:1.3:CRS84 minLon: 73.5 | minLat: 18.0 | maxLon: 135.5 | maxLat: 53.5

若crs返回NO_CRS_FIELD,或bbox中出现minLon > 180、maxLat > 90等值,说明该文件已被错误重投影,应立即剔除。我一般会用ogr2ogr -t_srs EPSG:4326 -s_srs EPSG:3857 fixed.cn.geojson cn.geojson强制重导出,但本数据集 99% 文件无需此步。

2.3 Feature 属性字段标准化:properties里藏着你真正需要的元数据

每个国家 Feature 的properties不止有name和iso_a2,还包含工程强相关的 5 个关键字段:

字段名类型示例用途
iso_a2string"CN"国家双字母码,适配大多数 API
iso_a3string"CHN"三字母码,用于国际数据库关联
name_enstring"China"英文名,避免本地化歧义
name_localstring"中华人民共和国"本地名称,用于标注
pop_estnumber1412600000估算人口(2020 年基准),可用于 choropleth 渲染

这些字段在countries/下全部存在;dependencies/中pop_est为null;disputed/中仅保留name_en和iso_a2(若适用)。不要手动补全缺失字段——人口数据需匹配对应年份统计口径,强行填入会导致分析偏差。


3. 实战加载与常见渲染问题:D3.js + TopoJSON 转换避不开的四个断点

即使数据源干净,前端加载仍可能翻车。D3 v7 默认使用 TopoJSON 2.x,而很多老教程教的d3.json()直接读 GeoJSON 在复杂多边形上会触发内存溢出。本节以 D3 + HTML 页面为例,给出可复现的最小可行路径,并直击四个高频断点。

3.1 从 GeoJSON 到 TopoJSON:为什么必须转?怎么转才不丢精度?

GeoJSON 是人类可读格式,但体积大、冗余多;TopoJSON 通过共享弧段压缩体积(通常缩小 80%+),且内置拓扑一致性保障。转换命令如下:

# 安装 topojson-cli(需 Node.js) npm install -g topojson-cli # 转换单个国家(保留所有属性) topojson -p -o china.topo.json -- china.geojson # 合并多国为 world.topo.json(关键!避免后续 union 失败) topojson -p -o world.topo.json -- countries/*.geojson

参数说明:
-p:保留properties字段(默认会被 strip)
--:分隔 topojson 参数与输入文件列表
合并时务必用countries/*.geojson,而非*.geojson—— 若混入disputed/中文件,其坐标范围可能超出主世界 bbox,导致topojson自动裁剪失真。

3.2 D3 加载 TopoJSON:对象访问路径陷阱

TopoJSON 结构与 GeoJSON 不同,objects下才是真正的 geometry 集合。常见错误写法:

// ❌ 错误:试图像 GeoJSON 一样直接取 features d3.json("world.topo.json").then(data => { const countries = data.features; // → undefined! }); // ✅ 正确:先取 objects,再取具体键名(由 topojson 命令指定,默认为 filename 去后缀) d3.json("world.topo.json").then(data => { const countries = topojson.feature(data, data.objects["world"]); // 注意:若用 topojson -o world.topo.json -- *.geojson,objects 键名为 "world" });

若你用topojson -o world.topo.json -- china.geojson usa.geojson,则data.objects下键名为"china-usa",需手动指定。建议统一用--id-property iso_a2并设--output-world生成标准 world 对象。

3.3 渲染时 SVG Path 报错:NaN坐标与闭合环断裂

即使 TopoJSON 加载成功,d3.geoPath()渲染仍可能报Error: Invalid value for <path> attribute d="M NaN,NaN ..."。根本原因有两个:

  1. 坐标超出浮点精度范围:WGS84 经纬度小数位过多(如116.40739632154321),D3 计算投影时溢出;
  2. Polygon 未闭合:某些国家边界(如加拿大与美国接壤段)在原始数据中首尾坐标不完全重合。

解决方案是预处理 TopoJSON:

# 使用 mapshaper 强制闭合、简化、四舍五入坐标到 5 位小数(足够全球尺度) mapshaper world.topo.json -snap -round 5 -o world.clean.topo.json

-snap参数会将距离 < 0.00001° 的点自动吸附,修复微小断裂;-round 5防止浮点误差累积。这是我在某跨平台系统中跑通 200+ 国家渲染的血泪经验——不加这步,格陵兰、俄罗斯西伯利亚必出NaN。


4. 避坑:GeoJSON 数据集成中五个真实翻车现场与后悔药

这些不是理论假设,而是我在某高校地理信息实验室支持三个学生项目时,反复遇到并记录的硬核问题。每一条都附带现象 → 原因 → 解决闭环,拒绝玄学。

4.1 现象:中国南海诸岛在 QGIS 中显示为孤立小点,放大后坐标全为(0,0)

原因:原始china.geojson中南海诸岛被定义为Point类型 Feature,而非MultiPolygon;且其coordinates值为[0,0]占位符(数据制作者为规避争议未填充真实坐标)。
解决:删除china.geojson中所有geometry.type === "Point"的 Feature;或从disputed/south-china-sea-islands.geojson单独加载(该文件含真实经纬度,已校验)。

4.2 现象:法国在 Leaflet 中显示为两块分离区域(本土 + 海外省),但properties.iso_a2均为"FR"

原因:法国海外省(如马提尼克、法属圭亚那)在countries/目录下无独立文件,其几何被合并进fr.geojson,但geometry.type为MultiPolygon,Leaflet 默认不识别多部件渲染。
解决:用turf.explode()拆解 MultiPolygon 为多个 Polygon,再逐个添加图层;或改用L.geoJSON(data, {filter: f => f.geometry.type === 'Polygon'})过滤。

4.3 现象:用d3.geoEquirectangular()投影时,俄罗斯西伯利亚地区严重拉伸变形

原因:Equirectangular 投影在高纬度失真极大;而russia.geojson包含北纬 70°+ 的楚科奇自治区,其原始坐标未做等积投影补偿。
解决:切换为d3.geoNaturalEarth1()或d3.geoOrthographic().rotate([0, -20]);若必须用 Equirectangular,则对高纬度区域单独scale(0.7)缩放 SVG Group。

4.4 现象:topojson.mesh()生成国界线时,相邻国家交界处出现 1px 白缝

原因:TopoJSON 的mesh仅基于共享弧段生成,但若两国边界在原始 GeoJSON 中未严格共用顶点(如一方用 10 个点,另一方用 12 个点描述同一段线),mesh无法智能对齐。
解决:用mapshaper -lines -simplify 10%先对所有国家 GeoJSON 做统一线条简化,再合并为 TopoJSON;或改用topojson.mesh(data, data.objects.world, (a, b) => a !== b)强制全连接。

4.5 现象:在 Three.js 中加载world.topo.json作为地形基底,GPU 内存爆满崩溃

原因:TopoJSON 未简化,单个国家 Polygon 顶点数超 50 万(如加拿大含海岸线细节);Three.js BufferGeometry 无法高效处理。
解决:用geojson-vt动态切片,或预处理:mapshaper world.topo.json -simplify 20% -o world.lowres.topo.json;顶点数降至 5 万内,帧率从 2fps 升至 30fps。


5. 进阶技巧:用geojson-merge构建自定义区域组合体,绕过 TopoJSON 合并限制

当你需要“东盟十国”“金砖国家”“RCEP 成员国”这类非主权实体组合图层时,别急着手写FeatureCollection——geojson-merge工具能自动化完成,且保留原始属性完整性。它比topojson更适合动态组合场景,因为不强制拓扑一致,只做几何叠加。

5.1 安装与基础用法:三步生成asean.geojson

# 1. 全局安装(需 Node.js) npm install -g geojson-merge # 2. 准备国家列表(asean-codes.txt) echo -e "vn\ncn\nmy\nth\nid\nph\nsg\nmm\nkh\nla" > asean-codes.txt # 3. 批量读取并合并(注意路径匹配) cat asean-codes.txt | xargs -I {} sh -c 'echo "countries/{}.geojson"' | xargs geojson-merge -o asean.geojson

关键参数说明:
xargs -I {}:将每行代码注入{}占位符
sh -c 'echo "countries/{}.geojson"':构造完整文件路径,避免空格或特殊字符报错
geojson-merge默认保留所有properties,冲突字段(如name_en)会以最后读入的文件为准

5.2 处理属性冲突:当多国pop_est需求聚合而非覆盖

geojson-merge默认覆盖同名字段,但人口、面积等需累加。此时用--reduce模式:

# 创建 reduce 脚本 merge-reduce.js cat > merge-reduce.js << 'EOF' module.exports = function(merged, current) { // 累加人口,其他字段取第一个 merged.pop_est = (merged.pop_est || 0) + (current.pop_est || 0); merged.area_km2 = (merged.area_km2 || 0) + (current.area_km2 || 0); if (!merged.name_en) merged.name_en = current.name_en; return merged; } EOF # 执行聚合合并 geojson-merge --reduce ./merge-reduce.js -o asean-aggregated.geojson countries/vn.geojson countries/my.geojson ...

5.3 验证合并结果:用geojsonhint检查几何合法性

合并后必须验证,否则下游工具(如 Turf.js)调用turf.union()会静默失败:

npm install -g geojsonhint geojsonhint asean.geojson

正常输出应为:

✓ Valid GeoJSON ✓ All geometries are valid ✓ No self-intersections found

若报Invalid geometry: self-intersection,说明某两国边界在合并时产生重叠环——此时需回到mapshaper asean.geojson -clean -o asean.clean.geojson修复。

从那以后我每次构建组合区域,都强制走一遍geojsonhint+mapshaper -clean双校验,哪怕多花 30 秒。因为一次turf.union()崩溃,可能浪费你两小时 debug 时间。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询