最近做了一个数据驾驶舱,跟大部分驾驶舱一样,需要支持各种图表以及地图的显示。期间地图的显示碰到了一些问题,大部分都是和优化相关,先贴效果图吧。

上图需要实现下面几个优化点
1:地图背景实现渐变色
2:初始化地图时需要默认高亮几个省份
3:地图悬浮本身的样式效果去掉,只需要省份名字颜色变成黑色
4:地图不支持选中省份
这些优化点说难不难,就是挺麻烦的。这些点大部分都需要重新定制地图样式。这次引入的插件是 echarts。获取 mapjson数据可以从 DataV数据可视化平台上下载,这是阿里提供的一个平台,也有对应的大屏UI 组件,但我公司的大屏是自己设计的,不匹配,所以目前只用了地图 json 数据。我先直接把代码 po 出来。
options = {
backgroundColor: 'transparent',
width: this.cssStyle.height,
height: this.cssStyle.height,
zoom: 3.5,
layoutCenter: ['50%', '70%'],
layoutSize: '136%',
geo: {
show: true,
map: 'china',
label: {
show: true
},
roam: false,
itemStyle: {
areaColor: {
image: imgBg,
repeat: 'repeat-x',
},
shadowColor: '#0A1B70',
shadowOffsetX: 0,
shadowOffsetY:0.1,
},
regions,
select: {
label: {
show: true,
z:100,
color: '#fff'
},
itemStyle: {
areaColor: '#EA7325',
borderColor: "transparent",
borderWidth: 0.5
}
},
},
series: [
{
type: 'map',
map: 'china',
label: {
show: true,
color: "#fff",
fontSize: 12,
fontWeight: "bold",
formatter: "{b}",
z: 100,
position: 'inside',
},
roam: false,
itemStyle: {
normal: {
areaColor: 'transparent',
borderColor: '#3FFFFF',
borderWidth: 0.8,
},
},
emphasis: {
label: {
z:100,
show: true,
color: '#333',
},
itemStyle: {
areaColor: 'transparent'
}
},
selectedMode: 'false',
}
]
}
1:地图背景实现渐变色
echarts itemStyle areaColor只支持设置省份的颜色,也支持插入背景图,如果在 itemStyle 设置渐变,最终的效果就是每个省份都是渐变色。所以这里直接改变思路,在 series 里将每个省份的背景色改为透明。在 geo 里设置 map 的底图,底图可以是渐变色。但是需要注意设置的背景图最好和地图的尺寸大小一致。
2:初始化地图时需要默认高亮几个省份
方法 1:通过 dispatchAction 方法去设置需要高亮的省份。其中 name 必须和 mapJson 数据里的 name 保持一致,并且selectedMode设置为支持选中。但是这样做有一个 bug,dispatchAction 是通过 select 的方式去选中高亮的省份。高亮的省份 z-index层级高于其他图层,会遮挡住其他省份的显示。所以这种方式 pass

const name = ['浙江','江西']
name.forEach(item => {
this.$nextTick(() => {
this.myChart.dispatchAction({
type: 'select',
name: item
})
})
})
方法 2:在 regions 里设置需要高亮的省份
let regions = []
const name = this.province ? this.province.map(m => (m.includes('内蒙古') || m.includes('黑龙江') ? m.slice(0, 3) : (m.includes('南海') ? m.slice(0, 4) : m.slice(0, 2)))) : []
name.forEach(item => {
regions.push({
name: item,
selected:true,
label: {
show: true,
z:100,
color: '#fff'
},
itemStyle: {
areaColor: '#EA7325',
borderColor: "transparent",
borderWidth: 0.5
}
})
})
options = {
...
geo:{
...
regions,
...
}
}
以上差不多就是所有的代码了,3 和 4 都是 echarts 本身就有的 api。