尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
世界国家GeoJSON大全:Python校验与ECharts地图可视化实战
简介面向地理信息系统开发者和地图可视化场景的世界国家地理边界数据包整合了来自自然地球的全球国家与地区边界多边形适用于网页地图、桌面地理信息系统、数据分析和可视化大屏等应用。资源以JSON格式文本为主体共含三千四百余个JSON文件另附少量说明文档和许可文件整体仅1.69MB体积紧凑、目录清晰便于直接嵌入项目或二次加工。主要用于在应用程序和可视化工具中绘制各国地图也适合需要精确边界数据进行地理信息处理的中高级开发者。目前已有3692人学习使用说明其实用性得到了不少同行验证。拿到后可快速获得世界各国的边界坐标无需自行从自然地球原始数据中提取转换能显著缩短地图开发中地理数据准备的时间也方便按国家代码或名称进行检索与调用。1. geojson大全与地图json先解决底图数据从哪来做可视化大屏的时候最怕的不是图表样式调不出来而是底图数据找不到。之前接一个全球业务分布看板客户要求每个国家的区块能点选、能下钻我翻遍手头材料发现每个仓库都存一版边界JSON格式新旧不一有的文件只有国名没有代码跟业务库里的维度完全对不上。后来摸到这份“世界国家geojson大全”的老版本资源才把事办利索——它把全球各国含部分一级行政区划的边界数据统一整理成标准GeoJSON国家代码、通用名称、几何坐标都在properties字段里省掉了逐个站点找数据、猜字段的功夫。这份geojson大全的核心就是地图json的批量整合适合做数据地图、大屏可视化、GIS预处理的人新手拿过去能直接加载熟手能省下大量清洗整理的时间。2. 读懂GeoJSON结构坐标嵌套、坐标系与Feature组织方式2.1 坐标嵌套为什么一个多边形有三层括号GeoJSON本身是一种JSON约束格式核心是坐标数组但不同几何类型的嵌套层数完全不同。很多人第一次打开文件看到一堆嵌套数组直接懵掉其实规则没有想象中复杂。几何类型坐标最小嵌套形态业务含义Point[经度, 纬度]点要素LineString[[经度, 纬度], [经度, 纬度]]线要素Polygon[[[经度, 纬度], ...]]面要素MultiPolygon[[[[经度, 纬度], ...]]]多面要素以Polygon为例最外层是geometry的coordinates属性里面第一层数组叫“环”ring一个面可以有多个环第一个环是外边界后面的环是内部的洞环里的每一层才是具体的顶点坐标。为什么需要三层因为一个面必须至少有一个外环而外环本身又需要一组顶点坐标来闭合结构就固定成了三层。很多人翻车就翻在这里想手动删掉某个岛屿删的时候多删了一层括号导致Polygon退化成LineString整个图层在渲染时就消失了还不报错排查半天才发现是JSON嵌套结构被改坏了。老版本数据里这种情况不少尤其手工拼接过的文件。为什么不直接用Shapefile因为shp是二进制格式字段结构散落在.dbf文件里浏览器前端基本没办法直接读必须经由后端转换一遍。GeoJSON是纯文本任何JSON解析器都能打开前端图表库和Python的json库可以直接处理选它做交换格式是最省事的路径。这份资源把全球边界数据统一落地成GeoJSON省掉的其实就是二进制GIS数据转文本数据的那一步。2.2 Feature不再是普通JSON对象与集合的组织方式GeoJSON和普通JSON最大的区别是它有类型约定。一个Feature对象至少要包含type、properties、geometry三个键geometry里放的又是一个独立的几何对象。而且完整的GeoJSON文件通常是一个FeatureCollection对象真正的数据都在features数组里。{ type: FeatureCollection, features: [ { type: Feature, properties: { name: 某区域, ISO_A2: XX }, geometry: { type: Polygon, coordinates: [ [ [120.1, 30.2], [120.3, 30.4], [120.5, 30.6] ] ] } } ] }上面这段是GeoJSON的最小可用结构。properties承载业务信息geometry承载边界信息二者是解耦的。很多人不看properties直接把整个文件丢给可视化库结果地图画出来了数据挂不上问题就出在没搞清properties里字段名是什么。老版本资源还有一个常见差异文件顶层可能是Feature而不是FeatureCollection。顶层是FeatureCollection的用于加载多个国家很方便顶层是Feature的通常代表只有一个区域。批量处理时两者都要兼容不能假设所有文件结构完全一致。处理多份数据时第一步先把每个文件顶层类型输出一遍心里有数再写后续逻辑。2.3 坐标系选择WGS84是底线GeoJSON规范要求坐标基于WGS84经纬度用十进制度顺序是先经度后纬度。这条是最大的隐蔽坑。很多老数据集是从其他GIS格式转出来的转换时投影没还原可能出现某厂商加密坐标系或平面投影坐标。这两种坐标混在GeoJSON里加载到地图上整个图形会偏移几百米甚至几公里。判断坐标系是否正确的办法很朴素检查坐标数值范围。合法的经纬度经度在-180到180之间纬度在-90到90之间。如果看到经度数值是几百万那基本可以断定是投影坐标没有还原。还有一种情况是坐标看上去在合法范围但整体位置漂移。你可以把某个已知经纬度的城市点叠加上去对比如果城市点落在了国界线外几百米说明这份边界数据经历过加密偏移处理需要先做坐标纠偏再入库。某开发者曾拿到一份看起来完全正常的边界所有检查都通过结果所有区块堆在太平洋里最后查出来是数据源用某厂商坐标算法导出过坐标在真实国界基础上被统一偏移了。处理这个问题的唯一正确路径是先识别坐标基准再做统一转换没有任何玄学捷径。3. Python实战校验几何与按需求提取地图数据3.1 先体检用Python读一遍所有GeoJSON拿到这份资源先别急着写业务逻辑第一步是批量读取一遍确认文件结构完好。下面这段脚本是通用体检流程不依赖GIS库只用到Python标准库。import json from pathlib import Path root Path(world_geojson) # 资源解压后的根目录 for f in root.rglob(*.geojson): try: with open(f, r, encodingutf-8) as fp: data json.load(fp) assert data[type] in (Feature, FeatureCollection) count len(data.get(features, [])) print(f, OK, features:, count) except Exception as e: print(f, ERROR:, e)先说逻辑用pathlib的rglob递归扫描所有子目录下的geojson文件json.load把文件解析成Python字典随后断言type字段是不是两种合法的顶层类型。解析失败或顶层类型不对的文件会被标记成ERROR需要单独处理。有些老资源混合存放后缀既有.geojson也有.json直接把rglob参数改一下就能兼容。参数说明encodingutf-8一定要写尤其Windows下从某个仓库下载的资源默认编码不一致会导致GBK乱码rglob递归是必须的因为这份资源通常按大洲或国家分为多级目录。这一步输出的文件清单和报错列表就是后续工作的基础。3.2 按国家代码提取子集实际使用时经常只需要某一个国家或几个国家的边界没必要每次加载全世界数据。提取子集的思路是遍历features按properties里的代码字段匹配然后单独导出。import json with open(world.geojson, r, encodingutf-8) as fp: data json.load(fp) target_code AB # 替换成实际国家代码 for feat in data[features]: props feat.get(properties, {}) code props.get(ISO_A2) or props.get(ADM0_A3) if code target_code: single { type: FeatureCollection, features: [feat] } with open(f{target_code}.geojson, w, encodingutf-8) as out: json.dump(single, out, ensure_asciiFalse) break逻辑遍历features通过properties里ISO_A2优先取两字码取不到再用ADM0_A3三字码兜底。为什么写两个字段因为不同版本资源的字段命名不一致有的叫ISO_A2有的叫ADM0_A3有的叫wb_a3。匹配成功后把该Feature重新包装成FeatureCollection导出这样可以确保任何解析器都能正常识别。导出时用ensure_asciiFalse很关键否则properties里的中文名称会被转成\uXXXX的转义序列人没法读排查问题时很难受。如果你业务数据里全是中文名那就改成匹配properties.name字段逻辑一致。补充一点只导出Feature而不包一层FeatureCollection很多旧版解析器识别不了。这是一个很小的细节但我见过不少人在这一步踩坑。3.3 几何有效性检查与快速修复提取完边界不等于它能正常渲染几何自交、环方向不一致这类问题在浏览器里会表现为区块填充异常在GIS工具里则是打不开或报错。用shapely做几何有效性检查是成熟做法。from shapely.geometry import shape from shapely.validation import explain_validity with open(AB.geojson, r, encodingutf-8) as fp: data json.load(fp) for feat in data[features]: geom shape(feat[geometry]) if not geom.is_valid: print(INVALID:, explain_validity(geom))逻辑shapely的shape()函数从GeoJSON字典还原几何对象is_valid做拓扑有效性检查explain_validity返回可读的错误原因最常见的提示是Self-intersection也就是几何自交。自交多边形画到屏幕上会呈现蝴蝶结状的破面填充效果完全失控。修复时优先用shapely.ops里的orient统一环方向然后对自交部分做buffer(0)处理。buffer(0)是GIS里经典的修复技巧它会把自交点拆解开来重建有效多边形。如果部分区域修复后仍异常单独把这个Feature提出来检查多半是首尾顶点没闭合——第一个点和最后一个点经纬度不一致补上闭合点即可。这份老资源是多年攒下来的这一关跑完再入库能省下大量前端排查时间。3.4 坐标基准统一用pyproj检查与重投影如果检测出坐标不在WGS84常见做法是用pyproj做重投影。pyproj是目前最常用的Python坐标转换库适合处理合法但坐标系不对的数据。import json from pyproj import Transformer from shapely.geometry import shape, mapping transformer Transformer.from_crs(EPSG:3857, EPSG:4326, always_xyTrue) with open(weird.geojson, r, encodingutf-8) as fp: data json.load(fp) for feat in data[features]: geom shape(feat[geometry]) new_geom transform_geom(transformer, geom) feat[geometry] mapping(new_geom) def transform_geom(transformer, geom): from shapely.ops import transform return transform(transformer.transform, geom)逻辑from_crs指定源坐标系与目标坐标系这里把Web墨卡托投影转成WGS84经纬度shapely的transform函数把几何里每个坐标点都套用转换器完成重投影。参数说明EPSG:3857是Web墨卡托EPSG:4326是WGS84经纬度两者是Web地图最常见的坐标系组合。如果转换后坐标值仍有几百米的系统性偏移那就是加密坐标偏移标准投影库没有内置算法需要用经验参数做纠偏这个内容太深普通可视化场景里直接换数据源更省事。4. 转成可视化能用地图jsonECharts对接与属性映射4.1 用registerMap加载GeoJSON很多可视化项目的落地方式是把这个geojson喂给前端图表库。以ECharts为例地图组件支持直接注册GeoJSON用法非常成熟。新版项目用npm包引入老版项目用script标签加载两种方式接口一致。import * as echarts from echarts; import worldJson from ./world.geojson; echarts.registerMap(world, worldJson); const chart echarts.init(document.getElementById(map)); chart.setOption({ geo: { map: world, roam: true, itemStyle: { areaColor: #e8e8e8 } } });逻辑registerMap第一个参数是地图别名后面所有引用都用这个别名第二个参数就是GeoJSON对象框架解析features并渲染边界。roam开启缩放和拖拽大屏地图基本都开。itemStyle控制区块样式areaColor是未映射数据的默认填充色。参数说明如果你用的是老版本框架GeoJSON解析逻辑相对保守对MultiPolygon的支持弱一些。这份资源里岛国、飞地、跨海领土全部依赖MultiPolygon新版框架基本都能正常渲染老版本如果出现区块缺失优先考虑升级而不是改数据。4.2 nameProperty与名称映射地图能画出来只是第一步数据能不能按区块绑上去完全看名称匹配。框架默认从每个Feature的properties.name读取区域名但这份老资源里的字段可能是name_cn、ISO_A2、ADM0_A3等等业务侧的名称体系跟边界文件里的名称体系不一致时地图上一片灰。echarts.registerMap(world, worldJson, { nameProperty: name_cn }); chart.setOption({ series: [{ type: map, map: world, data: [ { name: 某区域, value: 120 } ], label: { show: true } }] });逻辑registerMap第三参数传入统一映射配置nameProperty告诉框架从properties里取哪个字段作为区域名。series.data里每一项的name与区域名匹配value就挂到对应区块上。这就解释了为什么很多人在series里写对了数据却一盏灯都不亮——不是数据错了是名称彼此对不上。参数说明nameProperty一旦全局指定所有Feature都必须有该字段缺失字段的区域在渲染时不会被识别。我的习惯是先用Python脚本把边界文件里的全量名称清单输出一份跟业务维度表做交集确认用哪个字段统一后再把业务表名称批量改成一致格式。4.3 TopoJSON不是GeoJSON这个转换别偷懒老资源里经常混着.topojson后缀的文件也有人把topojson改后缀名当geojson用结果是前端直接报错图层一片空白。TopoJSON不是普通的JSON数据文件它把相邻区块的共享边界压缩成弧线存储结构跟GeoJSON完全不同解析方式也不一样。常见做法是先用命令行工具做预转换再把转换结果交给前端。mapshaper是处理这类转换的常用工具。mapshaper world.topojson -o formatgeojson out.geojson逻辑mapshaper读取拓扑压缩文件formatgeojson指定输出格式out.geojson是转换产物。拓扑压缩过的数据解开后体积会明显变大这是正常现象不需要担心。参数说明mapshaper的-o参数还可以追加precision0.001这类精度控制把坐标保留三位小数大约能压掉一多半体积代价是边界细节微损做全球地图完全足够。偷懒不转换的后果是前端黑屏并提示无效GeoJSON排查过程非常浪费时间。转换后的文件建议做一次第3章的几何校验因为拓扑解压偶尔会暴露出原数据的隐藏问题。5. 避坑坐标偏移、几何自交与老数据过期问题5.1 地图整体漂移出界坐标系被偷换了现象加载数据后整个国家轮廓出现在海里或者整体偏移到相邻国家的位置点选时命中的区域完全不对。原因边界数据不是WGS84经纬度而是投影坐标或加密坐标。投影坐标直接体现在数值范围异常经度几百万那种加密坐标则表现在数值合法但位置系统性偏移上。解决先确认坐标数值范围经度范围应为-180到180纬度应为-90到90再用一个已知城市坐标做叠加验证确认是投影坐标后用pyproj统一转回4326坐标系。加密坐标的纠偏需要额外算法展示场景里直接换一份坐标干净的数据源更划算不要跟偏移数据死磕。5.2 某几个区域渲染不出来几何自交或环方向不一致现象地图大部分区块正常唯独个别区块没有填充色或者填充后形状像打了结的蝴蝶结。原因手工编辑GeoJSON时顶点顺序错乱或者外环内环方向不统一导致几何自交。老资源是多年拼凑的这种情况不算罕见。解决先用shapely的is_valid跑一遍全量检查对无效几何用orient统一环方向让外环逆时针、内环顺时针符合标准要求。再不行就对特定几何做buffer(0)修复。如果单独提交的Feature首尾坐标不一致补上闭合点。修复后重新导出并加载验证。5.3 相邻边界出现缝隙或重叠多源边界未做融合现象放大到省界级别时两个相邻区块之间出现一条细缝或者边界出现双重线叠加。原因不同区块的边界来自不同数据源各自做了简化处理共享边界的顶点序列不一致。视觉上就是缝隙或重叠。解决展示场景用mapshaper的-clean参数清理拓扑关系让共享边界对齐做GIS分析场景则必须使用同一数据源导出的面板数据不能混用。清楚这一点能少走很多弯路——地图展示和GIS分析对边界的精度要求不一样视觉无缝隙就是合格。5.4 数据映射全部落空名称与代码版本差异现象地图正常显示区域区块都完整但业务数据一项都挂不上去所有区块保持灰色。原因边界文件的properties名称与业务数据维度不是同一套命名或者ISO代码版本不一致。老资源里既有ISO_A2也有ISO_A3还有不同年份的国家行政区划版本。解决先把边界文件里全量名称和代码输出成清单再跟业务维度表做一次映射对齐。脚本如下。import json data json.load(open(world.geojson, encodingutf-8)) for feat in data[features]: p feat[properties] print(p.get(ISO_A2), p.get(ISO_A3), p.get(name), p.get(name_cn))逻辑一行输出一个区域的两码、三码、英文名、中文名。参数说明字段缺失会输出None一眼就能看出哪些区块信息不全这份清单同时可以作为业务数据表别名映射的依据。我拿到任何一份边界数据都会先跑这个脚本几分钟就能避免整块时间花在排查询字段上。6. 进阶验证用简化阈值做多级缩放地图6.1 精度阈值与数据体积的平衡全世界边界数据动辄几十MB直接塞进前端包首屏加载会被拖垮。进阶做法是准备多级精度版本全球视角加载低精度文件下钻到国家再加载高精度文件。用shapely的simplify方法可以手动控制误差阈值。from shapely.geometry import shape import json data json.load(open(world.geojson, encodingutf-8)) for feat in data[features]: geom shape(feat[geometry]) simplified geom.simplify(0.01, preserve_topologyTrue) feat[geometry] json.loads(simplified.to_geojson()) json.dump( data, open(world_simple.geojson, w, encodingutf-8), ensure_asciiFalse )逻辑simplify内部使用的是道格拉斯-普克算法第二个参数是容差值单位与坐标一致这里就是度阈值越大边界越粗糙。preserve_topologyTrue的意义在于防止简化过程产生新的拓扑错误这条很关键不加的话简化后可能出现区块重叠。参数说明0.01度大约对应1公里级别适合全球或全国尺度的轮廓展示做单国下钻时建议用0.001甚至更小的值。多级缩放的思路就是按视角切换不同容差版本全球版一百万字节省级版一百字节加载体积差好几个数量级。验证简化效果的方法是抽查面积损失。简化前后几何的area比率在0.9以上一般可以接受再直观一点把两版数据同时渲染到地图缩放到你接受的最低比例尺下看边界细节有没有崩。如果差太多就调小阈值重新导出。从那以后我每次拿到边界数据都会强制走一遍几何校验再入库靠黑匣子玄学赌数据好不好用纯属给自己挖坑。希望这篇拆解能帮你在用这份geojson大全时少走几步弯路。本文还有配套的精品资源点击获取
RELATED

相关推荐

geckodriver 与 Firefox 版本匹配:从安装到排错全攻略

geckodriver 与 Firefox 版本匹配:从安装到排错全攻略

简介:这是一份Python Web自动化开发与调试环境资源包,面向已接触Python、需要使用Selenium驱动Firefox进行自动化测试或爬虫开发的爱好者与工程师。压缩包共880个文件,主要包含.py脚本、.pyc编译文件、.dll与.pyd运行库、.exe可执行程序&…

📅 2026/10/17 3:03:59
微博H5接口爬虫:Python轻量级稳定采集方案

微博H5接口爬虫:Python轻量级稳定采集方案

简介:本资源是一套面向Python初学者与中级开发者的微博数据采集实战项目,聚焦网络爬虫核心技能训练,涵盖请求发送、HTML/JSON解析、登录模拟、反爬应对及数据存储等完整链路。压缩包共18个文件,含13个Python脚本(如wei…

📅 2026/10/17 3:03:59
基于YOLOv8的超市商品识别检测系统:从训练到部署全解析

基于YOLOv8的超市商品识别检测系统:从训练到部署全解析

做超市商品识别这个项目,起因是有个开社区超市的朋友跟我抱怨,说人工盘点货架、核对商品效率太低,问能不能搞个自动识别的工具。当时我手头正好在做目标检测方向的开发,就顺手搭了个基于YOLOv8的超市商品识别检测系统,…

📅 2026/10/17 3:03:59
MORE NEWS

更多资讯

📰

纯前端实现视频转音频:FileReader、decodeAudioData与OfflineAudioContext实战

1. 浏览器里把视频拆成音频,到底难在哪很多人第一次听到"前端视频转音频"这个需求,第一反应是:这不就是调个接口的事吗?实际上,浏览器原生并没有提供一个叫"video to audio"的按钮。你要做的事情&…

📰

AI辅助论文写作实测:从初稿、图表到排版的完整工具链解析

每年 3 月到 5 月就是论文季,我身边全是焦头烂额的面孔。2026 届这一轮特别明显:大家焦虑的不再只是“写不出来”,而是四个问题同时压上来——初稿从哪下笔、图表怎么做才像样、排版格式返工到崩溃、最后还要过一道 AI 生成率检测。我自己也帮…

📰

深度学习文本分类入门:IMDB电影评论二分类实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

协同过滤推荐系统开发实战:旅游攻略平台与Node.js/Vue落地

1. 项目全貌与技术选型1.1 这个系统到底解决了什么问题旅游攻略类平台如今多如牛毛,但真正让用户满意的却不多。原因很简单,大部分平台把攻略一股脑堆在首页,用户翻了几页也找不到自己想看的内容。有人喜欢徒步、有人喜欢美食探店、有人出门就…

📰

流量域数仓建设实战:DWD到DWS的分层设计与开发要点

1. 流量域数仓建设的整体设计思路1.1 为什么流量域总是数仓建设的第一站做过企业级大数据项目的人都有一个共识:流量域几乎是所有数仓项目里最先落地、也最能体现建模功力的一个域。原因很直接——埋点数据是绝大多数互联网产品的原始燃料,页面浏览、点击…

📰

BRD/MRD/PRD/DRD/FRD:五类需求文档的定位、写法与避坑指南

先交代一下背景。做产品这行,写得最多的不是PPT,而是需求文档。刚入行那会儿,我最怕看到的就是这一串缩写:BRD、MRD、PRD、DRD、FRD,每个都叫"需求文档",每个又都不一样。后来带团队、做评审、给…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬