最近用 ehcarts 写了一个有关中国地图的需求,这篇文章来总结下基本的原理和用法。
Geojson
首先了解一下 GeoJSON ,看下 维基百科 的定义:
GeoJSON 是一种基于 JSON 的地理空间数据交换格式,它定义了几种类型 JSON 对象以及它们组合在一起的方法,以表示有关地理要素、属性和它们的空间范围的数据。
2015年,互联网工程任务组(IETF)与原始规范作者组建了一个 GeoJSON 工作组,一起规范 GeoJSON 标准。在2016年8月,推出了最新的GeoJSON数据格式标准规范(RFC 7946)。
GeoJSON 使用唯一地理坐标参考系统 WGS1984 和十进制度单位,一个 GeoJSON 对象可以是 Geometry, Feature 或者FeatureCollection.
其几何对象包括有点(表示地理位置)、线(表示街道、公路、边界)、多边形(表示国家、省、领土),以及由以上类型组合成的复合几何图形。
简单说就是通过坐标系来描述点、线、面,看几个例子就明白它们是什么了。
单个点:"type": "Point" 

多个点,"type": "MultiPoint" 

多个线:"type": "MultiLineString" 

多个面:"type": "MultiPolygon" 

地图 Geojson
 中国地图和省份的 geoJson 可以在 echarts-map 或者阿里的 数据可视化中心 进行下载。

echarts 4.x 的版本自带了一些 Geojson 的数据,在 node_modules/echarts/map/json 目录,但可能考虑到一些省区数据不能及时更新,echarts 5 版本就没有自带数据了。
让我们看一下全国地图中山西省的 geoJson 长什么样子。
| 1 | { | 
整体是一个 "type": "FeatureCollection" ,然后有一个 features 数组保存所有省份,每一个都是 "type": "Feature" ,代表单个省份。包含 properties 属性和 geometry 属性。geometry 属性就是所有的坐标信息。
根据坐标信息,计算最大值和最小值的差值,按比例映射到 canvas 上的坐标,然后就可以画出来了,细节的话可以参考 b 站 的这个视频。

echarts 画地图
安装 vue 和 echarts ,先来个简单的正方形。
| 1 | { | 
然后用 echarts 做引入我们的 json 文件、通过 echarts.registerMap 注册 json 文件、设置 opitons 的series 属性。
| 1 | <template> | 

然后我们只需要到阿里的 数据可视化中心 把中国地图的 Geojson 数据下载下来,替换上边的 test.json 即可。

值得注意的是,如果我们设置注册的名字为 china ,echarts 会自动给我们加上南沙群岛的放大图:
| 1 | import * as echarts from "echarts"; | 

可能会用到的 options 属性
地图画出来以后,接下来可以照着 echarts 官网 变身为「echarts 配置工程师」了,记得注意一下自己当前的 eharts 版本。
设置悬浮上的数据
我们在 series 中引入 data ,加一点随机数据,其中 name 值是 json 数据中的 properties 对应的 name ,名字一定要一致。
| 1 | const option = { | 
再补上 tooltip 选项。
| 1 | const option = { | 

视觉映射
我们可以通过 visualMap 选项,将数据分组。
| 1 | const option = { | 
设置后之后,我们可以滑动右下角的范围来选取不同的省份。

除了滑块的映射,还支持分区间的,类似下边这种。

其他选项
其他选项这里就不介绍了,可以参考 官网 和 社区 的样例,然后结合自己的需求进行配置即可。
贴几张社区上炫酷的地图:


省份切换
下边再实现一下点击省份切换到对应的省份地图的功能。
知道了上边的东西,思路其实很简单了,我们只需要把所有省份的 Geojson 数据全部下载下来,然后监听 echarts 的点击事件去显示省份即可。
为了逻辑之间的解耦,我们可以再新建一个组件,专门展示省份的数据。
| 1 | <template> | 
我们把省份数据都放到 "../data/province" 目录中,这里简单演示,只下载了两个省份的地图:

通过外部传进来文件的 fileName 注册地图。这里直接通过 require("../data/province" + this.fileName) 来动态引入 Geojson,一定要加上 "../data/province" 前缀来限制文件的位置,关于 webpack 的动态引入的更多细节可以参考 Webpack 打包 commonjs 和 esmodule 动态引入模块的产物对比。
我们增加一个 ProvinceMap 组件来调度两个组件的显示隐藏。
| 1 | <template> | 
在 Map 组件中监听省份的 click ,传递给 ProvinceMap 组件。
| 1 | initData() { | 
在 Province 组件中监听 click,传递给 ProvinceMap 组件。
| 1 | initData() { | 
最后看一下实现的效果:

总
通过 GeoJSON 画 echarts ,知道大致的原理,然后其他配置项参考 官网 和 社区 的例子比对上 配置项 慢慢配置即可,文章的整体代码放到了 github,需要的同学可以参考。
ECharts 最初由百度团队开源,并于 2018 年初捐赠给Apache 基金会,2021 年 1 月 26 日晚,Apache 基金会官方宣布 ECharts 项目正式毕业,成为 Apache 顶级项目。
平时开发 Echarts ,我们就可以从「切图仔」变成「echarts 配置工程师了」,手动狗头。
