react使用Echarts绘制高亮可点击选中的省市地图
最近做项目遇到一个需求,需要显示广东省各个地级市的地图,并且鼠标移入高亮显示,鼠标点击可以选中某个地级市。在网上查阅了大量资料之后,最后选择了使用echarts实现该需求。在此记录一下,希望可以帮到有需求的小伙伴。本人初次使用,有不足之处希望大家可以指出,先看看效果图:

该需求主要有以下几个关键点:
首先我们需要初始化一个地图坐标系,可以在网上下载一个地图的json文件。
import GDJson from '../../../../statics/cdn/guangdong.json';
echarts.registerMap('GD', GDJson);
然后就是通过配置option绘制出具体的地图,此处我是通过绘制一个散点图,实现的各个地级市名字的显示,需要知道各个市的经纬度,这个可以在网上查到。然后通过dataRange设置了不同的value值所显示的颜色。具体配置如下所示:
var provienceData = [
{ name: '广州', type: 'areaCenterCity', value: 0, departId: '001021' },
{ name: '深圳', type: 'areaCenterCity', value: 0, departId: '001020' },
{ name: '佛山', type: 'areaCenterCity', value: 0, departId: '001004' },
{ name: '东莞', type: 'areaCenterCity', value: 0, departId: '001008' },
{ name: '中山', type: 'areaCenterCity', value: 0, departId: '001019' },
{ name: '珠海', type: 'areaCenterCity', value: 0, departId: '001011' },
{ name: '江门', type: 'areaCenterCity', value: 0, departId: '001015' },
{ name: '肇庆', type: 'areaCenterCity', value: 0, departId: '001005' },
{ name: '惠州', type: 'areaCenterCity', value: 0, departId: '001010' },
{ name: '汕头', type: 'areaCenterCity', value: 0, departId: '001007' },
{ name: '潮州', type: 'areaCenterCity', value: 0, departId: '001009' },
{ name: '揭阳', type: 'areaCenterCity', value: 0, departId: '001006' },
{ name: '汕尾', type: 'areaCenterCity', value: 0, departId: '001001' },
{ name: '湛江', type: 'areaCenterCity', value: 0, departId: '001018' },
{ name: '茂名', type: 'areaCenterCity', value: 0, departId: '001003' },
{ name: '阳江', type: 'areaCenterCity', value: 0, departId: '001016' },
{ name: '韶关', type: 'areaCenterCity', value: 0, departId: '001013' },
{ name: '清远', type: 'areaCenterCity', value: 0, departId: '001017' },
{ name: '云浮', type: 'areaCenterCity', value: 0, departId: '001002' },
{ name: '梅州', type: 'areaCenterCity', value: 0, departId: '001014' },
{ name: '河源', type: 'areaCenterCity', value: 0, departId: '001012' },
];
let option = {
dataRange: {
show: false,
x: 'left',
y: 'bottom',
splitList: [
{ start: 0, end: 0, color: '#13667e' },//当值为5时,区域背景
{ start: 5, end: 5, color: '#187fed' },//当值为5时,区域背景
],
},
geo: {
map: 'GD',
roam: false,
zoom: 0.94,
tooltip: {
show: false, //不显示提示标签
},
center: [113.122717, 22.900762],
label: {
normal: {
show: false,//显示省份标签
textStyle: { color: "#333333" }//省份标签字体颜色
},
emphasis: {//对应的鼠标悬浮效果
show: false,
textStyle: { color: "#333333" }
}
},
itemStyle: {
normal: {
borderWidth: 1,//区域边框宽度
borderColor: '#ffffff',//区域边框颜色
areaColor: "#fff",//区域颜色
label: { show: false }
},
emphasis: {
areaColor: "#187fed",
}
},
},
series: [
{
type: 'scatter', //'line'(折线图) | 'bar'(柱状图) | 'scatter'(散点图) | 'k'(K线图)
//'pie'(饼图) | 'radar'(雷达图) | 'chord'(和弦图) | 'force'(力导向布局图) | 'map'(地图)
coordinateSystem: 'geo',
data: this.convertData(provienceData),
symbolSize: 10,
symbolRotate: 40,
geoIndex: 0,
label: {
normal: {
formatter: '{b}',
position: 'bottom',
show: true,
color: '#fff',
},
emphasis: {
show: false
}
},
tooltip: {
show: false, //不显示提示标签
formatter: '{c}', //提示标签格式
backgroundColor: "#fff",//提示标签背景颜色
borderColor: '#ccc',
borderWidth: 5,
textStyle: { color: "#ccc" } //提示标签字体颜色
},
itemStyle: {
normal: {
color: '#fff'
}
}
},
{
type: 'map',
mapType: 'GD',
geoIndex: 0,
roam: false,
zoom: 0.94,
center: [113.122717, 22.900762],
tooltip: {
show: false, //不显示提示标签
},
label: {
normal: {
show: false //显示省份标签
},
emphasis: {
show: false,
}
},
itemStyle: {
//正常样式
normal: {
borderWidth: 1, //区域边框宽度
borderColor: '#ffffff', //区域边框颜色
areaColor: "#187fed",
},
//鼠标事件区块样式
emphasis: {
areaColor: "#187fed",
}
},
data: provienceData
}
],
}
myChart.setOption(option);
convertData(data) {
const geoCoordMap = {
'广州': [113.480637, 23.325178],
'深圳': [114.085947, 22.597],
'佛山': [113.022717, 23.028762],
'东莞': [113.746262, 23.006237],
'中山': [113.382391, 22.521113],
'珠海': [113.353986, 22.124979],
'江门': [112.594942, 22.290431],
'肇庆': [112.072529, 23.651546],
'惠州': [114.412599, 23.079404],
'汕头': [116.708463, 23.37102],
'潮州': [116.832301, 23.761701],
'揭阳': [116.055733, 23.343778],
'汕尾': [115.364238, 22.974485],
'湛江': [110.064977, 21.274898],
'茂名': [110.919229, 21.959751],
'阳江': [111.805107, 22.009222],
'韶关': [113.591544, 24.801322],
'清远': [113.051227, 24.285022],
'云浮': [112.044439, 22.929801],
'梅州': [116.117582, 24.299112],
'河源': [114.997802, 23.946266],
}
var res = [];
for (var i = 0; i < data.length; i++) {
var geoCoord = geoCoordMap[data[i].name];
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value),
area: data[i].area,
type: data[i].type,
});
}
}
return res;
}
最后则是为地图添加点击事件,点击某个区域的时候,更改某个区域的value值,进而改变其颜色
myChart.on('click', function (params) {
for (let i = 0; i < provienceData.length; i++) {
provienceData[i].value = 0
if (params.name === provienceData[i].name && _this.state.departName !== params.data.name) {
provienceData[i].value = 5
}
}
myChart.setOption(option);
});
最后来一波总体代码
import React from 'react'
import echarts from 'echarts';
import GDJson from '../../../../statics/cdn/guangdong.json';
componentDidMount() {
this.initalECharts()
}
// 初始化地图
initalECharts() {
if(!document.getElementById('map')){
return
}
let _this = this
var provienceData = [
{ name: '广州', type: 'areaCenterCity', value: 0, departId: '001021' },
{ name: '深圳', type: 'areaCenterCity', value: 0, departId: '001020' },
{ name: '佛山', type: 'areaCenterCity', value: 0, departId: '001004' },
{ name: '东莞', type: 'areaCenterCity', value: 0, departId: '001008' },
{ name: '中山', type: 'areaCenterCity', value: 0, departId: '001019' },
{ name: '珠海', type: 'areaCenterCity', value: 0, departId: '001011' },
{ name: '江门', type: 'areaCenterCity', value: 0, departId: '001015' },
{ name: '肇庆', type: 'areaCenterCity', value: 0, departId: '001005' },
{ name: '惠州', type: 'areaCenterCity', value: 0, departId: '001010' },
{ name: '汕头', type: 'areaCenterCity', value: 0, departId: '001007' },
{ name: '潮州', type: 'areaCenterCity', value: 0, departId: '001009' },
{ name: '揭阳', type: 'areaCenterCity', value: 0, departId: '001006' },
{ name: '汕尾', type: 'areaCenterCity', value: 0, departId: '001001' },
{ name: '湛江', type: 'areaCenterCity', value: 0, departId: '001018' },
{ name: '茂名', type: 'areaCenterCity', value: 0, departId: '001003' },
{ name: '阳江', type: 'areaCenterCity', value: 0, departId: '001016' },
{ name: '韶关', type: 'areaCenterCity', value: 0, departId: '001013' },
{ name: '清远', type: 'areaCenterCity', value: 0, departId: '001017' },
{ name: '云浮', type: 'areaCenterCity', value: 0, departId: '001002' },
{ name: '梅州', type: 'areaCenterCity', value: 0, departId: '001014' },
{ name: '河源', type: 'areaCenterCity', value: 0, departId: '001012' },
];
echarts.registerMap('GD', GDJson);
//初始化ECharts实例
const myChart = echarts.init(document.getElementById('map'));
let option = {
dataRange: {
show: false,
x: 'left',
y: 'bottom',
splitList: [
{ start: 0, end: 0, color: '#13667e' },//当值为5时,区域背景
{ start: 5, end: 5, color: '#187fed' },//当值为5时,区域背景
],
},
geo: {
map: 'GD',
roam: false,
zoom: 0.94,
tooltip: {
show: false, //不显示提示标签
},
center: [113.122717, 22.900762],
label: {
normal: {
show: false,//显示省份标签
textStyle: { color: "#333333" }//省份标签字体颜色
},
emphasis: {//对应的鼠标悬浮效果
show: false,
textStyle: { color: "#333333" }
}
},
itemStyle: {
normal: {
borderWidth: 1,//区域边框宽度
borderColor: '#ffffff',//区域边框颜色
areaColor: "#fff",//区域颜色
label: { show: false }
},
emphasis: {
areaColor: "#187fed",
}
},
},
series: [
{
type: 'scatter', //'line'(折线图) | 'bar'(柱状图) | 'scatter'(散点图) | 'k'(K线图)
//'pie'(饼图) | 'radar'(雷达图) | 'chord'(和弦图) | 'force'(力导向布局图) | 'map'(地图)
coordinateSystem: 'geo',
data: this.convertData(provienceData),
symbolSize: 10,
symbolRotate: 40,
geoIndex: 0,
label: {
normal: {
formatter: '{b}',
position: 'bottom',
show: true,
color: '#fff',
},
emphasis: {
show: false
}
},
tooltip: {
show: false, //不显示提示标签
formatter: '{c}', //提示标签格式
backgroundColor: "#fff",//提示标签背景颜色
borderColor: '#ccc',
borderWidth: 5,
textStyle: { color: "#ccc" } //提示标签字体颜色
},
itemStyle: {
normal: {
color: '#fff'
}
}
},
{
type: 'map',
mapType: 'GD',
geoIndex: 0,
roam: false,
zoom: 0.94,
center: [113.122717, 22.900762],
tooltip: {
show: false, //不显示提示标签
},
label: {
normal: {
show: false //显示省份标签
},
emphasis: {
show: false,
}
},
itemStyle: {
//正常样式
normal: {
borderWidth: 1, //区域边框宽度
borderColor: '#ffffff', //区域边框颜色
areaColor: "#187fed",
},
//鼠标事件区块样式
emphasis: {
areaColor: "#187fed",
}
},
data: provienceData
}
],
}
myChart.setOption(option); myChart.on('click', function (params) {
for (let i = 0; i < provienceData.length; i++) {
provienceData[i].value = 0
if (params.name === provienceData[i].name && _this.state.departName !== params.data.name) {
provienceData[i].value = 5
}
}
if (_this.state.departName !== params.data.name) {
_this.setState({ departName: params.data.name, departId: params.data.departId }, () => {
_this.getData()
})
} else {
_this.setState({ departName: '', departId: '' }, () => {
_this.getData()
})
}
myChart.setOption(option);
});
window.addEventListener('resize', () => {
if (myChart && myChart.resize) {
myChart.resize();
}
}); }
// 添加地图每个市的坐标
convertData(data) {
const geoCoordMap = {
'广州': [113.480637, 23.325178],
'深圳': [114.085947, 22.597],
'佛山': [113.022717, 23.028762],
'东莞': [113.746262, 23.006237],
'中山': [113.382391, 22.521113],
'珠海': [113.353986, 22.124979],
'江门': [112.594942, 22.290431],
'肇庆': [112.072529, 23.651546],
'惠州': [114.412599, 23.079404],
'汕头': [116.708463, 23.37102],
'潮州': [116.832301, 23.761701],
'揭阳': [116.055733, 23.343778],
'汕尾': [115.364238, 22.974485],
'湛江': [110.064977, 21.274898],
'茂名': [110.919229, 21.959751],
'阳江': [111.805107, 22.009222],
'韶关': [113.591544, 24.801322],
'清远': [113.051227, 24.285022],
'云浮': [112.044439, 22.929801],
'梅州': [116.117582, 24.299112],
'河源': [114.997802, 23.946266],
}
var res = [];
for (var i = 0; i < data.length; i++) {
var geoCoord = geoCoordMap[data[i].name];
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value),
area: data[i].area,
type: data[i].type,
});
}
}
return res;
}
render(){
return(<div className={styles.map} id="map"></div>)
}
react使用Echarts绘制高亮可点击选中的省市地图的更多相关文章
- react使用echarts
1.安装echarts: npm install echarts --save 2.制作线性图组件,只引入echart必要的js内容 /** * Created by yongyuehuang on ...
- React+Echarts简单的封装套路
今天我们来介绍一下React中,对Echarts的一个简单的封装. 首先在我们的React项目中,想使用Echart包,首先需要先安装它,安装代码如下,任选一个就可以 cnpm install ech ...
- react的echarts BizCharts
react BizCharts react的饼图,折线图 点击进入官网 -> https://bizcharts.net/products/bizCharts/demo 如果你在这遇到了问题,欢 ...
- react之echarts数据更新
react之echarts数据更新 在使用setState更新数据时,如果要将图标更新,需要做一些简单的封装,代码如下: import React, { Component } from 'react ...
- 使用echarts绘制漂亮的渐变键盘仪表盘
echarts官方示例和默认样式都比较难看,经过一顿捣鼓实现比较漂亮的渐变仪表盘. 第一步:设置轴线 将图表轴线.label.分割线.隐藏,只保留刻度,然后修改刻度样式达到最终效果.不过要注意的是ax ...
- webpack+react实现echarts可视化配置
先上效果 开发环境要求 需要事先安装node及npm 前期准备 1.创建文件夹react-echarts-editor2.在项目根目录(以下称根目录)下创建src目录3.在项目根目录下创建dist目录 ...
- 使用echarts绘制条形图和扇形图
使用echarts绘制条形图和扇形图 简单举例说明下echarts如何绘制条形图和扇形图 代码示例 <!doctype html> <html lang="en" ...
- Echarts如何添加鼠标点击事件?防止重复触发点击事件
Echarts如何添加鼠标点击事件? 1.通常我们只使用了以下代码,通过配置项和数据显示图表. var myChart = echarts.init(document.getElementById(' ...
- echarts —— 绘制横向柱状图(圆角、无坐标轴)
UI给了设计图,看了一眼觉得简单,不就是无序列表布局嘛(ul,li),后来才知道那是echarts图,好吧,样式如下: 代码如下:(渐变色没做) <!DOCTYPE html> <h ...
随机推荐
- python datetime 转timestamp
import datetime import time d1=datetime.date.today() t1=time.mktime(d1.timetuple()) d2=datetime.date ...
- 抛弃os.path,拥抱pathlib
基于Python的文件.目录和路径操作,我们一般使用的是os.path模块. pathlib是它的替代品,在os.path上的基础上进行了封装,实现了路径的对象化,api更加通俗,操作更便捷,更符编程 ...
- 学习Echarts:(二)异步加载更新
这部分比较简单,对图表的异步加载和更新,其实只是异步获取数据然后通过setOption传入数据和配置而已. $.get('data.json').done(function (data) { myCh ...
- docker 学习(一)
1. docker介绍 1)docker的出现 Docker是诞生于2013年,是dotCloud的一个开源项目,基于Google推出的GO语言实现.遵从Apache2.0协议. 2)docker介绍 ...
- vue修改对象的属性值后页面不重新渲染
原文地址:vue修改对象的属性值后页面不重新渲染 最近项目在使用vue,遇到几次修改了对象的属性后,页面并不重新渲染,场景如下: HTML页面如下: [html] view plain copy &l ...
- SVN:TortoiseSVN SendRpt.exe not found 完美解决
今天来上班的时候,发现公司用的svn版本和我自己的不一致,其实可以使用但是还是神经质的更新了一下.结果每次右键都会出一个异常.下图所示. 期初以为是哪里配置错误,或者版本冲突,经过网上查找办法,完美解 ...
- 【scrapy运行姿势】scrapy.cmdline.execute
scrapy.cmdline.execute scrapy的cmdline命令 1.启动爬虫的命令为:scrapy crawl (爬虫名) 2.还可以通过以下方式来启动爬虫 方法一:创建一个.py文件 ...
- JZOJ 4611. 【NOI2016模拟7.11】接水问题 (贪心+A*+可持久化线段树)
Description: https://gmoj.net/senior/#main/show/4611 题解: 先把A从大到小排序,最小的由排序不等式显然. 考虑类似第k短路的A*的做法. 定义状态 ...
- 【Mac+Wind7】pytest + allure生成定制报告
一.升级Powershell(windows7及以上版本默认自带.其实普通的CMD命令行工具够用了) 我是Win7默认带的pw1.0,太古老了升级一下,地址如下,选择与自己windows版本匹配的连接 ...
- 解决ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 这种问题需要强行重新修改密码,方法 ...