echarts地图下钻功能实现,下面是效果图:


如何用echarts显示地图
首先需要下载map的Json数据,我放到这里:mapJson,提取码:nbs2
然后使用echarts的geo配置,或者series的type = 'map'就可以加载地图了:
import chinaMapJson from "./china.json"
echarts.registerMap('china', chinaMapJson)
var options = {
tooltip:{
show:false
},
geo: {
map: 'china',
roam:false,
label: {
emphasis: {
show: false
}
}
}
}
const el = document.getElementById("chart")
const chart = echart.init(el)
chart.setOption(options)这样就可以显示中国地图。
第二种是series的type设置为map:
import chinaMapJson from "./china.json"
echarts.registerMap('china', chinaMapJson)
var options = {
tooltip:{
show:false
},
series: [
{
type: 'map',
map: 'china'
}
]
}
const el = document.getElementById("chart")
const chart = echart.init(el)
chart.setOption(options)注意
中国地图的名字叫china才会显示南海诸岛,别的名字不会显示
如何设置地图的纹理
itemStyle.areaColor的配置文档中,写着:
提示
支持使用rgb(255,255,255),rgba(255,255,255,1),#fff等方式设置为纯色,也支持设置为渐变色和纹理填充
// 纹理填充
{
image: imageDom, // 支持为 HTMLImageElement, HTMLCanvasElement,不支持路径字符串
repeat: ‘repeat’ // 是否平铺,可以是 ‘repeat-x’, ‘repeat-y’, ‘no-repeat’
}可以使用这种方式来实现地图的纹理以及高亮状态的纹理
如何给地图设置阴影
地图阴影其实我使用了geo和series的两种地图叠加起来,第一层geo设置了阴影,第二层series的地图使用了描边。
const imageDom = document.createElement("img")
imageDom.src = "./texture.png"
const lightDom = document.createElement("img")
lightDom.src = "./light.png"
let options = {
tooltip:{
show:false
},
geo: {
map: '',
roam:false,
label: {
emphasis: {
show: false
}
},
itemStyle: {
shadowColor: '#C3F4F4',
shadowOffsetX:'-2px',
shadowOffsetY: '10px',
shadowBlur: '5px'
}
},
series: [
{
type: 'map',
map: 'china',
roam: false,
tooltip:{
show:false
},
label: {
show:false,
color:'#fff'
},
itemStyle: {
areaColor:imageDom,
borderColor: '#C3F4F4',
borderWidth:'2px'
},
emphasis: {
itemStyle: {
areaColor:lightDom
},
label:{
show:false
}
}
}
]
}这样就可以绘制出效果来了
地图下钻实现
地图下钻其实就是,在地图的点击事件回调中,加载了另一份地图的json并注册地图,然后再setOption中更改了地图名字。
chart.on('click', (params) => {
if (params.componentSubType == 'map') {
goDown(params.name)
}
})
//用来存放当前的地图名字
let currentName = ''
//用来存放下钻的历史记录
let history = []
async function goDown(name){
//获取地图数据之后,修改地图options
const mapname = name
if (!echarts.getMap(name)) {
const newMapJson = await getMapJson(name)
echarts.registerMap(mapname, newMapJson)
}
options.geo.map = mapname
options.series[0].map = mapname
//然后重新绘制地图
history.push(currentName)
chart.setOption(this.options)
currentName = name
}
async function getMapJson(name) {
const jsonData = await import('./map/'+name+'.json')
return jsonData.default
}地图回钻实现
刚刚在下钻时保存了名字和历史记录,所以回钻就是把历史记录中的最后一项弹出
function returnUpLevel() {
//先判断history有没有数据,能不能返回
if(history.length == 0){
return false
}
//取出要返回的那个名字
const name = history.pop()
const currentJson = echarts.getMap(mapname).geoJson
//修改地图配置重新绘制地图
options.geo.map = mapname
options.series[0].map = mapname
chart.setOption(options)
//修改当前的层级,名字
currentName = name
}