第一周周总结
2020.02.22
利用echarts中的中国地图,并将各省疫情相关数据显示在图上,此问题主要为地图的显示和数据的传输
下面代码为该地图的显示,其利用了各个省的现成json数据来显示,并将疫情数据通过ajax异步传输给前端。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html style="height: 100%">
<head>
<meta charset="UTF-8">
<title>地图</title>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/dist/extension/dataTool.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts/map/js/china.js"></script>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
</head>
<body style="height: 100%; margin: 0">
<div id="ditu" style="height:100%"></div>
<script type="text/javascript">
$(function() {
$.get('${pageContext.request.contextPath}/servlet?method=quanguo',
function(data) {
init(data);
});
});
function init(data) {
var allData=data;
var dom = document.getElementById("ditu");
var myChart = echarts.init(dom);
var app = {};
option = null;
//各省份的地图json文件
var provinces = {
'上海': 'ss/data-1482909900836-H1BC_1WHg.json',
'河北': 'ss/data-1482909799572-Hkgu_yWSg.json',
'山西': 'ss/data-1482909909703-SyCA_JbSg.json',
'内蒙古': 'ss/data-1482909841923-rkqqdyZSe.json',
'辽宁': 'ss/data-1482909836074-rJV9O1-Hg.json',
'吉林': 'ss/data-1482909832739-rJ-cdy-Hx.json',
'黑龙江': 'ss/data-1482909803892-Hy4__J-Sx.json',
'江苏': 'ss/data-1482909823260-HkDtOJZBx.json',
'浙江': 'ss/data-1482909960637-rkZMYkZBx.json',
'安徽': 'ss/data-1482909768458-HJlU_yWBe.json',
'福建': 'ss/data-1478782908884-B1H6yezWe.json',
'江西': 'ss/data-1482909827542-r12YOJWHe.json',
'山东': 'ss/data-1482909892121-BJ3auk-Se.json',
'河南': 'ss/data-1482909807135-SJPudkWre.json',
'湖北': 'ss/data-1482909813213-Hy6u_kbrl.json',
'湖南': 'ss/data-1482909818685-H17FOkZSl.json',
'广东': 'ss/data-1482909784051-BJgwuy-Sl.json',
'广西': 'ss/data-1482909787648-SyEPuJbSg.json',
'海南': 'ss/data-1482909796480-H12P_J-Bg.json',
'四川': 'ss/data-1482909931094-H17eKk-rg.json',
'贵州': 'ss/data-1482909791334-Bkwvd1bBe.json',
'云南': 'ss/data-1482909957601-HkA-FyWSx.json',
'西藏': 'ss/data-1482927407942-SkOV6Qbrl.json',
'陕西': 'ss/data-1482909918961-BJw1FyZHg.json',
'甘肃': 'ss/data-1482909780863-r1aIdyWHl.json',
'青海': 'ss/data-1482909853618-B1IiOyZSl.json',
'宁夏': 'ss/data-1482909848690-HJWiuy-Bg.json',
'新疆': 'ss/data-1482909952731-B1YZKkbBx.json',
'北京': 'ss/data-1482818963027-Hko9SKJrg.json',
'天津': 'ss/data-1482909944620-r1-WKyWHg.json',
'重庆': 'ss/data-1482909775470-HJDIdk-Se.json',
'香港': 'ss/data-1461584707906-r1hSmtsx.json',
'澳门': 'ss/data-1482909771696-ByVIdJWBx.json'
};
loadMap('ss/data-1527045631990-r1dZ0IM1X.json', 'china');//初始化全国地图
var timeFn = null;
//单击切换到省级地图,当mapCode有值,说明可以切换到下级地图
myChart.on('click', function(params) {
clearTimeout(timeFn);
//由于单击事件和双击事件冲突,故单击的响应事件延迟250毫秒执行
timeFn = setTimeout(function() {
var name = params.name; //地区name
var mapCode = provinces[name]; //地区的json数据
if (!mapCode) {
alert('无此区域地图显示');
return;
}
loadMap(mapCode, name);
}, 250);
});
// 绑定双击事件,返回全国地图
myChart.on('dblclick', function(params) {
//当双击事件发生时,清除单击事件,仅响应双击事件
clearTimeout(timeFn);
//返回全国地图
loadMap('ss/data-1527045631990-r1dZ0IM1X.json', 'china');
});
/**
获取对应的json地图数据,然后向echarts注册该区域的地图,最后加载地图信息
@params {String} mapCode:json数据的地址
@params {String} name: 地图名称
*/
function loadMap(mapCode, name) {
$.get(mapCode, function(data) {
if (data) {
echarts.registerMap(name, data);
var option = {
tooltip: {
show: true,
formatter: function(params) {
if (params.data) return params.name + '确诊:' + params.data['value']
},
},
visualMap: {
min: 0,
max: 1000,
left: 26,
bottom: 40,
showLabel: !0,
text: ["高", "低"],
pieces: [{
gt: 10000,
label: "> 10000 人",
color: "#7f1100"
}, {
gte: 1000,
lte: 9999,
label: "1000 - 9999 人",
color: "#ff5428"
}, {
gte: 100,
lt: 999,
label: "100 - 999 人",
color: "#ff8c71"
}, {
gt: 10,
lt: 99,
label: "10 - 99",
color: "#ffd768"
}, {
gt: 0,
lt: 9,
label: "1 - 9",
color: "#FFF0F5"
},{
value: 0,
color: "#ffffff"
}],
show: !0
},
series: [{
name: 'MAP',
type: 'map',
mapType: name,
selectedMode: 'false',//是否允许选中多个区域
label: {
normal: {
show: true
},
emphasis: {
show: true
}
},
data: allData
}]
};
myChart.setOption(option);
// curMap = {
// mapCode: mapCode,
// mapName: name
// };
} else {
alert('无法加载该地图');
}
});
};
if (option && typeof option === "object") {
myChart.setOption(option, true);
}
}
</script>
</body>
</html>
下边的代码为可下钻的中国地图,其可下钻到省市
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<script type="text/javascript" src="js/dataTool.js"></script>
<script type="text/javascript" src="js/echarts.js"></script>
</head>
<body>
<script type="text/javascript">
/*注:源码就是下面这些,只要复制到开发工具就行,然后把
地图json数据(下载地址:https://share.weiyun.com/5x12K4r)的路径放对,
并且要导入echarts就可以渲染出来地图了*/
var zhongguo = "map/data-china.json";
var hainan = "map/data-hainan.json";
var xizang = "map/data-xizang.json";
var zhejiang = "map/data-zhejiang.json";
var yunnan = "map/data-yunnan.json";
var xinjiang = "map/data-xinjiang.json";
var tianjin = "map/data-tianjin.json";
var sichuan = "map/data-sichuan.json";
var shanxi = "map/data-shanxi.json";
var shangxi = "map/data-shangxi.json";
var shanghai = "map/data-shanghai.json";
var shangdong = "map/data-shangdong.json";
var qinghai = "map/data-qinghai.json";
var ningxia = "map/data-ningxia.json";
var neimenggu = "map/data-neimenggu.json";
var liaoning = "map/data-liaoning.json";
var jilin = "map/data-jilin.json";
var jiangxi = "map/data-jiangxi.json";
var jiangsu = "map/data-jiangsu.json";
var hunan = "map/data-hunan.json";
var hubei = "map/data-hubei.json";
var henan = "map/data-henan.json";
var heilongjiang = "map/data-heilongjiang.json";
var hebei = "map/data-hebei.json";
var guizhou = "map/data-guizhou.json";
var guangxi = "map/data-guangxi.json";
var guangdong = "map/data-guangdong.json";
var gansu = "map/data-gansu.json";
var chongqing = "map/data-chongqing.json";
var aomen = "map/data-aomen.json";
var anhui = "map/data-anhui.json";
var beijing = "map/data-beijing.json";
var fujian = "map/data-fujian.json";
var xianggang = "map/data-xianggang.json";
echarts.extendsMap = function(id, opt) {
// 实例
var chart = this.init(document.getElementById('main'));
var curGeoJson = {};
var cityMap = {
'中国': zhongguo,
'上海': shanghai,
'河北': hebei,
'山西': shangxi,
'内蒙古': neimenggu,
'辽宁': liaoning,
'吉林': jilin,
'黑龙江': heilongjiang,
'江苏': jiangsu,
'浙江': zhejiang,
'安徽': anhui,
'福建': fujian,
'江西': jiangxi,
'山东': shangdong,
'河南': henan,
'湖北': hubei,
'湖南': hunan,
'广东': guangdong,
'广西': guangxi,
'海南': hainan,
'四川': sichuan,
'贵州': guizhou,
'云南': yunnan,
'西藏': xizang,
'陕西': shanxi,
'甘肃': gansu,
'青海': qinghai,
'宁夏': ningxia,
'新疆': xinjiang,
'北京': beijing,
'天津': tianjin,
'重庆': chongqing,
'香港': xianggang,
'澳门': aomen
};
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) {
var cityData = [];
var cityJson;
for (var x = 0; x < opt.data.length; x++) {
if(n === opt.data[x].city){
$([opt.data[x]]).each(function(index,data){
cityJson = {city:data.city,name:data.name,value:data.value,crew:data.crew,company:data.company,position:data.position,region:data.region};
cityData.push(cityJson)
})
}
}
if(cityData!=null){
o.series[0].data = handleEvents.initSeriesData(cityData);
}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 = {
'中国': 'zhongguo',
'上海': 'shanghai',
'河北': 'hebei',
'山西': 'shangxi',
'内蒙古': 'neimenggu',
'辽宁': 'liaoning',
'吉林': 'jilin',
'黑龙江': 'heilongjiang',
'江苏': 'jiangsu',
'浙江': 'zhejiang',
'安徽': 'anhui',
'福建': 'fujian',
'江西': 'jiangxi',
'山东': 'shangdong',
'河南': 'henan',
'湖北': 'hubei',
'湖南': 'hunan',
'广东': 'guangdong',
'广西': 'guangxi',
'海南': 'hainan',
'四川': 'sichuan',
'贵州': 'guizhou',
'云南': 'yunnan',
'西藏': 'xizang',
'陕西': 'shanxi',
'甘肃': 'gansu',
'青海': 'qinghai',
'宁夏': 'ningxia',
'新疆': 'xinjiang',
'北京': 'beijing',
'天津': 'tianjin',
'重庆': 'chongqing',
'香港': 'xianggang',
'澳门': 'aomen'
};
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),
crew:data[i].crew,
company:data[i].company,
position:data[i].position,
region:data[i].region
});
}
};
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,
tooltip: {
show: true,
trigger:'item',
alwaysShowContent:false,
backgroundColor:'rgba(50,50,50,0.7)',
hideDelay:100,
triggerOn:'mousemove',
enterable:true,
position:['60%','70%'],
formatter:function(params, ticket, callback){
return '简称:'+params.data.name+'<br/>'+'机组:'+params.data.crew+'万千瓦'+'<br/>'+'公司名称:'+params.data.company+'<br/>'+'所属大区:'+params.data.region+'<br/>'+'所在位置:'+params.data.position
}
},
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: '中国',
textAlign: 'center',
fill: style.textColor,
font: style.font
},
onclick: function() {
handleEvents.resetOption(chart, option, '中国');
}
}, {
type: 'text',
left: 0,
top: 10,
style: {
text: 'China',
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',
showEffectOn: 'render',
rippleEffect: {
period:15,
scale: 4,
brushType: 'fill'
},
hoverAnimation: true,
itemStyle: {
normal: {
color: '#FFC848',
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);
});
}
};
return chart;
};
$.getJSON(zhongguo, 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);
},
});
})
</script>
<div id="main" style="width:100%;height:1000px;"></div>
</body>
</html>

浙公网安备 33010602011771号