最近用 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
配置工程师了」,手动狗头。