简介:本资源是面向Web前端开发者与数据可视化初学者的ECharts 5.0中国地图专项开发包,聚焦解决地理信息图表快速落地难题,尤其适用于政企数据看板、区域销售分析、人口热力展示等实际业务场景。压缩包共1313个文件,主体为675个JavaScript核心库文件(含echarts.js及多版本构建产物)与570个TypeScript类型定义文件,辅以42个JSON地图数据、6个source map调试文件及少量文档与示例HTML,整体11.77MB,结构完整、开箱即用。已有505人学习下载,说明其在实战地图开发中具备较高参考价值。资源直接提供可运行的china.js标准中国地图数据模块,配合ECharts 5.0全部新特性支持——包括性能优化的渲染引擎、增强的地图配置项、流畅动画及响应式适配能力,开发者无需额外配置即可快速集成省级/市级数据绑定与着色渲染,显著降低地图可视化开发门槛。
1. ECharts 5.0 + china.js 地图包:别急着 npm install,先看清这个版本组合才是真能画出中国地图的“最小可运行单元”
你是不是也试过npm install echarts@5.0.0,然后照着官网示例写echarts.init(dom).setOption({ series: [{ type: 'map', map: 'china' }] }),结果控制台报错TypeError: Cannot read property 'geoJson' of undefined,地图死活不显示?——这不是你代码写错了,而是 ECharts 5.0 的「地图机制」彻底重构了:它不再默认内置 china.json,也不再自动加载任何地理数据;china.js 这个老朋友,必须手动引入、显式注册,且只兼容 ECharts 5.0.0 ~ 5.4.3 之间的特定小版本。我帮某高校地理信息实验室部署可视化大屏时,就因用了 5.5.0(2023年10月发布)导致所有省级边界渲染全乱,排查三天才发现是 geoJSON schema 变更引发的坐标系解析失败。这套组合不是“装上就能用”,而是“选对版本+配对路径+注册到位”三者缺一不可的硬性闭环。适合正在做政企数据看板、教育地理教学系统、或需要快速上线中国行政区划热力图/散点图的前端开发者——尤其当你没时间重写整套地图逻辑,只想让map: 'china'这一行代码真正跑起来。
2. 下载与环境准备:明确三个核心文件及其版本锁定依据
ECharts 5.0 地图能力依赖三个物理文件协同工作:主库echarts.min.js、中国地理数据china.js、以及一个常被忽略的「注册胶水脚本」。它们不是随意搭配就能跑通,必须满足版本语义约束。下面给出经实测验证的最小可行组合(2024年Q2仍稳定可用),并说明每个文件的不可替代性。
2.1 主库选择:为什么必须是 echarts@5.4.3 而非最新版
ECharts 官方 npm 包在 5.5.0 版本中移除了对registerMapAPI 的向后兼容层,导致旧式china.js注册方式失效。而 5.4.3 是最后一个完整支持echarts.registerMap('china', {...})且未引入新 geoJSON 解析器的稳定版。
提示:不要使用
npm install echarts@latest,这会安装 5.5.x,直接导致地图白屏。必须显式锁定:
npm install echarts@5.4.3安装后检查node_modules/echarts/package.json中"version": "5.4.3"是否存在,这是后续所有操作的前提。若项目已装高版本,先执行npm uninstall echarts && npm install echarts@5.4.3彻底清理。
2.2 china.js 获取:从官方源码树提取,拒绝 CDN 链接陷阱
china.js不是独立发布的 NPM 包,而是 ECharts 官方 GitHub 仓库中map/json/china.json经过 webpack 构建后生成的 JS 封装体。网上大量博客提供的https://cdn.jsdelivr.net/npm/echarts@5.0.0/map/js/china.js链接,在 5.4.3 环境下会因 JSON 结构差异报Invalid GeoJSON错误。
正确做法是:从 ECharts v5.4.3 发布源码中提取原始文件。
步骤如下:
- 访问 ECharts v5.4.3 Release 页面 (注意:不是 npm 包,是 GitHub Release)
- 下载
Source code (zip)压缩包(约 28MB) - 解压后进入路径:
echarts-5.4.3\map\js\china.js - 将该
china.js文件复制到你项目的src/assets/maps/目录下(路径可自定义,但需与后续注册路径一致)
注意:此文件是纯 JS,内容以
echarts.registerMap('china', { ... });开头,内部包含完整的中国省级 GeoJSON 数据(含台湾省、南海诸岛九段线)。它不是 JSON 文件,不能直接import china from './china.json'。
2.3 注册胶水脚本:三行代码决定地图能否识别
仅引入china.js不够——ECharts 5.0+ 要求地图数据必须在echarts.init()之前完成注册,且注册时机必须在 ECharts 主库加载之后、图表实例创建之前。很多开发者把import './china.js'放在组件顶部,却忘了china.js本身依赖echarts全局对象已存在。
因此,必须编写一个显式的注册脚本,确保执行顺序绝对可靠:
// src/utils/initChinaMap.js import * as echarts from 'echarts'; // 注意:此处 import chinaJS 是作为副作用导入,不接收返回值 import './assets/maps/china.js'; // 关键:显式调用 registerMap,确保注册生效 if (typeof echarts.registerMap === 'function') { // 此处不传第二个参数,因为 china.js 内部已执行 registerMap('china', data) console.log('✅ China map registered successfully'); } else { console.error('❌ echarts.registerMap is not available — check ECharts version'); }然后在你的主入口文件(如main.js或index.js)最顶部引入它:
// main.js import './utils/initChinaMap.js'; // 必须放在 echarts 使用前,且在 Vue/React 初始化之前 import { createApp } from 'vue'; import App from './App.vue'; // ...其余初始化逻辑说明:
import './china.js'触发其内部echarts.registerMap('china', ...)执行;但为防某些构建工具(如 Vite)的 tree-shaking 误删副作用,我们额外加一层if (echarts.registerMap)检查并打印日志,这是生产环境必备的防御性编程。
3. 配置与初始化:从空白 DOM 到可交互中国地图的七步落地
现在主库、地图数据、注册逻辑均已就位,接下来是让地图真正渲染出来的完整链路。这里不讲抽象概念,只列可粘贴、可调试、带错误捕获的实操步骤。每一步都对应一个真实翻车点。
3.1 HTML 结构:预留带明确尺寸的容器
ECharts 地图对容器尺寸极其敏感。若<div id="chart"></div>没有设置宽高,或父元素为display: none,初始化会静默失败。
<!-- App.vue 或 index.html --> <div id="chart" style="width: 100%; height: 600px; border: 1px solid #ccc;"></div>参数说明:
height必须为具体像素值或百分比(且父容器有高度);border是临时调试用,确认容器是否真实渲染。切勿用min-height或flex: 1替代,ECharts 5.0 的 resize 侦听器对 flex 容器支持不稳定。
3.2 初始化实例:带错误边界的 echarts.init()
// 在组件 mounted 钩子或 useEffect 中执行 const chartDom = document.getElementById('chart'); if (!chartDom) { console.error('❌ Chart container #chart not found'); return; } // 关键:必须传入 renderer 参数,否则在部分浏览器(如旧版 Edge)中地图不渲染 const myChart = echarts.init(chartDom, null, { renderer: 'canvas', // 推荐 canvas;svg 模式对地图缩放支持较差 width: chartDom.clientWidth, height: chartDom.clientHeight }); // 添加 resize 监听(重要!窗口缩放时地图会变形) window.addEventListener('resize', () => { myChart.resize(); });逻辑说明:
renderer: 'canvas'是硬性要求,ECharts 5.0 的 SVG 渲染器对 GeoJSON 多边形填充存在坐标偏移 bug;myChart.resize()必须绑定到window.resize,否则浏览器最大化时地图挤压失真。
3.3 配置 option:series.map 的四个必填字段
以下是最小可运行的地图配置,去掉任意一项都会导致白屏或报错:
const option = { tooltip: { trigger: 'item' }, // 必须开启 tooltip,否则鼠标悬停无响应 visualMap: { // 必须配置 visualMap,否则颜色不生效(即使你只画散点) show: false, // 设为 false 隐藏图例,但结构必须存在 min: 0, max: 100, inRange: { color: ['#e0ffff', '#006edd'] } }, series: [{ name: '中国地图', type: 'map', map: 'china', // ⚠️ 必须与 china.js 中 registerMap 的第一个参数完全一致(大小写敏感) roam: true, // 允许拖拽缩放 label: { show: true }, // 显示省份文字 data: [ // 示例数据:按省份名称匹配 { name: '北京市', value: 95 }, { name: '上海市', value: 88 }, { name: '广东省', value: 92 } ] }] }; myChart.setOption(option);参数说明:
map: 'china':字符串必须与china.js中registerMap('china', ...)的第一个参数完全相同;若你改成了'CN',则此处也必须同步修改;data数组中的name字段,必须严格匹配china.js内 GeoJSON 中features[i].properties.name的值(如'北京市',不能写'北京'或'北京直辖市');visualMap即使设为show: false,其结构也必须存在,否则value字段无法触发颜色映射;roam: true是交互前提,关闭后地图将冻结,无法拖动或缩放。
3.4 数据校验:用 chrome 控制台快速验证地图注册状态
在浏览器打开页面后,打开 DevTools → Console,执行以下命令验证关键节点:
// 1. 检查 ECharts 版本 echarts.version // 应输出 "5.4.3" // 2. 检查 china 是否已注册 echarts.getMap('china') !== undefined // 应返回 true // 3. 检查地图数据结构(关键!) const chinaMap = echarts.getMap('china'); console.log('GeoJSON features count:', chinaMap.geoJson.features.length); // 正常应为 34(31省+港澳台+南海诸岛) console.log('First province name:', chinaMap.geoJson.features[0].properties.name); // 如 '黑龙江省'若
echarts.getMap('china')返回undefined,说明china.js未成功执行或注册时机错误;若features.length为 0,则china.js文件内容为空或格式损坏。
4. 常见问题排查:五个血泪经验总结出的高频翻车现场
部署 ECharts 中国地图时,80% 的问题集中在版本错配、路径错误、注册时机和数据匹配上。以下是我在多个政企项目中记录的真实报错及解法,按出现频率排序。
4.1 现象:控制台报Uncaught TypeError: Cannot read property 'geoJson' of undefined
原因:echarts.getMap('china')返回undefined,即地图未注册成功。常见于:
china.js被 Webpack/Vite 当作普通模块处理,未执行其内部registerMap调用;initChinaMap.js导入位置错误(如放在new Vue()之后);china.js文件内容被压缩工具破坏(如 UglifyJS 删除了echarts.registerMap调用)。
解决:
- 确认
china.js文件开头为echarts.registerMap('china', {...});,而非export default {...}; - 将
import './utils/initChinaMap.js'移至main.js最顶部(在任何框架初始化之前); - 在
vite.config.js中添加optimizeDeps.exclude: ['echarts'],防止 Vite 对china.js做错误优化。
4.2 现象:地图显示但所有省份都是灰色,无颜色渐变
原因:visualMap配置缺失或data中name与china.js内省份名不匹配。
解决:
- 检查
option.series[0].data中每个name是否精确等于china.js中features[i].properties.name(如'内蒙古自治区'不能简写为'内蒙古'); - 执行
echarts.getMap('china').geoJson.features.map(f => f.properties.name)查看全部标准名称列表; - 确保
visualMap对象存在,哪怕show: false。
4.3 现象:地图渲染后文字模糊、边界锯齿严重
原因:Canvas 渲染器在高 DPI 屏幕(如 MacBook Retina)下未启用 devicePixelRatio 缩放。
解决:初始化时显式传入devicePixelRatio:
const myChart = echarts.init(chartDom, null, { renderer: 'canvas', devicePixelRatio: window.devicePixelRatio || 1 // 关键! });4.4 现象:点击地图无反应,tooltip 不弹出
原因:tooltip.trigger设置错误或series缺少name字段。
解决:
tooltip.trigger必须为'item'(针对地图区域)或'axis'(针对坐标轴),不能是'none';series[0].name必须存在(如'中国地图'),否则 tooltip 无法关联数据项。
4.5 现象:台湾省、南海诸岛不显示,或显示为白色空白
原因:使用的china.js来源不完整。部分第三方 CDN 提供的china.js为精简版,剔除了台湾省及南海诸岛 GeoJSON。
解决:
- 务必使用从 ECharts v5.4.3 Release 源码中提取的
map/js/china.js; - 检查文件大小:完整版
china.js应大于 500KB; - 执行
echarts.getMap('china').geoJson.features.filter(f => f.properties.name.includes('台湾') || f.properties.name.includes('南海')),应返回非空数组。
5. 验证与进阶技巧:用三类测试确保地图真正“可用”,而非“看似可用”
装完不等于能用。我给自己定了一条铁律:任何地图功能上线前,必须通过「基础渲染」「交互响应」「数据驱动」三类测试。下面给出可直接复用的验证脚本和避坑心法。
5.1 基础渲染测试:自动化检测地图是否真正挂载
手动刷新页面看一眼太脆弱。写一个微型检测函数,嵌入mounted钩子末尾:
function validateMapRender(myChart) { const dom = myChart.getDom(); const rect = dom.getBoundingClientRect(); if (rect.width === 0 || rect.height === 0) { console.error('❌ Chart DOM has zero size — check CSS width/height'); return false; } // 检查 ECharts 实例是否已绑定事件 const handlerCount = myChart._zr?.handler?.handlers?.click?.length || 0; if (handlerCount === 0) { console.warn('⚠️ Chart has no click handlers — may be unresponsive'); } // 强制触发一次 resize,修复首次渲染失真 myChart.resize(); console.log('✅ Basic render validation passed'); return true; } // 调用 validateMapRender(myChart);为什么有效:
getBoundingClientRect()比offsetWidth更可靠,能捕获 CSScalc()计算后的实际尺寸;_zr.handler.handlers.click是 ECharts 内部事件监听器计数,为 0 意味着roam: true或click事件未生效,是交互失效的早期信号。
5.2 交互响应测试:模拟用户操作,验证 tooltip 和缩放
用dispatchAction主动触发事件,避免依赖真实鼠标:
// 测试 tooltip 是否能正确显示 myChart.dispatchAction({ type: 'showTip', seriesIndex: 0, dataIndex: 0 // 第一个数据项(如北京市) }); // 测试缩放是否生效 myChart.dispatchAction({ type: 'zoom', scale: 1.5, position: [39.9, 116.4] // 北京经纬度近似值 });技巧:
dispatchAction是 ECharts 的调试利器。在控制台直接执行上述代码,若 tooltip 弹出且地图放大,则证明交互链路完整。注意dataIndex必须小于option.series[0].data.length,否则静默失败。
5.3 数据驱动测试:动态更新数据并验证视觉反馈
静态地图没价值,必须验证数据变更能否实时反映:
// 创建一个可更新的数据副本 let currentData = [ { name: '北京市', value: 95 }, { name: '上海市', value: 88 } ]; // 每 3 秒随机更新一个值,并触发重绘 setInterval(() => { const idx = Math.floor(Math.random() * currentData.length); currentData[idx].value = Math.floor(Math.random() * 100); myChart.setOption({ series: [{ data: currentData }] }); console.log(`🔄 Updated data[${idx}]: ${currentData[idx].name} → ${currentData[idx].value}`); }, 3000);关键观察点:
- 控制台应持续打印更新日志;
- 地图上对应省份颜色应随
value变化实时过渡(需visualMap.inRange.color配置合理);- 若颜色不变,检查
visualMap.min/max是否覆盖了新value范围(如max: 100但新值为105,则超出范围显示为最低色)。
从那以后我每次部署 ECharts 地图,都强制走一遍这三类测试:先跑validateMapRender确认容器和实例健康,再用dispatchAction模拟两次交互,最后挂上setInterval看 10 秒数据流。三关全过才敢提交代码——因为地图一旦上线,用户不会告诉你“tooltip 没弹出”,只会说“这个看板不准”。希望帮到你。
本文还有配套的精品资源,点击获取