欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

echarts柱状图与中国地图联动,鼠标移入柱状图,地图响应地显示数据

程序员文章站 2022-04-28 09:05:01
...


echarts显示柱状图的时候,旁边放一张中国地图,当鼠标移入柱状图,旁边中国地图对应的区域亮起来。


先放效果图~~



这是原始页面

echarts柱状图与中国地图联动,鼠标移入柱状图,地图响应地显示数据




这是鼠标移上去的样子

echarts柱状图与中国地图联动,鼠标移入柱状图,地图响应地显示数据




这是鼠标离开之后的样子

echarts柱状图与中国地图联动,鼠标移入柱状图,地图响应地显示数据



总之呢,就是给他俩弄一个联动的效果,移入柱状图,地图跟着动起来,并且数据跟着变。



柱状图后台数据库:

echarts柱状图与中国地图联动,鼠标移入柱状图,地图响应地显示数据




地图后台数据库:

echarts柱状图与中国地图联动,鼠标移入柱状图,地图响应地显示数据




echarts柱状图与中国地图联动,鼠标移入柱状图,地图响应地显示数据思路大概是这样的:当鼠标移入柱状图的时候,获取当前移入的索引,先让柱状图的图标显示出来;然后根据日期进行判断,看当天有哪几个省的人登录了,如果日期相同,就让这几个省的selected状态改为true,并且增加地图标注。(当然,当鼠标从当前柱状图移入到下一个柱状图的时候,这中间也要进行一些判断,详看代码~)




下面上代码:

所需js文件:

    <script src="${ctx}/static/layui_v2/layui.js"></script>

    <script src="${ctx}/static/js/jquery-1.8.3.js"></script>

    <script type="text/javascript" src="${ctx}/static/echarts/echarts-all.js" charset="utf-8"></script>
    <script type="text/javascript" src="${ctx}/static/echarts/codemirror.js" charset="utf-8"></script>
    <script type="text/javascript" src="${ctx}/static/echarts/javascript.js" charset="utf-8"></script>


页面布局:

	    <div class="row">
                <div class="layui-col-md5">
                    <div class="layui-collapse" >
                            <h2 class="layui-colla-title" style="background-color: #ffffff;">网站访问情况统计</h2>
                            <div class="layui-colla-content layui-show" >
                                <div id="container" style="height: 350px; margin: 0 auto;width: 100%;"></div>
                            </div>
                    </div>
                </div>
                <div class="layui-col-md7">
                    <div class="layui-collapse">
                            <h2 class="layui-colla-title" style="background-color: #ffffff;">网站访问地址统计</h2>
                            <div class="layui-colla-content layui-show" >
								<div id="container2" style="height: 350px; margin: 0 auto;width: 100%;"></div>
                            </div>

                    </div>
                </div>

            </div>


js代码:

<script type="text/javascript">
    var $;
    layui.config({
        base : "${ctx}/static/js/"
    }).use(['form','jquery','layer','common','element'],function() {
        $ = layui.$;
              var  form = layui.form,
                element = layui.element,
                common = layui.common;

        var loading = layer.load(0,{ shade: [0.3,'#000']});
             

        //柱状图表
        var psLineChar = echarts.init(document.getElementById('container'));

        //查询
        function loadDrugs() {
            psLineChar.clear();
            psLineChar.showLoading({text: '正在努力的读取数据中...'});
            $.post("${ctx}/main/ajax_echarts_login_info.do", function(data) {
                var option = {
                    title : {
                        text: '每日访问量',
                        subtext: '10天访问情况统计'
                    },
                    tooltip : {
                        trigger: 'item',
                        showDelay: 200,
                        hideDelay: 200,
                        transitionDuration: 1
                    },
                    legend: {
                        data:['访问量']
                    },
                    toolbox: {
                        show : true,
                        feature : {
                            magicType : {
                            	title: {
                            		line : '折线图切换',
            						bar : '柱形图切换'
                            	}
                            },
                            type: ['line','bar'],//展示类型,折线/柱状
                            dataView: {show: true,readOnly: true},//数据视图
                            restore: {show: true},//重置
                            dataZoom: {show: true},//数据缩放视图
                            saveAsImage: {show: true}//保存为图片
                        }
                    },
                    //是否允许拖拽柱形图
                    calculable : false,
                    xAxis : [
                        {
                            type : 'category',
                            data : data.xAxisData//用后台查到的X轴数据
                        }
                    ],
                    yAxis : [
                        {
                            type : 'value'
                        }
                    ],
                    series : [
                        {
                            name:'访问量',
                            type:'bar',
                            data:data.seriesData,
                            //数据标注
                            markPoint : {
				                data : []
				            },
                            itemStyle:{
                            		normal:{
                                        color:'Teal'
                                    },
                                    emphasis:{
                                        color:'orange'
                                    }
                                }
                        }
                    ]
                };
                psLineChar.setOption(option, true);
            });
            psLineChar.hideLoading();

        };


        
        
        
        //中国地图图表
        var chinaMap = echarts.init(document.getElementById('container2'));

        //查询
        function loadChinaMap() {
            //chinaMap.clear();
            chinaMap.showLoading({text: '正在努力的读取数据中...'});
            $.post("${ctx}/main/ajax_echarts_login_info_map.do", function(data) {
            
            var loginP = data.loginProvince;
            var loginC = data.loginCount;
            var loginD = data.loginDate;
            var list = [];          
            
            for(var i = 0; i < loginC.length; i++){
            	var row = {};
            	row.name = loginP[i];
            	row.value = loginC[i];
            	row.selected = false;
            	
            	list.push(row);
            }
            
            
              var option = {
			    title : {		//标题
			        text: '访问地址分布',
			        subtext: '最近10天数据',
			        x:'center'
			    },
			    tooltip : {		//提示框
			        trigger: 'item'//当trigger为’item’时只会显示该点的数据,为’axis’时显示该列下所有坐标轴所对应的数据。
			    },
			    dataRange: {		//值域控件
			        min: 0,
			        max: 100,
			        x: 'left',
			        y: 'bottom',
			        text:['高','低'],           // 文本,默认为数值文本
			        calculable : true		//是否启用值域漫游
			    },
			    toolbox: {		//工具箱
			        show: true,
			        orient : 'vertical',
			        x: 'right',
			        y: 'center',
			        feature : {
			            mark : {show: true},
			            dataView : {show: true, readOnly: false},//数据视图
			            restore : {show: true},//还原
			            saveAsImage : {show: true}//保存为图片
			        }
			    },
			    series : [
			        {
			            name: '登陆人数',
			            roam: true,	//是否滚轮缩放
			            scaleLimit: {max:10, min:0.5},//滚轮缩放大小限制
			            type: 'map',
			            selectedMode: 'multiple',//选中模式
			            zoom: 1.1,//地图缩放比例
			            mapType: 'china',
			           
						 itemStyle: {
				                normal: {			//正常样式
				                    label: {
				                        show: true
				                    },
				                    color: 'skyblue'//小圆点颜色
				                },
				                emphasis: {                 // 鼠标选中样式
				                    label: {
				                        show: true,
				                        textStyle: {
				                            color: 'black'
				                        }
				                    },
				                    color: 'orange'
				                }
				            },
			            	//系列中的数据标注内容
			             data:list,
			             
			             //地图标注
			             markPoint : {
			             	symbolSize : 13,	//标注大小
			             	effect : {	//炫光特效
			             		show : false
			             	},
			                itemStyle : {
			                    normal:{
			                        color:'Teal'
			                    }
			                },
			                //要标注的城市
			                data :[]
			            },
			            geoCoord: {		//各个城市的地理位置,写死即可
						    '*':[91.11,29.97],
						    '上海':[121.48,31.22],
						    '福建':[118.1,26.46],
						    '浙江':[ 119.96, 29.86 ],
						    '广东':[113.23,23.16],
						    '山西':[112.53,37.87],
						    '云南':[101.73,24.04],
						    '辽宁':[123.38,41.8],
						    '吉林':[125.35,43.88],
						    '江西':[115.89,28.68],
						    '海南':[109.51,19.25],
						    '广西':[108.74,23.16],
						    '内蒙古':[111.65,41.42],
						    '四川':[104.06,30.67],
						    '陕西':[108.95,34.27],
						    '江苏':[119.78,33.04],
						    '贵州':[106.71,26.57],
						    '北京':[116.46,39.92],
						    '*':[86.68,40.77],
						    '山东':[118,35.65],
						    '甘肃':[103.73,36.03],
						    '天津':[117.2,39.13],
						    '河南':[113.65,33.76],
						    '黑龙江':[127.63,46.75],
						    '河北':[115.48,39.03],
						    '湖南':[112,27.21],
						    '安徽':[117.27,31.86],
						    '湖北':[112.31,30.52],
						    '青海':[97.31,36.03],
						    '重庆':[107.31,29.52],
						    '宁夏':[106.31,37.52],
						    '香港':[114.31,22.52],
						    '澳门':[114.01,22.02],
						    '*':[120.81,23.52]
			            } 
			           
			       }        
			    ]
			};
               
            chinaMap.setOption(option, true);    
                
                	 	//鼠标移入
				function eConsole(param) {
				   var i = param.dataIndex;// 获取当前点击索引,
				   var na = "2017/"+param.name;// 获取当前点击名
				   
				   //创建柱状图图标数组
				   var list2 = [];
				   //console.info('11100');
				   //return ;
				   var LineList = {};
				   LineList.name = '总共';
				   LineList.value = psLineChar.getOption().series[0].data[i];//图标显示的值
				   LineList.xAxis = i;//图标X轴
				   LineList.yAxis = psLineChar.getOption().series[0].data[i]+2;//图标Y轴,因为稍微有点低,所以+2
				   
				   
				   
				   //console.info(list2);
				   //获取到柱状图的option选项
				   var option2 = psLineChar.getOption();
				   //先判断,如有有数据,就清空,这样就一直只会有一个标注了
				   if(option2.series[0].markPoint.data != null && (option2.series[0].markPoint.data).length>0){
				   		list2.push(LineList);
				   		option2.series[0].markPoint.data = [];
				   }
				   
				   option2.series[0].markPoint.data.push(list2[0]);//把拼好的数据放进去,只放第一条
				   psLineChar.setOption(option2, true);
				   
				   
					option.series[0].markPoint.data=[];
					
					//进入时,先把以前的选中效果都清除了
					for(var b = 0; b < loginP.length; b++){
				        list[b].selected  = false;
				    }
				    
			        for(var a = 0; a < loginD.length; a++){
			        	//list[a].selected  = false;
			        	if(na == loginD[a]){
							list[a].selected  = true;
							option.series[0].markPoint.data.push(list[a]);//把选择的省份加入到地图标注中
							
			        	}
			        }  
			        
			       chinaMap.setOption(option, true); 
				};
				 
				 
				 //鼠标移出
				function eOunt(param) {
					for(var a = 0; a < loginD.length; a++){
					
				        //list[a].selected  = false;
				        
				        
				    }   
				   chinaMap.setOption(option, true); 
				};
				
				psLineChar.on("hover", eConsole);//鼠标移入
				psLineChar.on("mouseout", eOunt);//鼠标移出,这一步貌似没什么用了...
				
				
				
            });
            chinaMap.hideLoading();

        }

		//载入柱状图表
        loadDrugs();
        
        //载入中国地图图表
        loadChinaMap();
        
        
        //载入地图上的柱状图表
        //loadMapBar();
        
        

        //浏览器大小改变时重置大小
        window.onresize = function () {
            psLineChar.resize();

        };
        layer.close(loading);


    });
    
</script>



以上就是这个案例的全部代码。


但现在这个案例还有一些小问题,就是当鼠标在柱状图之间来回快速移动时,会越来越卡,应该是新建数组那块写的不完善,导致new的对象越来越多,没有及时清理。如果有看到的大神知道解决方法的话还请多多指导,下面留言我会看到的- _  -


echarts柱状图与中国地图联动,鼠标移入柱状图,地图响应地显示数据echarts柱状图与中国地图联动,鼠标移入柱状图,地图响应地显示数据






相关标签: echarts联动