目前越来越多的项目中开始使用地图,而对地图的需求也不仅仅是简单的纯展示,更多了各种各样的交互功能。今天这篇文章主要介绍的就react中通过Echarts实现一个高亮可点击的省市地图。接下来先看看效果图:
![4f6566560ad201c0077ec5d3bdff642f.png](https://i-blog.csdnimg.cn/blog_migrate/b1b0be8166d6f1a1a576b4c028cb11f5.png)
这个效果主要有以下几个关键点:
地图坐标系
首先我们需要在Echarts容器中初始化一个地图坐标系,这个需要在网上下载一个地图的json文件。可以按照自己的需求去网上搜索下载。准备好了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 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[i].value = 0
if (params.name === provienceData[i].name && _this.state.departName !== params.data.name) {
provienceData[i].value = 5
}
}
myChart.setOption(option);
});
这样一个高亮可点击选中的省市地图就坐好了。
>>> 技术讨论群 <<<
请关注公众号,回复加群
- | 想知道更多?-
请动动你发财的小手点点关注
目前4000+人已关注加入我们