最近项目有省市各个区域设备心跳检测的一个需求,所以就接触到echarts的地图map相关知识点,对最近了解的一些知识点做一下总结,希望对有需要了解的小伙伴有些帮助,正文开始:
开发过程中需要注意的地方:
1、读取json文件数据的话需要在项目中跑,因为是ajax请求,在静态页面中单独这样引入是会报错的
2、地图数据data里面的名称,也就是区域名称字段值必须与json文件里面的各个区域名称保持一致,不然鼠标悬浮区域名称会不显示
代码片段,需要注意的地方注释的很清楚,请各位仔细阅读代码:
jsp:
<div id="main-map" style="width: 100%;height:400px;"></div>
//引入需要的js文件
<script type="text/javascript" src="<%=basePath%>plugins/echarts.min.js"></script>
<%--<script type="text/javascript" src="<%=basePath%>plugins/jquery-1.8.3.js"></script>--%>
<%--可以引入js文件,也可以读取json文件,我是读的json文件--%>
<%--<script type="text/javascript" src="<%=basePath%>js/echarts3.2.2/map/anhui.js"> </script>--%>
<script type="text/javascript" src="你自己的js"></script>
<script>
context = '${pageContext.request.contextPath}';
</script>
<script>
menuChart.init();
</script>
JS:
var context;
var menuChart = function ($) {
//area即是对应区域的json文件名,如:anhui.json等
function initMap(geoCoordMap, moveLine, data, area) {
var myChart = echarts.init(document.getElementById('main-map'));
myChart.showLoading();
//注意:读取json文件的数据话需要在项目中跑,因为是ajax请求,在静态页面中单独这样引入是会报错的
$.getJSON(context + "/static/json/" + area + ".json", function (geoJson) {
echarts.registerMap(area, geoJson);
myChart.hideLoading();
var max = 480, min = 9; // todo
var maxSize4Pin = 100, minSize4Pin = 20;
var convertData = function (data) {
var res = [];
for (var i = 0; i < data.length; i++) {
var geoCoord = geoCoordMap[data[i].name];
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value)
});
}
}
return res;
};
option = {
backgroundColor: '#091c3d',
title: {
top: 20,
text: '',
subtext: '',
x: 'center',
textStyle: {
color: '#ccc'
}
},
tooltip: {
trigger: 'item',
formatter: function (params) {
/*注意:这里地图数据data里面的名称,也就是name字段值必须与anhui.json里面的各个市名称保持一致
不然鼠标悬浮会显示NaN*/
if (params.seriesIndex === 0) {//悬浮在站点
return params.name + ' : ' + params.data.value[2];
// }
// if(typeof(params.value)[2] == "undefined"){
// return params.name + ' : ' + params.value;
} else if (params.seriesIndex === 1) {//悬浮在地图省范围内
return params.name + ' : ' + params.data.value;
} else {//悬浮在站点连线
return params.seriesName + " : " + params.data.toName + ' - ' + params.data.fromName;
}
}
},
legend: {
orient: 'vertical',
y: 'bottom',
x: 'right',
data: ['pm2.5'],
textStyle: {
color: '#fff'
}
},
visualMap: {
show: false,
min: 0,
max: 500,
left: 'left',
top: 'bottom',
text: ['高', '低'], // 文本,默认为数值文本
calculable: true,
seriesIndex: [1],
inRange: {
// color: ['#3B5077', '#031525'] // 蓝黑
// color: ['#ffc0cb', '#800080'] // 红紫
// color: ['#3C3B3F', '#605C3C'] // 黑绿
//color: ['#0f0c29', '#302b63', '#24243e'] // 黑紫黑
//color: ['#23074d', '#cc5333'] // 紫红
// color: ['#00467F', '#A5CC82'] // 蓝绿
// color: ['#1488CC', '#2B32B2'] // 浅蓝
// color: ['#00467F', '#A5CC82'] // 蓝绿
// color: ['#00467F', '#A5CC82'] // 蓝绿
// color: ['#00467F', '#A5CC82'] // 蓝绿
// color: ['#00467F', '#A5CC82'] // 蓝绿
}
},
// toolbox: {
// show: true,
// orient: 'vertical',
// left: 'right',
// top: 'center',
// feature: {
// dataView: {readOnly: false},
// restore: {},
// saveAsImage: {}
// }
// },
geo: {
show: true,
map: area,
label: {
normal: {
show: false
},
emphasis: {
show: false,
}
},
roam: true,
itemStyle: {
normal: {
areaColor: 'transparent',
borderColor: '#3fdaff',
borderWidth: 2,
shadowColor: 'rgba(63, 218, 255, 0.5)',
shadowBlur: 30
},
emphasis: {
areaColor: '#2B91B7',
}
}
},
series: [
{
name: '站点',
type: 'scatter',
coordinateSystem: 'geo',
data: convertData(data),
// symbolSize: function (val) {
// return val[2] / 10;
// },
label: {
normal: {
formatter: '{b}',
position: 'right',
show: true
},
emphasis: {
show: true
}
},
itemStyle: {
normal: {
color: '#F4E925'
}
}
},
{
type: 'map',
map: area,
geoIndex: 0,
aspectScale: 0.75, //长宽比
showLegendSymbol: false, // 存在legend时显示
label: {
normal: {
show: false
},
emphasis: {
show: false,
textStyle: {
color: '#fff'
}
}
},
roam: true,
itemStyle: {
normal: {
areaColor: '#031525',
borderColor: '#FFFFFF',
},
emphasis: {
areaColor: '#2B91B7'
}
},
animation: false,
data: data
},
// {
// name: 'Top 5',
// type: 'effectScatter',
// coordinateSystem: 'geo',
// data: convertData(data.sort(function (a, b) {
// return b.value - a.value;
// }).slice(0, 5)),
// symbolSize: function (val) {
// return val[2] / 10;
// },
// showEffectOn: 'render',
// rippleEffect: {
// brushType: 'stroke'
// },
// hoverAnimation: true,
// label: {
// normal: {
// formatter: '{b}',
// position: 'right',
// show: true
// }
// },
// itemStyle: {
// normal: {
// color: '#F4E925',
// shadowBlur: 10,
// shadowColor: '#05C3F9'
// }
// },
// zlevel: 1
// },
{
name: '正常线路',
type: 'lines',
coordinateSystem: 'geo',
zlevel: 2,
large: true,
effect: {
show: true,
constantSpeed: 30,
symbol: 'arrow',//ECharts 提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow'
symbolSize: 0,
trailLength: 0,
},
lineStyle: {
normal: {
color: '#0fff17',
/*
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0, color: '#58B3CC'
}, {
offset: 1, color: '#F58158'
}], false),*/
width: 2,
opacity: 1.0,
curveness: 0.15
}
},
data: moveLine.normal
},
{
name: '异常线路',
type: 'lines',
coordinateSystem: 'geo',
zlevel: 2,
large: true,
effect: {
show: true,
constantSpeed: 30,
symbol: 'arrow',//ECharts 提供的标记类型包括 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow'
symbolSize: 10,
trailLength: 0,
},
lineStyle: {
normal: {
color: 'rgb(255, 0, 0)',
width: 2,
opacity: 1,
curveness: 0.15
}
},
data: moveLine.warning
}
]
};
myChart.setOption(option);
myChart.off('chick');
//下钻其实就是点击事件,切换脚本而已
myChart.on('click', function (area) {
console.log(area.name);//获取点击的市名去读取数据对应的市名的json数据,所以要用第二个链接去下载所有需要的json文件
//这里根据省市区域信息查询下钻数据去重新渲染图表
$.ajax({
url: "",
data: "",//查询条件
type: "",
async: false,//设置同步
succesee: function (d) {
geoCoordMap = d.siteMap;
moveLine = d.moveLine;
data = d.siteConfig;
initMap(geoCoordMap, moveLine, data, area.name);
}
})
});
});
}
function init() {
//数据结构可以参考第一个demo链接里面的数据自己封装从后台获取即可,也可以直接用写死的模拟数据,数据结构保持一致即可
var geoCoordMap = {};
var moveLine = {};
var data = [];
$.ajax({
url: context + '/hbConfig/heartBeatInfo.do',
type: 'get',
async: false,
success: function (d) {
geoCoordMap = d.siteMap;
moveLine = d.moveLine;
data = d.siteConfig;
//一开始是获取安徽的数据,所以area一开始可以写死,之后下钻根据市名下钻
initMap(geoCoordMap, moveLine, data, "anhui");
},
error: function () {
}
})
}
return {
init: function () {
init();
}
}
}(jQuery, document)
提供两个比较重要的链接:
1、http://gallery.echartsjs.com/editor.html?c=xn_Oh9Y92C :安徽省市地图渲染demo
2、http://gallery.echartsjs.com/editor.html?c=xr1IEt3r4Q :全国所有省市区县的地图json数据,在网上不经意间找到的一个资源链接,帮大忙了,感谢那位小伙伴