简介这份资源面向地理信息开发、地图可视化与GIS教学研究者提供覆盖全球国家边界的世界地图GeoJSON数据集可用于构建交互式世界地图、开展地理空间分析或作为服务端地理信息API的数据基础。压缩包共约2000个文件以3443个json文件为主整体仅2.1MB体积轻量便于快速加载与二次处理文件按国家与地区拆分包含国家整体边界及部分岛屿、州级细分数据采用WGS84坐标系统属性字段可承载国家名称、首都、人口等非几何信息。目前已有4730人学习下载适合前端地图库集成、离线地图应用开发及教学演示等场景。读者可据此完成国家边界渲染、区域面积计算、地理编码与反编码等任务并借助清晰的目录结构按需检索目标国家数据快速搭建从可视化展示到空间分析的应用链路。1. 世界地图 GeoJSON 数据选型从一张全球底图到国家级边界做数据可视化或 GIS 前端的朋友大概率都经历过这样的场景产品经理丢过来一句“给我做个世界地图点哪个国家高亮哪个”你打开搜索引擎发现 GeoJSON 文件满天飞下载下来一跑要么边界缺一块要么某个地区标注的名字对不上要么文件大到浏览器直接卡死。世界地图、世界国家 GeoJSON、各国地图 JSON 数据这三个词背后其实是同一件事——你需要一份边界准确、属性完整、体积可控的矢量地理数据。它解决的是“地图从哪来”的问题适合做数据大屏、地理分析、跨境业务分布图的前后端开发者。我踩过的坑是随手拿了一份网上流传的“全球低精度”文件结果业务方要单独看某国时发现那个国家的轮廓像被狗啃过。所以这篇笔记我按“数据从哪拿 → 怎么裁 → 怎么压 → 怎么用”的顺序把这条链路讲透。2. 全球 GeoJSON 的三种来源与精度取舍别拿 1:1 亿的图做国家级下钻2.1 自然地球数据与开源边界库的差异常见的全球国家边界数据底层大多来自两个体系一个是自然地球Natural Earth它提供 1:10m、1:50m、1:110m 三种比例尺分别对应高、中、低精度另一个是OSM 衍生的边界数据集比如某些开源项目从 OpenStreetMap 提取的行政边界。两者最大的区别在于自然地球是制图级数据边界经过平滑和综合适合做全球概览OSM 衍生数据更贴近实际行政划分但属性字段命名不统一且部分争议地区的归属标注需要你自己做映射。我一般会这样选如果只是做全球业务分布的大屏1:110m 足够文件小、加载快如果要下钻到单个国家看省界必须用 1:10m 或者直接找该国官方测绘部门公开的边界数据。这里有个血泪经验不要用低精度全球数据去裁剪高精度国家数据因为边界对不上裁剪出来的结果会出现锯齿状缝隙。2.2 用 Python 读取并检查 GeoJSON 的字段完整性拿到一份 GeoJSON 后第一件事不是往项目里塞而是先检查它的属性表。下面这段代码用geopandas读取文件打印字段名、要素数量和坐标系信息。import geopandas as gpd # 读取全球国家边界 GeoJSON world gpd.read_file(world_countries.geojson) # 查看前 5 行属性确认国家名字段叫什么 print(world.head()) # 常见字段名NAME、NAME_ZH、ADMIN、SOVEREIGNT、ISO_A3 # 检查要素数量与坐标系 print(f要素数量: {len(world)}) print(f坐标系: {world.crs}) # 检查是否有空几何或无效几何 invalid world[~world.is_valid] print(f无效几何数量: {len(invalid)})逻辑说明head()用来确认国家名字段是NAME还是ADMIN这决定了你前端 tooltip 显示什么。crs必须是EPSG:4326如果不是后续用 ECharts 或 Mapbox 渲染时坐标会飞到太平洋。is_valid检查能提前发现自相交多边形这种几何在部分渲染引擎里会直接导致整个图层不显示。参数说明gpd.read_file默认读取第一个图层如果文件是 GeoJSON 则无需指定 layer。如果文件很大可以加rows10先读前 10 行看结构。2.3 按大洲或国家裁剪用 shapely 做空间筛选全球数据往往几十兆但业务只需要某一个国家或某一个区域。下面演示如何用shapely的边界框或指定国家名做筛选。from shapely.geometry import box # 方式一按国家名筛选假设字段为 NAME country world[world[NAME] France] # 方式二按经纬度范围裁剪例如欧洲区域 europe_bbox box(-25, 34, 45, 72) # 西经25到东经45南纬34到北纬72 europe world[world.intersects(europe_bbox)] # 导出为新的 GeoJSON country.to_file(france.geojson, driverGeoJSON) europe.to_file(europe.geojson, driverGeoJSON)逻辑说明intersects会保留与边界框有交集的要素适合做区域裁剪。如果要做精确裁剪只保留框内的部分需要用gpd.overlay做交集运算但那样会切断国家边界一般做下钻时不需要。参数说明box(minx, miny, maxx, maxy)的顺序是西经、南纬、东经、北纬。注意 GeoJSON 坐标顺序是[经度, 纬度]不要写反。3. 各国地图 JSON 数据的压缩与格式转换从 30MB 到 300KB 的实操3.1 简化几何用 Douglas-Peucker 算法降精度全球高精度数据动辄 30MB 以上直接丢给前端就是灾难。geopandas内置了simplify方法底层是 Douglas-Peucker 算法。关键参数是tolerance单位是度因为 EPSG:4326 的单位是度。一般来说全球地图用 0.1 度国家级下钻用 0.01 度。# 简化几何tolerance 越大越粗糙 world_simplified world.copy() world_simplified[geometry] world_simplified[geometry].simplify( tolerance0.1, preserve_topologyTrue # 保持拓扑关系避免多边形自相交 ) # 对比文件大小 world_simplified.to_file(world_simplified.geojson, driverGeoJSON)逻辑说明preserve_topologyTrue会牺牲一点简化效果但能保证简化后多边形不会自己穿过自己。如果设为 False文件更小但可能出现渲染异常。参数说明tolerance0.1大约对应 1:110m 比例尺的视觉效果。如果你做的是某国省界建议用 0.01 或更小。3.2 转 TopoJSON减少冗余坐标的利器GeoJSON 的缺点是相邻多边形共享边界会被重复存储。TopoJSON 通过弧段共享解决这个问题通常能再压缩 30%50%。转换用topojson命令行工具或 Python 的topojson库。# 安装 topojson 工具 npm install -g topojson-server topojson-simplify # 将 GeoJSON 转为 TopoJSON geo2topo world_simplified.geojson world_topo.json # 进一步简化可选 toposimplify -s 0.01 world_topo.json world_topo_simplified.json逻辑说明geo2topo把 GeoJSON 的几何转为拓扑结构toposimplify在拓扑层面再做一次简化比直接对 GeoJSON 简化效果更好。参数说明-s 0.01是简化阈值数值越大越粗糙。转换后前端需要用topojson-client的feature()方法还原成 GeoJSON 再渲染。3.3 属性字段瘦身只保留前端需要的键很多公开数据包含几十个属性字段但前端只需要国家名和 ISO 代码。用geopandas直接筛选列能再省一笔体积。# 只保留必要字段 world_slim world_simplified[[NAME, ISO_A3, geometry]] # 重命名字段方便前端读取 world_slim world_slim.rename(columns{NAME: name, ISO_A3: iso}) world_slim.to_file(world_slim.geojson, driverGeoJSON)逻辑说明GeoJSON 的属性部分也是纯文本字段越多文件越大。前端如果只需要显示国家名保留name和iso就够了。参数说明ISO_A3是三位字母国家代码比国家名更稳定适合做数据关联的主键。4. 避坑与排查世界地图 GeoJSON 最常见的 5 个翻车现场4.1 国家名对不上导致数据关联失败现象前端点击某国tooltip 显示“未知国家”或者数据关联后大片区域是灰色。原因GeoJSON 里的国家名字段可能是英文、中文、甚至缩写而你的业务数据用的是另一套命名。比如United States和United States of America就是两个字符串。解决统一用 ISO 3166-1 三位代码做关联键。如果数据源没有 ISO 代码用pycountry库做名称标准化。import pycountry def get_iso3(name): try: return pycountry.countries.lookup(name).alpha_3 except LookupError: return None world[iso3] world[NAME].apply(get_iso3)4.2 坐标系不是 EPSG:4326 导致地图偏移现象地图渲染出来整体偏移或者国家形状被拉伸变形。原因数据可能是 Web MercatorEPSG:3857或其他投影坐标系而前端地图库默认按经纬度解析。解决读取后立即检查crs如果不是 4326用to_crs转换。if world.crs ! EPSG:4326: world world.to_crs(EPSG:4326)4.3 几何自相交导致图层不显示现象整个 GeoJSON 图层加载后一片空白控制台报Invalid geometry。原因部分多边形存在自相交或环方向错误某些渲染引擎如 Mapbox GL会直接丢弃。解决用buffer(0)修复自相交或者用make_valid。from shapely.validation import make_valid world[geometry] world[geometry].apply( lambda geom: make_valid(geom) if not geom.is_valid else geom )4.4 文件过大导致浏览器内存溢出现象页面加载后卡顿甚至标签页崩溃。原因未简化的全球高精度 GeoJSON 可能超过 50MB浏览器解析 JSON 和构建几何对象会消耗大量内存。解决按第 3 章的方法做简化 TopoJSON 转换 字段瘦身。如果还大考虑按需加载——只加载当前视野范围内的国家。4.5 争议地区边界标注不符合业务要求现象某些地区的边界画法或名称标注与业务方的合规要求不一致。原因不同数据源对争议地区的处理方式不同有的单独列出有的合并到邻国。解决这是数据合规问题不是技术问题。我的做法是在项目初期就和业务方确认边界数据的来源和标注规则必要时手动调整属性字段或替换特定区域的几何。不要自己凭感觉改改完要留记录。5. 进阶技巧用 GeoJSON 做点聚合与热力图的坐标校验5.1 判断一个经纬度点是否落在某国境内做业务分布图时经常需要根据用户经纬度判断所属国家。用geopandas的sjoin可以批量做空间连接。from shapely.geometry import Point import pandas as pd # 模拟一批用户坐标 points_df pd.DataFrame({ user_id: [1, 2, 3], lng: [2.35, 139.69, -74.01], lat: [48.86, 35.68, 40.71] }) points_gdf gpd.GeoDataFrame( points_df, geometry[Point(xy) for xy in zip(points_df.lng, points_df.lat)], crsEPSG:4326 ) # 空间连接判断每个点落在哪个国家 joined gpd.sjoin(points_gdf, world[[NAME, geometry]], howleft, predicatewithin) print(joined[[user_id, NAME]])逻辑说明predicatewithin表示点完全在国家多边形内部。如果点在边界上可能返回空这时可以用intersects放宽条件。参数说明howleft保留所有点即使没有匹配到国家。sjoin在大数据量下较慢建议先按边界框粗筛再精算。5.2 用 GeoJSON 边界做热力图遮罩前端做热力图时如果不想让热力扩散到海洋或邻国可以用 GeoJSON 边界做裁剪遮罩。以 ECharts 为例配置geo组件的mask或使用visualMap配合边界数据。// ECharts 中注册地图并设置边界 import * as echarts from echarts; import worldGeoJSON from ./world_slim.geojson; echarts.registerMap(world, worldGeoJSON); const option { geo: { map: world, roam: true, itemStyle: { areaColor: #f0f0f0, borderColor: #999 } }, series: [{ type: heatmap, coordinateSystem: geo, data: heatData, // 你的热力数据 pointSize: 5, blurSize: 10 }] };逻辑说明registerMap把 GeoJSON 注册为 ECharts 可识别的地图。热力图系列绑定coordinateSystem: geo后会自动限制在地图范围内。参数说明roam: true允许缩放和平移。如果数据量大建议关闭roam或限制缩放级别避免频繁重绘。5.3 一个我常用的校验习惯每次拿到新的 GeoJSON我会先做三件事用geopandas打印crs和要素数量用 QGIS 或在线 GeoJSON 查看器快速目视检查边界是否完整用simplify试跑一遍看文件能压到多少。这三步花不了五分钟但能避免后面几小时的返工。希望帮到你。本文还有配套的精品资源点击获取