实现工具:echarts插件、地图json文件。
江西省市区的离线json文件,已上传到github:https://github.com/Gx2019/map
vue
直接贴代码:
<template>
<div class="NotiBox">
<div class="leftbox">
<!-- <a-button type="primary" style="padding:0 20px;margin:0 0 10px 0px;" @click="province">全省</a-button> -->
<div id="mapBox" ref="myEchartsBox"></div>
</div>
<div class="right">
</div>
</div>
</template>
<script>
var echarts = require(\'echarts\')
export default {
name: \'jxsEchart\',
components: {},
data() {
return {
citys: \'江西省\'
}
},
created() {},
mounted() {
this.getMap()
},
methods: {
displayRender({labels}) {
return labels[labels.length - 1];
},
onChange(value) {
console.log(value.toString())
},
getMap() {
let _that = this
var myEchartsBox = _that.$refs.myEchartsBox
var jxs = require(\'@/assets/jxs.json\')
var ganzhou = require(\'@/assets/ganzhou.json\')
var yichun = require(\'@/assets/yichun.json\')
var xinyu = require(\'@/assets/xinyu.json\')
var shangrao = require(\'@/assets/shangrao.json\')
var pingxiang = require(\'@/assets/pingxiang.json\')
var nanchang = require(\'@/assets/nanchang.json\')
var jiujiang = require(\'@/assets/jiujiang.json\')
var jingdezhen = require(\'@/assets/jingdezhen.json\')
var jian = require(\'@/assets/jian.json\')
var fuzhou = require(\'@/assets/fuzhou.json\')
var yingtan = require(\'@/assets/yingtan.json\')
echarts.extendsMap = function(id, opt) {
var chart = echarts.init(myEchartsBox)
var curGeoJson = {}
var cityMap = {
南昌市: nanchang,
景德镇市: jingdezhen,
萍乡市: pingxiang,
九江市: jiujiang,
新余市: xinyu,
鹰潭市: yingtan,
赣州市: ganzhou,
吉安市: jian,
宜春市: yichun,
抚州市: fuzhou,
上饶市: shangrao
}
var geoCoordMap = {
南昌: [115.89, 28.48],
景德镇: [117.28, 29.09],
萍乡: [113.93, 27.41],
九江: [115.97, 29.51],
新余: [114.81, 27.72],
鹰潭: [117.12, 28.1],
赣州: [115.04, 25.67],
吉安: [115.05, 26.88],
宜春: [114.41, 28.03],
抚州: [116.45, 27.79],
上饶: [117.92, 28.22]
}
var levelColorMap = {
\'1\': \'rgba(241, 109, 115, .8)\',
\'2\': \'rgba(255, 235, 59, .7)\',
\'3\': \'#1BAF\'
}
var defaultOpt = {
mapName: \'china\', // 地图展示
goDown: false, // 是否下钻
bgColor: \'#1BAFAC\', // 画布背景色
activeArea: [], // 区域高亮,同echarts配置项
data: [],
// 下钻回调(点击的地图名、实例对象option、实例对象)
callback: function(name, option, instance) {}
}
if (opt) opt = this.util.extend(defaultOpt, opt)
// 层级索引
var name = [opt.mapName]
var idx = 0
var pos = {
leftPlus: 50,
leftCur: 128,
left: 107,
top: 10 //索引的位置
}
var line = [
[0, 0],
[8, 11],
[0, 22]
]
// style
var style = {
font: \'18px "Microsoft YaHei", sans-serif\',
textColor: \'#eee\',
lineColor: \'rgba(147, 235, 248, .8)\'
}
var handleEvents = {
/**
* i 实例对象
* o option
* n 地图名
**/
resetOption: function(i, o, n) {
var breadcrumb = this.createBreadcrumb(n)
var j = name.indexOf(n)
var l = o.graphic.length
if (j < 0) {
o.graphic.push(breadcrumb)
o.graphic[0].children[0].shape.x2 = 145
o.graphic[0].children[1].shape.x2 = 145
if (o.graphic.length > 2) {
for (var x = 0; x < opt.data.length; x++) {
if (n === opt.data[x].name + \'市\') {
o.series[0].data = handleEvents.initSeriesData([opt.data[x]])
break
} else o.series[0].data = []
}
}
name.push(n)
idx++
} else {
o.graphic.splice(j + 2, l)
if (o.graphic.length <= 2) {
o.graphic[0].children[0].shape.x2 = 60
o.graphic[0].children[1].shape.x2 = 60
o.series[0].data = handleEvents.initSeriesData(opt.data)
}
name.splice(j + 1, l)
idx = j
pos.leftCur -= pos.leftPlus * (l - j - 1)
}
o.geo.map = n
o.geo.zoom = 0.4
i.clear()
i.setOption(o)
this.zoomAnimation()
opt.callback(n, o, i)
},
/**
* name 地图名
**/
createBreadcrumb: function(name) {
var cityToPinyin = {
南昌市: \'nanchang\',
景德镇市: \'jingdezhen\',
萍乡市: \'pingxiang\',
九江市: \'jiujiang\',
新余市: \'xinyu\',
鹰潭市: \'yingtan\',
赣州市: \'ganzhou\',
吉安市: \'jian\',
宜春市: \'yichun\',
抚州市: \'fuzhou\',
上饶市: \'shangrao\'
}
var breadcrumb = {
type: \'group\',
id: name,
left: pos.leftCur + pos.leftPlus,
top: pos.top + 3,
children: [
{
type: \'polyline\',
left: -90,
top: -5,
shape: {
points: line
},
style: {
stroke: \'#fff\',
key: name
// lineWidth: 2,
},
onclick: function() {
var name = this.style.key
handleEvents.resetOption(chart, option, name)
}
},
{
type: \'text\',
left: -68,
top: \'middle\',
style: {
text: name,
textAlign: \'center\',
fill: style.textColor,
font: style.font
},
onclick: function() {
var name = this.style.text
handleEvents.resetOption(chart, option, name)
}
},
{
type: \'text\',
left: -68,
top: 10,
style: {
name: name,
text: cityToPinyin[name] ? cityToPinyin[name].toUpperCase() : \'\',
textAlign: \'center\',
fill: style.textColor,
font: \'12px "Microsoft YaHei", sans-serif\'
},
onclick: function() {
// console.log(this.style);
var name = this.style.name
handleEvents.resetOption(chart, option, name)
}
}
]
}
pos.leftCur += pos.leftPlus
return breadcrumb
},
// 设置effectscatter
initSeriesData: function(data) {
var temp = []
for (var i = 0; i < data.length; i++) {
var geoCoord = geoCoordMap[data[i].name]
if (geoCoord) {
temp.push({
name: data[i].name,
value: geoCoord.concat(data[i].value, data[i].level)
})
}
}
return temp
},
zoomAnimation: function() {
var count = null
var zoom = function(per) {
if (!count) count = per
count = count + per
// console.log(per,count);
chart.setOption({
geo: {
zoom: count
}
})
if (count < 1)
window.requestAnimationFrame(function() {
zoom(0.2)
})
}
window.requestAnimationFrame(function() {
zoom(0.2)
})
}
}
var option = {
backgroundColor: opt.bgColor,
graphic: [
{
type: \'group\',
left: pos.left,
top: pos.top - 4,
children: [
{
type: \'line\',
left: 0,
top: -20,
shape: {
x1: 0,
y1: 0,
x2: 60,
y2: 0
},
style: {
stroke: style.lineColor
}
},
{
type: \'line\',
left: 0,
top: 20,
shape: {
x1: 0,
y1: 0,
x2: 60,
y2: 0
},
style: {
stroke: style.lineColor
}
}
]
},
{
id: name[idx],
type: \'group\',
left: pos.left + 2,
top: pos.top,
children: [
{
type: \'polyline\',
left: 90,
top: -12,
shape: {
points: line
},
style: {
stroke: \'transparent\',
key: name[0]
},
onclick: function() {
var name = this.style.key
handleEvents.resetOption(chart, option, name)
}
},
{
type: \'text\',
left: 0,
top: \'middle\',
style: {
text: name[0] === \'江西\' ? \'江西省\' : name[0],
textAlign: \'center\',
fill: style.textColor,
font: style.font
},
onclick: function() {
handleEvents.resetOption(chart, option, \'江西\')
}
},
{
type: \'text\',
left: 0,
top: 10,
style: {
text: \'JIANGXI\',
textAlign: \'center\',
fill: style.textColor,
font: \'12px "STKaiti", sans-serif\'
},
onclick: function() {
handleEvents.resetOption(chart, option, \'江西\')
}
}
]
}
],
geo: {
map: opt.mapName,
// roam: true,
zoom: 1,
label: {
normal: {
show: true,
textStyle: {
color: \'#fff\'
}
},
emphasis: {
textStyle: {
color: \'#fff\'
}
}
},
itemStyle: {
normal: {
borderColor: \'rgba(147, 235, 248, 1)\',
borderWidth: 1,
areaColor: {
type: \'radial\',
x: 0.5,
y: 0.5,
r: 0.8,
colorStops: [
{
offset: 0,
color: \'rgba(147, 235, 248, 0)\' // 0% 处的颜色
},
{
offset: 1,
color: \'rgba(147, 235, 248, .2)\' // 100% 处的颜色
}
],
globalCoord: false // 缺省为 false
},
shadowColor: \'rgba(128, 217, 248, 1)\',
// shadowColor: \'rgba(255, 255, 255, 1)\',
shadowOffsetX: -2,
shadowOffsetY: 2,
shadowBlur: 10
},
emphasis: {
areaColor: \'#389BB7\',
borderWidth: 0
}
},
regions: opt.activeArea.map(function(item) {
if (typeof item !== \'string\') {
return {
name: item.name,
itemStyle: {
normal: {
areaColor: item.areaColor || \'#389BB7\'
}
},
label: {
normal: {
show: item.showLabel,
textStyle: {
color: \'#fff\'
}
}
}
}
} else {
return {
name: item,
itemStyle: {
normal: {
borderColor: \'#91e6ff\',
areaColor: \'#1BAFAC\'
}
}
}
}
})
},
series: [
{
type: \'effectScatter\',
coordinateSystem: \'geo\',
// symbol: \'diamond\',
showEffectOn: \'render\',
rippleEffect: {
period: 15,
scale: 6,
brushType: \'fill\'
},
hoverAnimation: true,
itemStyle: {
normal: {
color: function(params) {
return levelColorMap[params.value[3]]
},
shadowBlur: 10,
shadowColor: \'#333\'
}
},
data: handleEvents.initSeriesData(opt.data)
}
]
}
chart.setOption(option)
// 添加事件
chart.on(\'click\', function(params) {
var _self = this
if (opt.goDown && params.name !== name[idx]) {
if (cityMap[params.name]) {
var url = cityMap[params.name]
echarts.registerMap(params.name, url)
handleEvents.resetOption(_self, option, params.name)
}
}
_that.citys = params.name
console.log(_that.citys)
})
chart.setMap = function(mapName) {
var _self = this
if (mapName.indexOf(\'市\') < 0) mapName = mapName + \'市\'
var citySource = cityMap[mapName]
if (citySource) {
var url = \'./map/\' + citySource + \'.json\'
echarts.registerMap(mapName, url)
handleEvents.resetOption(_self, option, mapName)
}
// handleEvents.resetOption(this, option, mapName);
}
return chart
}
echarts.registerMap(\'江西\', jxs)
var myChart = echarts.extendsMap(\'chart-panel\', {
bgColor: \'\', // 画布背景色
mapName: \'江西\', // 地图名
goDown: true, // 是否下钻
// 下钻回调
callback: function(name, option, instance) {
// console.log(name, option, instance);
},
// 数据展示
data: [
{
name: \'南昌\',
value: 10,
level: 1
},
{
name: \'景德镇\',
value: 12,
level: 2
},
{
name: \'萍乡\',
value: 11,
level: 3
},
{
name: \'赣州\',
value: 16,
level: 3
},
{
name: \'吉安\',
value: 12,
level: 3
},
{
name: \'上饶\',
value: 12,
level: 3
},
{
name: \'九江\',
value: 12,
level: 3
},
{
name: \'抚州\',
value: 12,
level: 3
},
{
name: \'宜春\',
value: 12,
level: 3
},
{
name: \'新余\',
value: 12,
level: 3
},
{
name: \'鹰潭\',
value: 12,
level: 3
}
]
})
}
}
}
</script>
<style scoped>
.NotiBox {
width: 100%;
position: relative;
}
.NotiBox #mapBox {
width: 45%;
min-height: 600px;
overflow: hidden;
left: -100px;
position: absolute;
float: left;
}
.leftbox {
float: left;
height: 600px;
}
.right {
width: 55%;
float: right;
height: 600px;
color: #000;
overflow-y: scroll;
overflow-x: hidden;
}
</style>
放这段代码上去修改下 县市级地图就做好了
参考:https://gallery.echartsjs.com/editor.html?c=xqxC1bMBiF