简介:世界国家GeoJSON大全压缩包提供覆盖全球各国家与地区的多边形边界数据,面向GIS开发者、前端可视化工程师和数据新闻报道者,解决在Web地图、可视化大屏或地理分析中快速获取各国矢量底图的难题。包内共3446个文件,其中3442个JSON地理数据文件,包含全球汇总文件,也按国家或区域拆分为多个独立JSON,如美国、加拿大、俄罗斯、南极等;另有2个Markdown说明文档和许可证文件,整体体积仅1.87MB,加载轻量、调用方便。数据来自自然地球项目,经过筛选和格式优化,保留适当边界细节,适合屏幕展示和轻量分析,可直接嵌入常见前端地图库或数据可视化方案,免去自行爬取、纠偏与裁剪等繁琐的预处理步骤。已有3058人学习下载,无论是快速原型还是正式项目,都能提供可靠的基础底图并节省前期准备时间。
1. GeoJSON 让地图边界不再锁在格式黑匣子里:这份全球国家数据能直接喂给前端与 GIS
做可视化项目时最闹心的事情之一,就是明明拿到了地图数据,却因为格式不兼容、坐标轴反了、边界精度太大,导致折腾半天页面还是一张白板。GeoJSON 这种基于 JSON 的地理数据格式,恰恰是打通「数据」和「地图」最常用的一条路。这份《世界国家 geojson 大全》把全球各国的边界轮廓整理成了标准地图 json 数据,省去你满世界找数据、清洗转化的时间。它适合三类人:前端做 ECharts/Leaflet 地图可视化的开发者、GIS 分析需要行政边界做空间运算的从业者,以及做数据产品原型需要一份干净底图的同学。接下来我会从数据结构讲起,到实际读取筛选,再到踩坑记录和验证手法,把它拆成一条能直接落地的路径。
2. 先看懂数据再动手:GeoJSON 的结构、坐标约定与裁剪边界
2.1 FeatureCollection 与 Geometry 的类型矩阵
拿到 zip 解压后,里面是多个.geojson文件,每个文件或包含一个国家,或按大洲归类。打开任何一个文件,外层一定是一个 JSON 对象,type 字段为FeatureCollection,这是 GeoJSON 的顶层容器。它的核心成员是features数组,数组里每个元素是一个独立的 Feature 对象,代表一个国家或地区的矢量边界。
每个 Feature 对象内部又有两个关键字段:geometry描述形状,properties存放非空间属性。geometry 的类型在边界数据里最常见的是Polygon和MultiPolygon。Polygon 表示一个由闭合环组成的单一面状区域,而 MultiPolygon 则由多个 Polygon 组成——比如一个国家拥有多个不相连的岛屿,就必须用 MultiPolygon 表示。俄罗斯、美国这类领土分散的国家,MultiPolygon 出现的频率非常高。
区分这两者很重要,因为处理时如果你的代码只假设输入是 Polygon,一旦遇到 MultiPolygon 就会抛异常或渲染出残缺图形。所以拿到数据后第一件事不是急着塞进地图组件,而是先遍历所有 feature,统计 geometry.type 的分布情况。这一步的花费不到五分钟,却能帮你避开后面很多「玄学 bug」。
2.2 EPSG:4326 坐标系与经纬度顺序陷阱
这份资源里的数据普遍采用 WGS 84 坐标系,在 GeoJSON 中表现为 EPSG:4326。直观地说,坐标数组里第一个数字是经度 longitude,第二个是纬度 latitude。这看起来简单,但实际处理时恰好是最容易翻车的地方。
陷入混乱的常见时刻有两个:一是从某些 GIS 软件导出的数据,内部使用x, y或lat, lng顺序,导出成 GeoJSON 时没有做字段映射,导致经度纬度互换。二是你在写 Python 处理脚本时,随手把坐标当作(lat, lng)来做循环,等到绘制时才发现整个国家的形状被镜像翻转。
判断数据是否坐标对调,有一个快速方法:用文本编辑器打开文件,随机挑一个点,比如看中国的边界坐标。中国的经度范围大约在东经 73 到 135 度,纬度在北纬 18 到 53 度。如果某个中国区域的坐标第一个数字落在 18~53 之间,第二个数字落在 73~135 之间,那说明坐标顺序写反了。反之则是正常的。这个检查只需要十秒钟,但能救回一整天的排错时间。
还有一个细节:GeoJSON 规范要求坐标必须按[经度, 纬度]顺序写入,但不同解析库对非法顺序的容忍度不一样。个别库会静默接受反序数据,渲染出来只是形状变形;另一些库则直接抛错中断。所以提前检验数据格式,比事后猜原因高效得多。
3. 把数据落进项目:Python 读取、筛选与写回的三步流程
3.1 第一步:用 geojson 库把文件读成可操作对象
拿到这份全球国家数据后,我一般是直接用 Python 处理,因为它生态成熟、处理方便。首选是geojson库,轻量且符合规范。先安装依赖,再写一个读取函数:
import geojson def load_geojson(filepath): with open(filepath, 'r', encoding='utf-8') as f: data = geojson.load(f) return data # 示例:读取亚洲区域的数据文件 asia_data = load_geojson('asia.geojson') print(asia_data.type) # FeatureCollection print(len(asia_data.features)) # feature 数量这个函数做的事情很简单:用geojson.load()读取 JSON 文件并解析为 FeatureCollection 对象。注意打开文件时要显式指定utf-8编码,因为很多 GeoJSON 文件的属性字段里带中文或法语字符,如果让 Python 用系统默认编码读取,极容易出现UnicodeDecodeError或乱码。
拿到对象之后,len(asia_data.features)能告诉我们这个文件里包含多少个国家或地区。这个数字就是你后续处理的基础,也方便你核对数据是否完整。
3.2 第二步:按国家/地区筛选与属性裁剪
实际做项目时,我们往往只需要其中几个国家,而不是整个大洲。这时筛选就很重要。Properties 字段通常是筛选的依据,但这个资源的属性字段命名不统一,有的文件用name,有的用NAME,有的用sovereignt。所以写筛选逻辑之前,我一般会先打印前几个 feature 的 properties 键名:
# 查看前两个 feature 的属性键 print(asia_data.features[0].properties) print(asia_data.features[1].properties)确认键名后,再按名称筛选需要保留的国家。比如要提取中国和日本:
target_names = {'China', 'Japan'} selected_features = [] for feature in asia_data.features: # 兼容不同键名,取到国家名称 country_name = feature.properties.get('name') or feature.properties.get('NAME') if country_name in target_names: selected_features.append(feature) print(f"筛选到 {len(selected_features)} 个 feature")这段代码的关键是兼容不同的属性键名。直接用or兜底,如果没有name键就尝试NAME键,这样就不会因为某个文件的属性命名不一致而漏掉数据。
筛选后得到的是一个 feature 列表,而很多地图库要求输入一个合法的 FeatureCollection 对象。所以还需要把这个列表包装回 FeatureCollection:
from geojson import FeatureCollection subset = FeatureCollection(selected_features) print(subset.is_valid) # 校验对象合法性is_valid是 geojson 库提供的校验方法,能检查坐标是否缺失、类型是否合法。这一步看似多余,实际上能拦截住 90% 的几何结构错误。
3.3 第三步:导出清洗后的子集文件
筛选完成后,把子集数据写回磁盘。这里有一个容易踩的坑:直接json.dump虽然也能写,但默认会使用紧凑模式,缩进为 0,生成的文件极难用文本编辑器排查。我习惯保留缩进并确保非 ASCII 字符不被转义:
out_path = 'subset_china_japan.geojson' with open(out_path, 'w', encoding='utf-8') as f: geojson.dump(subset, f, indent=2, ensure_ascii=False) print(f"已写入 {out_path}")indent=2让每个层级的键值对缩进两个空格,方便人工审阅;ensure_ascii=False保证属性里的中文以可读形式存在,而不是\u4e2d\u56fd这类转义序列。如果不设置这个参数,后续排查时会非常痛苦。
导出后可顺手检查文件大小,确认输出不是异常庞大或过小。比如选中中国和日本这两个国家时,正常产物应该在几百 KB 量级,取决于边界精度。
4. 避坑指南:从坐标翻车到属性错位的四类实战问题
4.1 经纬度顺序写反导致地图镜像
现象:在 Leaflet 上加载某个国家的边界后,发现图形左右翻转,像照镜子一样。国境线与实际地理位置对不上,部分区域跑到海里。
原因:这就是典型的经纬度顺序写反。GeoJSON 规范要求[经度, 纬度],但很多来源的数据是[纬度, 经度]。如果这份资源里某个文件是从旧版 GIS 工具导出的,没有经过坐标轴转换,就会发生这种问题。
解决:用坐标范围校验法判断是否反转。写一段简短的检查脚本,取所有坐标点算出最大最小值,再与目标国家的真实经纬度范围比对。如果反了,用坐标交换逻辑矫正:
def swap_coordinates(feature): """把 geometry 里所有坐标的经纬度对调""" geometry = feature.geometry if geometry.type == 'Polygon': for ring in geometry.coordinates: for idx, coord in enumerate(ring): ring[idx] = [coord[1], coord[0]] elif geometry.type == 'MultiPolygon': for polygon in geometry.coordinates: for ring in polygon: for idx, coord in enumerate(ring): ring[idx] = [coord[1], coord[0]] return feature注意上面的代码只处理了 Polygon 和 MultiPolygon 两种类型,如果数据里混有 LineString 或 Point,需要另外做类型判断。所以这个修复函数在使用前,最好先跑一遍类型统计,确认所有 feature 的类型都在处理范围内。
4.2 边界精度过高导致文件膨胀
现象:一个国家的 GeoJSON 文件达到几十甚至上百 MB,加载到浏览器后卡顿明显,拖动地图掉帧严重。
原因:边界数据包含了过多的坐标点。这份资源如果源自高精度的测绘数据,某些国家边界的坐标点密度可能非常高。地理可视化并不需要那么高的精度——屏幕的分辨率有限,过多的点只会拖慢渲染。
解决:对几何边界做简化,比较安全的是使用shapely库的simplify方法。简化时常用的算法是 Douglas-Peucker,用一个容差参数控制简化幅度。容差越大,点越少,边界越粗糙;容差太小则没有效果。一般我建议从 0.01 开始试,逐步增大直到视觉效果与文件大小达到平衡:
from shapely.geometry import shape from shapely.geometry import mapping def simplify_feature(feature, tolerance=0.01): geom = shape(feature.geometry) simplified = geom.simplify(tolerance, preserve_topology=True) feature.geometry = mapping(simplified) return featurepreserve_topology=True是必须的,它保证简化过程中不会出现自相交或拓扑断裂。如果不加这个参数,某些复杂边界可能简化后出现几何错误,渲染出来的图形带缺口。
4.3 MultiPolygon 被拆散导致渲染缺面
现象:地图加载后,某个国家的部分领土缺失,比如一个岛国只剩下了主岛,零散的小岛全部消失。
原因:处理时没有正确遍历 MultiPolygon。有的开发者按 Polygon 的方式处理坐标组,在 MultiPolygon 上只取第一个多边形,后续多边形被丢弃。还有一种情况是拆解 MultiPolygon 后不正确地重组,导致子多边形丢失。
解决:处理几何时统一用类型判断分支。先判断是不是 MultiPolygon,再逐个子多边形操作。比如计算面积时,要把所有子多边形面积加总:
def total_area(feature): if feature.geometry.type == 'Polygon': return polygon_area(feature.geometry.coordinates) elif feature.geometry.type == 'MultiPolygon': total = 0 for polygon_coords in feature.geometry.coordinates: total += polygon_area(polygon_coords) return total这种写法保证了 MultiPolygon 的每个组成部分都被纳入运算,不再出现「半个国家凭空消失」的问题。处理任何几何对象之前,都先确认它的类型,再决定遍历逻辑,这是基本习惯。
4.4 属性字段编码问题导致中文乱码
现象:加载地图时,弹出的 tooltip 或 label 显示乱码,像是ä¸å›½这样的字符。
原因:GeoJSON 文件里的 properties 字段虽然读起来是文本,但实际编码可能不是 UTF-8。如果源数据来自 Windows 平台的工具,很可能用了 GBK 或 GB2312 编码,直接用 UTF-8 解析就会出现乱码。
解决:读取文件时先用二进制模式读取,再用编码检测工具确认,或直接用两种编码分别尝试。比较稳妥的做法是先用chardet检测编码:
with open('file.geojson', 'rb') as f: raw = f.read() detected = chardet.detect(raw) print(detected['encoding'])检测到编码后,再解码并重新序列化为 UTF-8。一旦清洗完成,后续所有脚本统一用utf-8读取,就不会再碰到乱码问题。
从实操角度说,这类数据资源不是一次下载就一劳永逸的。文件内部可能混着不同来源的数据,需要你先花半小时做全量体检,才能安心用于生产环境。上面的四类问题,基本覆盖了这份资源使用中最高频的踩坑场景。
5. 验证与进阶:用可视化工具和拓扑检查给数据做体检
5.1 用 Mapshaper 做快速预览与简化
筛选出需要的国家后,我习惯先用 Mapshaper 做一次可视化体检。Mapshaper 是一个轻量级地图处理工具,可以直接在浏览器网页版导入 GeoJSON,渲染出边界形状。用它看地图,几秒钟就能判断坐标顺序是否正常、边界是否有畸形、岛屿是否完整。
Mapshaper 还提供了交互式的简化功能,拖动精度滑块能直观看到不同参数下的边界效果。如果觉得 shapely 的 simplify 参数不好把握,先在 Mapshaper 里调出合适的精度值,再回头用对应容差跑代码,这样更可控。
5.2 用 shapely 做拓扑一致性验证
单纯看图形还不够,还要验证几何对象本身的拓扑一致性。常见的验证维度包括:边界是否闭合、是否有自相交、坐标系单位是否正确。shapely 提供了is_valid属性,能捕捉到大部分几何结构问题:
from shapely.geometry import shape for feature in subset.features: geom = shape(feature.geometry) if not geom.is_valid: print(f"无效几何: {feature.properties.get('name', 'unknown')}") # 尝试修复 cleaned = geom.buffer(0) print(f"修复后 valid: {cleaned.is_valid}")这段代码遍历所有 feature,找出is_valid为 False 的几何对象,并用buffer(0)技法修复。buffer(0)是 GIS 处理里常用的「后悔药」,它会对几何对象做一次自我缓冲,从而消除细小的自相交和无效环。注意这个操作会让数据体积小幅膨胀,使用后最好再依赖简化步骤压缩一次体积。
5.3 用 Leaflet 渲染前自测三个指标
当数据通过拓扑检查后,最后一步是在真实渲染环境里做验收。我用 Leaflet 简单加载一下,重点看三个指标。
第一个指标是图形完整度:放大到岛屿密集区域,确认没有丢岛、缺边的情况。第二个指标是对齐度:把 GeoJSON 图层叠加到底图瓦片上,看边界是否与底图重叠,如果脱离严重,说明坐标系统不匹配。第三个指标是响应速度:在地图上平移缩放,观察是否有明显卡顿,如果交互掉帧,说明简化力度不够,需要提高容差重新生成。
fetch('subset_china_japan.geojson') .then(res => res.json()) .then(data => { L.geoJSON(data, { style: { color: '#3388ff', weight: 1, fillOpacity: 0.3 } }).addTo(map); });这段前端代码加载了清洗后的 GeoJSON 并渲染到 Leaflet 地图上。L.geoJSON是 Leaflet 自带的方法,能直接把 FeatureCollection 对象映射为矢量图层。注意 fetch 请求本地文件在部分浏览器会被拦截,建议本地起一个静态服务来预览,而不是直接双击打开 HTML。
从那以后,我每次拿到新的 GeoJSON 数据都会强制走一遍这套流程:先查坐标系,再筛属性,然后做拓扑检查,最后用工具可视化验收。四个步骤看起来繁琐,但至少能让人安心——因为地图数据出错不像普通 bug 那么直观,往往等你上线了才发现边界对不上,那时候要改的就不是数据而是整个可视化逻辑了。希望这份拆解能帮你在同类数据资源上少走弯路。
本文还有配套的精品资源,点击获取