我的修改,希望能够帮助到各位!
配置项如下
// 主要还是要感谢“K...雪”大佬的技术支持,要是没有该大佬
// 也就没有现在这个湖南省的echarts地图,有需要可以去观摩
// https://www.makeapie.com/editor.html?c=x4PnHcyVb5
// 上面是大佬的原生代码,拿来就可以使用
// 湖南省
var uploadedDataURL = "https://geo.datav.aliyun.com/areas_v2/bound/430000_full.json";
// 长沙市
var changsha = "https://geo.datav.aliyun.com/areas_v2/bound/430100_full.json";
// 株洲市
var zhuzhou = "https://geo.datav.aliyun.com/areas_v2/bound/430200_full.json";
// 湘潭市
var xiangtan = "https://geo.datav.aliyun.com/areas_v2/bound/430300_full.json";
// 常德市
var changde = "https://geo.datav.aliyun.com/areas_v2/bound/430700_full.json";
// 郴州市
var chenzhou = "https://geo.datav.aliyun.com/areas_v2/bound/431000_full.json";
// 衡阳市
var henyang = "https://geo.datav.aliyun.com/areas_v2/bound/430400_full.json";
// 怀化市
var huaihua = "https://geo.datav.aliyun.com/areas_v2/bound/431200_full.json";
// 娄底市
var loudi = "https://geo.datav.aliyun.com/areas_v2/bound/431300_full.json";
// 邵阳市
var shaoyang = "https://geo.datav.aliyun.com/areas_v2/bound/430500_full.json";
// 益阳市
var yiyang = "https://geo.datav.aliyun.com/areas_v2/bound/430900_full.json";
// 永州市
var yongzhou = "https://geo.datav.aliyun.com/areas_v2/bound/431100_full.json";
// 岳阳市
var yueyang = "https://geo.datav.aliyun.com/areas_v2/bound/430600_full.json";
// 张家界市
var zhangjiajie = "https://geo.datav.aliyun.com/areas_v2/bound/430800_full.json";
// 湘西土家族苗族自治州
var xiangxi = "https://geo.datav.aliyun.com/areas_v2/bound/433100_full.json";
// 对json数据进行处理
$.get(uploadedDataURL, function(geoJson) {
myChart.hideLoading();
echarts.registerMap('湖南', geoJson);
// 各市级
var cityMap = {
'长沙市': changsha,
'株洲市': zhuzhou,
'湘潭市': xiangtan,
'常德市': changde,
'郴州市': chenzhou,
'衡阳市': henyang,
'怀化市': huaihua,
'娄底市': loudi,
'邵阳市': shaoyang,
'益阳市': yiyang,
'永州市': yongzhou,
'岳阳市': yueyang,
'张家界市': zhangjiajie,
'湘西土家族苗族自治州': xiangxi
};
// 各市级坐标,通过 http://api.map.baidu.com/lbsapi/getpoint/index.html?qq-pf-to=pcqq.group 去获取
var gdGeoCoordMap = {
'长沙市': [112.945358,28.234451],
'株洲市': [113.142199,27.830501],
'湘潭市': [112.952189,27.835703],
'常德市': [111.706024,29.037245],
'郴州市': [113.022608,25.777204],
'衡阳市': [112.584198,26.900606],
'怀化市': [110.010239,27.575161],
'娄底市': [112.000353,27.705255],
'邵阳市': [111.476157,27.243729],
'益阳市': [112.367266,28.559712],
'永州市': [111.621754,26.426899],
'岳阳市': [113.135488,29.364184],
'张家界市': [110.488982,29.122817],
'湘西土家族苗族自治州': [109.74443,28.322965]
};
// 各市级站点数据
var gdDatas = [
[{
name: '长沙市',
value: 28
}],
[{
name: '株洲市',
value: 19
}],
[{
name: '湘潭市',
value: 6
}],
[{
name: '常德市',
value: 0
}],
[{
name: '郴州市',
value: 0
}],
[{
name: '衡阳市',
value: 0
}],
[{
name: '怀化市',
value: 0
}],
[{
name: '娄底市',
value: 0
}],
[{
name: '邵阳市',
value: 0
}],
[{
name: '益阳市',
value: 0
}],
[{
name: '永州市',
value: 0
}],
[{
name: '岳阳市',
value: 0
}],
[{
name: '张家界市',
value: 0
}],
[{
name: '湘西土家族苗族自治州',
value: 0
}]
];
// 长沙市站点数据
var changshadata = [{
name: "桔子洲",
value: [112.970259,28.209371, 3],
},
{
name: "五一大桥",
value: [112.974812,28.201219, 2],
},
{
name: "猴子石",
value: [112.966892,28.147666, 1],
}
];
// 株洲市站点数据
var zhuzhoudata = [{
name: "株洲市四水厂(枫溪)",
value: [113.795, 26.6315, 3],
},
{
name: "株洲市一水厂",
value: [113.521, 27.1174, 2],
},
{
name: "株洲市二、三水厂(白石)",
value: [113.755, 26.8041, 1],
},
{
name: "炎陵泵房",
value: [113.843, 26.3766, 0],
}
];
// 湘潭市站点数据
var xiangtandata = [{
name: "湘潭市三水厂",
value: [112.892, 27.4549, 3],
},
{
name: "湘潭市易俗河水厂",
value: [112.956, 27.7689, 2],
},
{
name: "涓水入湘江口",
value: [112.782, 27.662, 0],
}
];
// 常德市站点数据
var changdedata = [{
name: "武陵大桥",
value: [111.705018,29.023562, 1],
}];
// 郴州市站点数据
var chenzhoudata = [{
name: "东江",
value: [113.183872,25.916113, 1],
}
];
// 衡阳市站点数据
var henyangdata = [{
name: "蒸水湘江入水口",
value: [112.620562,26.917616, 1],
}
];
// 怀化市站点数据
var huaihuadata = [{
name: "舞水大桥",
value: [109.962382,27.552532, 1],
}
];
// 娄底市站点数据
var loudidata = [{
name: "涟水入水口",
value: [112.0752,27.741965, 1],
}
];
// 邵阳市站点数据
var shaoyangdata = [{
name: "资水",
value: [111.497429,27.266338, 1],
}
];
// 益阳市站点数据
var yiyangdata = [{
name: "益阳资江二桥口",
value: [112.381531,28.604063, 1],
}
];
// 永州市站点数据
var yongzhoudata = [{
name: "祁阳市湘江二桥口",
value: [111.84403,26.572493, 1],
}
];
// 岳阳市站点数据
var yueyangdata = [{
name: "东洞庭湖",
value: [113.048676,29.301209, 1],
}
];
// 张家界市站点数据
var zhangjiajiedata = [{
name: "张家界市大庸桥口",
value: [110.466753,29.134629, 1],
}
];
// 湘西土家族苗族自治州
var xiangxidata = [{
name: "沅江武水入水口",
value: [110.175293,28.279329, 1],
}
];
var opt = {
bgColor: '#013954', // 画布背景色
mapName: '湖南', // 地图名
goDown: true, // 是否下钻
// 下钻回调
callback: function(name, option, instance) {
console.log(name, option, instance);
if (name == '湖南') {
option.series[0].data = convertData(gdDatas);
option.series[1].data = gdDatas.map(function(dataItem) {
return {
name: dataItem[0].name,
value: gdGeoCoordMap[dataItem[0].name].concat([dataItem[0].value])
};
});
myChart.setOption(option, true);
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "长沙市") {
option.series[0].data = convertData1(changshadata);
option.series[1].data = changshadata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "株洲市") {
option.series[0].data = convertData1(zhuzhoudata);
option.series[1].data = zhuzhoudata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "湘潭市") {
option.series[0].data = convertData1(xiangtandata);
option.series[1].data = xiangtandata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "常德市") {
option.series[0].data = convertData1(changdedata);
option.series[1].data = changdedata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "郴州市") {
option.series[0].data = convertData1(chenzhoudata);
option.series[1].data = chenzhoudata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "衡阳市") {
option.series[0].data = convertData1(henyangdata);
option.series[1].data = henyangdata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "怀化市") {
option.series[0].data = convertData1(huaihuadata);
option.series[1].data = huaihuadata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "娄底市") {
option.series[0].data = convertData1(loudidata);
option.series[1].data = loudidata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "邵阳市") {
option.series[0].data = convertData1(shaoyangdata);
option.series[1].data = shaoyangdata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "益阳市") {
option.series[0].data = convertData1(yiyangdata);
option.series[1].data = yiyangdata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "永州市") {
option.series[0].data = convertData1(yongzhoudata);
option.series[1].data = yongzhoudata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "岳阳市") {
option.series[0].data = convertData1(yueyangdata);
option.series[1].data = yueyangdata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "张家界市") {
option.series[0].data = convertData1(zhangjiajiedata);
option.series[1].data = zhangjiajiedata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
} else if (name == "湘西土家族苗族自治州") {
option.series[0].data = convertData1(xiangxidata);
option.series[1].data = xiangxidata;
myChart.setOption(option, true); // 赋值后初始化
setTimeout(() => { // 定时后启动飞线
myChart.setOption(option, true);
}, 500)
}
},
// 数据展示
data: []
};
var levelColorMap = { // level颜色
'1': '#f44336',
'2': '#fc9700',
'3': '#ffde00',
'4': '#00eaff'
};
var defaultOpt = {
mapName: 'china', // 地图展示
goDown: false, // 是否下钻
// bgColor: '#013954', // 画布背景色
activeArea: [], // 区域高亮,同echarts配置项
data: [],
// 下钻回调(点击的地图名、实例对象option、实例对象)
callback: function(name, option, instance) {}
};
if (opt) {
opt1 = $.extend(defaultOpt, opt);
}
// 层级索引
var name = [opt1.mapName];
var idx = 0;
var pos = { //层级位置
leftPlus: 55,
leftCur: 50,
left: 10,
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) {
console.log(i)
console.log(o)
console.log(n)
var breadcrumb = this.createBreadcrumb(n);
var j = name.indexOf(n);
var l = o.graphic.length;
if (j < 0) {
console.log('jinru1')
o.graphic.push(breadcrumb);
o.graphic[0].children[0].shape.x2 = 195;
o.graphic[0].children[1].shape.x2 = 195;
if (o.graphic.length > 2) {
for (var x = 0; x < opt1.data.length; x++) {
if (n === opt1.data[x].name + '市') {
o.series[0].data = handleEvents.initSeriesData(opt1.data[x].data);
break;
} else o.series[0].data = [];
}
}
name.push(n);
idx++;
} else {
console.log('jinru2', j)
o.graphic.splice(j + 2, l);
if (o.graphic.length <= 2) {
o.graphic[0].children[0].shape.x2 = 85;
o.graphic[0].children[1].shape.x2 = 85;
o.series[0].data = handleEvents.initSeriesData(gdDatas);
}
name.splice(j + 1, l);
idx = j;
pos.leftCur -= pos.leftPlus * (l - j - 1);
}
o.geo.map = n;
o.geo.zoom = 1;
i.clear();
i.setOption(o);
this.zoomAnimation();
opt1.callback(n, o, i);
},
/**
* name 地图名
**/
createBreadcrumb: function(name) {
var cityToPinyin = {
"长沙市": "changsha",
"株洲市": "zhuzhou",
"湘潭市": "xiangtan",
"常德市": "changde",
"郴州市": "chenzhou",
"衡阳市": "henyang",
"怀化市": "huaihua",
"娄底市": "loudi",
"邵阳市": "shaoyang",
"益阳市": "yiyang",
"永州市": "yongzhou",
"岳阳市": "yueyang",
"张家界市": "zhangjiajie",
"湘西土家族苗族自治州": "xiangxi"
};
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,
},
onclick: function() {
var name = this.style.key;
handleEvents.resetOption(myChart, 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(myChart, 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(myChart, option, name);
}
}]
}
pos.leftCur += pos.leftPlus;
return breadcrumb;
},
// 设置effectscatter
initSeriesData: function(data) {
console.log(data, '22222222222')
var temp = [];
for (var i = 0; i < data.length; i++) {
var geoCoord = gdGeoCoordMap[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);
myChart.setOption({
geo: {
zoom: count
}
});
if (count < 1) window.requestAnimationFrame(function() {
zoom(0.2);
});
};
window.requestAnimationFrame(function() {
zoom(0.2);
});
}
};
var convertData = function(data) {
var res = [];
for (var i = 0; i < data.length; i++) {
var dataItem = data[i];
var name = dataItem[0].name
var fromCoord = gdGeoCoordMap[dataItem[0].name];
//被攻击点坐标
var toCoord = [112.945358,28.234451];
if (fromCoord && toCoord) {
res.push([{
name: name,
coord: fromCoord,
value: dataItem[0].value
}, {
coord: toCoord,
}]);
}
}
return res;
};
var convertData1 = function(data) {
var res = [];
for (var i = 0; i < data.length; i++) {
var dataItem = data[i];
var name = dataItem.name
var fromCoord = data[0].value.slice(0, 2)
var toCoord = dataItem.value.slice(0, 2)
if (fromCoord && toCoord) {
res.push([{
name: name,
coord: fromCoord,
value: dataItem.value[2],
}, {
coord: toCoord,
}]);
}
}
return res;
};
var series = [];
[
['长沙市', gdDatas]
].forEach(function(item, i) {
console.log(item)
series.push({
type: 'lines',
zlevel: 1,
effect: {
show: true,
period: 3, //箭头指向速度,值越小速度越快
trailLength: 0.7, //特效尾迹长度[0,1]值越大,尾迹越长重
color: '#fff', //箭头图标
symbolSize: 3, //图标大小
},
lineStyle: {
normal: {
width: 0.1, //尾迹线条宽度
opacity: 0.2, //尾迹线条透明度
curveness: 0.3 //尾迹线条曲直度
}
},
data: convertData(item[1])
}, {
type: 'effectScatter',
coordinateSystem: 'geo',
zlevel: 2,
rippleEffect: { //涟漪特效
period: 4, //动画时间,值越小速度越快
brushType: 'stroke', //波纹绘制方式 stroke, fill
scale: 4 //波纹圆环最大限制,值越大波纹越大
},
label: {
normal: {
show: false,
position: 'right', //显示位置
offset: [5, 0], //偏移设置
formatter: function(params) { //圆环显示文字
return params.data.name;
},
fontSize: 19
},
emphasis: {
show: true
}
},
symbol: 'circle',
symbolSize: function(val) {
return 10 + val[2] * 0; //圆环大小
},
itemStyle: {
normal: {
show: false,
color: '#f00'
}
},
data: item[1].map(function(dataItem) {
return {
name: dataItem[0].name,
value: gdGeoCoordMap[dataItem[0].name].concat([dataItem[0].value])
};
}),
},
//被攻击点
{
type: 'scatter',
coordinateSystem: 'geo',
zlevel: 2,
rippleEffect: {
period: 4,
brushType: 'stroke',
scale: 4
},
label: {
normal: {
show: false,
position: 'right',
//offset:[5, 0],
color: '#0f0',
formatter: '{b}',
textStyle: {
color: "#0f0"
}
},
emphasis: {
show: false,
color: "#f60"
}
},
// symbol: 'pin',
// symbolSize: 50,
// data: [{
// name: item[0],
// value: gdGeoCoordMap[item[0]].concat([10]),
// }],
}
);
});
var option = {
"tooltip": {
trigger: 'item',
backgroundColor: 'rgba(0,0,0,0)',
formatter: function(item) {
console.log(item, 'item!!!!')
if (item.componentSubType === 'lines') {
var tipHtml1 = '';
tipHtml1 = '<div style="background:#fff;border-radius:10px;padding-top:10px;box-shadow:0 0 10px #666">' +
'<div style="color:#fff;height:20px;border-radius:6px;font-size:12px;line-height:20px;background-color:#5861a2;text-align:center;margin:0 2px;">' + item.data.name + '</div>' +
'<div style="text-align:center;color:#494949;padding:8px 6px">' +
'<span style="font-size:18px;font-weight:bold;">' + '总测试设备:' + item.data.value + ' ' + '</span>' +
'</div>' + '</div>';
return tipHtml1;
} else if (item.componentSubType === 'effectScatter') {
var tipHtml2 = '';
tipHtml2 = '<div style="background:#fff;border-radius:10px;padding-top:10px;box-shadow:0 0 10px #666">' +
'<div style="color:#fff;height:20px;border-radius:6px;font-size:12px;line-height:20px;background-color:#5861a2;text-align:center;margin:0 2px;">' + item.data.name + '</div>' +
'<div style="text-align:center;color:#494949;padding:8px 6px">' +
'<span style="font-size:18px;font-weight:bold;">' + '总测试设备:' + item.data.value[2] + ' ' + '</span>' +
'</div>' + '</div>';
return tipHtml2;
} else if (item.componentSubType === 'scatter') {
var tipHtml3 = '';
tipHtml3 = '<div style="background:#fff;border-radius:10px;padding-top:10px;box-shadow:0 0 10px #666">' +
'<div style="color:#fff;height:20px;border-radius:6px;font-size:12px;line-height:20px;background-color:#5861a2;text-align:center;margin:0 2px;">' + item.data.name + '</div>' +
'<div style="text-align:center;color:#494949;padding:8px 6px">' +
'<span style="font-size:18px;font-weight:bold;">' + '总测试设备:' + item.data.value[2] + ' ' + '</span>' +
'</div>' + '</div>';
return tipHtml3;
}
}
},
backgroundColor: "#013954",
"graphic": [{
type: 'group',
left: pos.left,
top: pos.top - 4,
children: [{
type: 'line',
left: 0,
top: -20,
shape: {
x1: 0,
y1: 0,
x2: 85,
y2: 0
},
style: {
stroke: style.lineColor,
}
}, {
type: 'line',
left: 0,
top: 20,
shape: {
x1: 0,
y1: 0,
x2: 85,
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;
console.log(name, '111111')
handleEvents.resetOption(myChart, 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(myChart, option, '湖南');
}
}, {
type: 'text',
left: 0,
top: 10,
style: {
text: 'HUNAN',
textAlign: 'center',
fill: style.textColor,
font: '12px "Microsoft YaHei", sans-serif',
},
onclick: function() {
handleEvents.resetOption(myChart, option, '湖南');
}
}]
}],
visualMap: { //图例值控制
min: 0,
max: 1,
calculable: true,
show: false,
color: ['#f44336', '#fc9700', '#ffde00', '#ffde00', '#00eaff'],
textStyle: {
color: '#fff'
}
},
"geo": {
"map": "湖南",
"layoutCenter": ["55%", "50%"],
"layoutSize": "109%",
"label": {
"normal": {
"show": true,
"textStyle": {
"color": '#fff'
}
},
"emphasis": {
"textStyle": {
"color": '#fff'
}
}
},
"roam": true, //是否允许缩放
"mapLocation": {
"width": "110%",
"height": "97%"
},
"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": {
itemStyle: {
areaColor: '#FFD181',
borderColor: '#404a59',
borderWidth: 1
}
}
}
},
series: series
};
myChart.setOption(option);
myChart.on('click', function(params) {
console.log(params)
var _self = this;
if (cityMap[params.name]) {
var url = cityMap[params.name];
$.get(url, function(response) {
//console.log(response, 'res');
curGeoJson = response;
echarts.registerMap(params.name, response);
handleEvents.resetOption(_self, option, params.name);
});
}
});
});