太原市地图下钻
配置项如下
var gujiaoshi = '/asset/get/s/data-1625208670498-SKRJclMQB.json';
var jiancaopingqu = '/asset/get/s/data-1625208708262-boKm1A6PD.json';
var jinyuanqu = '/asset/get/s/data-1625208718941-PoBtZhqxM.json';
var loufanxian = '/asset/get/s/data-1625208727346-JTXJHhHQz.json';
var qingxuxian = '/asset/get/s/data-1625208742104-xNQI5eRpO.json';
var taiyuanshi = '/asset/get/s/data-1625214372297-4TvnpZjw0.json';
var wanbolinqu = '/asset/get/s/data-1625208774016-t1TTxt8gA.json';
var xiaodianqu = '/asset/get/s/data-1625208783562-nfaMGou7A.json';
var xinghualingqu = '/asset/get/s/data-1625208789097-xflm8U4oL.json';
var yangquxian = '/asset/get/s/data-1625208795375-coGKLP5vv.json';
var yingzequ = '/asset/get/s/data-1625208800471-OnOQxGuBi.json';
echarts.extendsMap = function (id, opt) {
// 实例
var chart = this.init(document.getElementById(id));
var curGeoJson = {};
var cityMap = {
//"太原市": taiyuanshi,
"古交市": gujiaoshi,
"尖草坪区": jiancaopingqu,
"晋源区": jinyuanqu,
"娄烦县": loufanxian,
"清徐县": qingxuxian,
"万柏林区": wanbolinqu,
"小店区": xiaodianqu,
"杏花岭区": xinghualingqu,
"阳曲县": yangquxian,
"迎泽区": yingzequ,
};
var geoCoordMap = {
'杏花岭区':[112.6442,37.9228],
'尖草坪区':[112.4959,37.9810],
'万柏林区':[112.4004,37.8689],
'晋源区':[112.4355,37.7349],
'清徐县':[112.4176,37.5337],
'阳曲县':[112.6717,38.1389],
'娄烦县':[111.7937,38.0660],
'古交市':[112.174353,37.908534],
'小店区':[112.564273,37.817974],
'迎泽区':[112.6895,37.8662]
};
var levelColorMap = {
1: 'rgba(241, 109, 115, .8)',
2: 'rgba(255, 235, 59, .7)',
3: 'rgba(147, 235, 248, 1)',
};
var defaultOpt = {
mapName: 'china', // 地图展示
goDown: false, // 是否下钻
bgColor: '#404a59', // 画布背景色
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: 115,
leftCur: 150,
left: 198,
top: 50,
};
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 = {
"古交市": "gujiaoshi",
"尖草坪区": "jiancaopingqu",
"晋源区": "jinyuanqu",
"娄烦县": "loufanxian",
"清徐县": "qingxuxian",
"万柏林区": "wanbolinqu",
"小店区": "xiaodianqu",
"杏花岭区": "xinghualingqu",
"阳曲县": "yangquxian",
"迎泽区": "yingzequ"
};
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: 'TAIYUAN',
textAlign: 'center',
fill: style.textColor,
font: '12px "Microsoft YaHei", 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: '#389BB7',
},
},
};
}
}),
},
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];
$.get(url, function (response) {
// console.log(response);
curGeoJson = response;
echarts.registerMap(params.name, response);
handleEvents.resetOption(_self, option, params.name);
});
}
}
});
chart.setMap = function (mapName) {
var _self = this;
if (mapName.indexOf('市') < 0) mapName = mapName + '市';
var citySource = cityMap[mapName];
if (citySource) {
var url = './map/' + citySource + '.json';
$.get(url, function (response) {
// console.log(response);
curGeoJson = response;
echarts.registerMap(mapName, response);
handleEvents.resetOption(_self, option, mapName);
});
}
// handleEvents.resetOption(this, option, mapName);
};
return chart;
};
$.getJSON(taiyuanshi, function (geoJson) {
echarts.registerMap('太原', geoJson);
var myChart = echarts.extendsMap('chart-panel', {
bgColor: '#154e90', // 画布背景色
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: 2,
},
{
name: '娄烦县',
value: 12,
level: 1,
},
],
});
});