`
xhload3d
  • 浏览: 210922 次
社区版块
存档分类
最新评论

ECharts+百度地图网络拓扑图应用

阅读更多

前一篇谈及到了ECharts整合HT for Web网络拓扑图应用,后来在EChartsDemo中看到了有关空气质量的相关报表应用,就想将百度地图、EChartsHT for Web三者结合起来也做一个类似空气质量报告的报表+拓扑图应用,于是有了下面的Demohttp://www.hightopo.com/demo/blog_baidu_20150928/ht-baidu.html


在这个Demo中,将GraphView拓扑图组件添加到百度地图组件中,覆盖在百度地图组件之上,并且在百度地图组件上和GraphView拓扑图组件上分别添加事件监听,相互同步经纬度和屏幕位置信息,从而来控制拓扑图上的组件位置固定在地图上,并在节点和节点之间的连线上加上了流动属性。右下角的图标框是采用HT for WebPanel面板组件结合ECharts图表组件完成的。

接下来我们来看看具体的代码实现:

 

1.百度地图是如何与HT for Web组件结合的;

 

map = new BMap.Map("map");
var view = graphView.getView();
view.className = 'graphView';
var mapDiv = document.getElementById('map');
mapDiv.firstChild.firstChild.appendChild(view);

 

首先需要在body中存在idmapdiv,再通过百度地图的api来创建一个map地图对象,然后创建GraphView拓扑图组件,并获取GraphView组件中的view,最后将view添加到idmapdiv的第二代孩子节点中。这时候问题就来了,为什么要将view添加到map的第二代孩子节点中呢,当你审查元素时你会发现这个div是百度地图的遮罩层,将view添加到上面,会使view会是在地图的顶层可见,不会被地图所遮挡。

 

2.百度地图和GraphView的事件监听;

 

map.addEventListener('moveend', function(e){
   resetPosition();
});
map.addEventListener('dragend', function(e){
   resetPosition();
});                                
map.addEventListener('zoomend', function(e){
	resetPosition();
});

graphView.handleScroll = function(){};
graphView.handlePinch = function(){};

function resetPosition(e){
	graphView.tx(0);
	graphView.ty(0);
	dataModel.each(function(data){
		var lonLat, position;
		if(data instanceof ht.HtmlNode){
			if(data.getId() != 'chartTotal') {
				position = data.getHost().getPosition();
				position = {x: position.x + 168, y: position.y + 158};
				data.setPosition(position.x, position.y);
			}
		} else if(data instanceof ht.Node){
			lonLat = data.lonLat;
			position = map.pointToPixel(lonLat);
			data.setPosition(position.x,position.y);
		}
	});
}

 

首先监听map的三个事件:moveend dragend zoomend,这三个事件做了同一件事--修改DataModel中所有dataposition属性,让其在屏幕上的坐标与地图同步,然后将GraphViewScrollPinch两个事件的执行函数设置为空函数,就是当监听到Scroll或者Pinch事件时不做任何的处理,将这两个事件交给map来处理。

 

resetPosition函数中,做的事情很简单:遍历DataModel中的data,根据它们各自在地图上的经纬度来换算成屏幕坐标,并将坐标设置到相应的data中,从而达到GraphView中的节点能够固定在地图上的效果。



 


3.创建右下角的图表组件:

ht.Chart = function(option){
	var self = this,
			view = self._view = document.createElement('div');
	view.style.position = 'absolute';
	view.style.setProperty('box-sizing', 'border-box', null);
	self._option = option;
	self._chart = echarts.init(self.getView());
	if(option)
		self._chart.setOption(option);
	self._FIRST = true;
};
ht.Default.def('ht.Chart', Object, {
	ms_v: 1,
	ms_fire: 1,
	ms_ac: ['chart', 'option', 'isFirst', 'view'],
	validateImpl: function(){
		var self = this,
				chart = self._chart;
		chart.resize();
		if(self._FIRST){
			self._FIRST = false;
			chart.restore();
		}
	},
	setSize: function(w, h){
		var view = this._view;
		view.style.width = w + 'px';
		view.style.height = h + 'px';
	}
});

function createPanel(title, width, height){
	chart = new ht.Chart(option);
	var c = chart.getChart();
	c.on(echarts.config.EVENT.LEGEND_SELECTED, legendSelectedFun);
	var chartPanel = new ht.widget.Panel({
		title: title,
		restoreToolTip: "Overview",
		width: width,
		contentHeight: height,
		narrowWhenCollapse: true,
		content: chart,
		expanded: true
	});
	chartPanel.setPositionRelativeTo("rightBottom");
	chartPanel.setPosition(0, 0);
	chartPanel.getView().style.margin = '10px';

	document.body.appendChild(chartPanel.getView());
}

首先定义了ht.Chart类,并实现了validateImpl方法,方法中处理的逻辑也很简单:在每次方法执行的时候调用图表的reset方法重新设定图标的展示大小,如果该方法是第一次执行的话,就调用图表的restore方法将图表还原为最原始的状态。会有这样的设计是因为ht.Chart类中的view是动态创建的,在没有添加到dom之前将一直存在于内存中,在内存中因为并没有浏览器宽高信息,所以div的实际宽高均为0,因此chartoption内容绘制在宽高为0div中,即使你resizechart,如果没用重置图表状态的话,图表状态将无法在图表上正常显示。

接下来就是创建panel图表组件了,这是HT for WebPanel组件的基本用法,其中content属性的值可以是HT for Web的任何组件或div元素,如果是HT fro Web组件的话,该组件必须实现了validateImpl方法,因为在panel的属性变化后将会调用content对应组件的validateImpl方法来重新布局组件内容。

 

 

4.EChartsGraphView拓扑图组件的交互:

legendSelectedFun = function(param) {
	if(chart._legendSelect){
		delete chart._legendSelect;
		return;
	}
	console.info(param);
	var id = nodeMap[param.target],
			dm = graphView.dm(),
			data = dm.getDataById(id),
			sm = dm.sm(),
			selection = sm.getSelection();

	if(param.selected[param.target]) {
		sm.appendSelection([data]);
		if(selectionData.indexOf(param.target) < 0){
			selectionData.push(param.target);
		}
	}else {
		sm.removeSelection([data]);
		var index = selectionData.indexOf(param.target);
		if(index >= 0){
			selectionData.splice(index, 1);
		}
	}
	sm.setSelection(selection.toArray());
};

graphView.mi(function(e){
	console.info(e.kind, e.data);
	var c = chart.getChart(),
			legend = c.component.legend,
			selectedMap = legend.getSelectedMap();

	if(e.kind === 'endRectSelect'){
		chart._legendSelect = true;
		for(var name in notes){
			legend.setSelected(name, false);
		}
		notes = {};
		graphView.dm().sm().each(function(data){
			var note = data.s('note');
			if(note)
				notes[note] = 1;
		});
		for(var name in notes){
			legend.setSelected(name, true);
		}
	} else if(e.kind === 'clickData'){
		chart._legendSelect = true;
		var data = e.data;
		if(data instanceof ht.Node){
			var note = data.s('note');

			if(note){
				var selected = legend.isSelected(note);
				if(selected){
					graphView.dm().sm().removeSelection([data]);
				}
				legend.setSelected(note, !selected);
			}
		}
	}
});

legendSelectedFun函数是EChart图表的legend插件选中事件监听,其中处理的逻辑是:当legend插件中的某个节点被选中了,也选中在GraphView拓扑图中对应的节点,当取消选中是,也取消选中GraphView拓扑图中对应的节点。

GraphView中添加交互监听,如果在GraphView中做了框选操作,在框选结束后,将原本legend插件上被选中的节点取消选中,然后再获取被选中节点,并在legend插件上选中对应节点;当GraphView上的节点被选中,则根据legend插件中对应节点选中情况来决定legend插件中的节点和graphView上的节点是否选中。

 

GraphView交互中,我往chart实例中添加了_legendSelect变量,该变量的设定是为了阻止在GraphView交互中修改legend插件的节点属性后回调legendSelectedFun回调函数做修改GraphView中节点属性操作。



今天就写到这吧,希望这篇文章能够帮到那些有地图、拓扑图、图表相结合需求的朋友,在设计上可能想法还不够成熟,希望大家不吝赐教。

 

2
3
分享到:
评论

相关推荐

    Echarts+百度地图_散点图完整版demo

    在本文中,我们将深入探讨如何将ECharts图表库与百度地图API结合,创建一个功能完备的散点图示例。ECharts是一个由百度开发的开源JavaScript数据可视化库,提供了丰富的图表类型,包括折线图、柱状图、饼图以及地图...

    echarts+百度地图如何定义边界线

    echarts+百度地图如何定义边界线

    echarts+百度地图集成

    通过合理配置和编程,你可以创建出满足各种需求的地图应用,无论是展示地理位置信息,还是分析地理分布数据,都能得心应手。在实际项目开发中,务必确保对ECharts和百度地图API有深入理解,并根据`test.html`中的...

    Echarts+百度地图 可查看散点图详细位置信息

    在"Echarts+百度地图 可查看散点图详细位置信息"这个项目中,我们可以理解为开发者利用Echarts的地图插件与百度地图API进行了集成,实现了在地图上显示散点,并且这些散点带有详细的地理位置信息。当用户鼠标悬停或...

    echarts+bmap结合可以在百度地图上展现 点图,线图,热力图 等可视化。

    3. 自定义图(custom):对于更复杂的地图应用,ECharts还允许用户自定义渲染图形。通过`type: 'custom'`,用户可以使用`renderItem`方法绘制任意形状,实现热力图或其他复杂的地图效果。 在配置ECharts系列时,...

    vue+echarts+element ui+django 前后端分离考勤系统源码.zip

    vue+echarts+element ui+django 前后端分离考勤系统源码 vue+echarts+element ui+django 前后端分离考勤系统源码 vue+echarts+element ui+django 前后端分离考勤系统源码 vue+echarts+...

    echarts+百度地图实现个人轨迹-点随线顺序移动

    ECharts是一款基于JavaScript的数据可视化库,而百度地图则是国内广泛应用的地图服务提供商。结合这两者,我们可以创建出交互性强、视觉效果出色的个人轨迹动画。 首先,我们需要在项目中引入ECharts和百度地图的...

    基于 vue3 + echarts + amap(高德地图) + pinia 开发的大屏可视化项目,支持拖拽布局.zip

    在本项目中,开发者利用了最新的前端技术栈,包括 Vue3、ECharts、高德地图(Amap)以及Pinia,创建了一个大屏可视化应用,并且实现了动态拖拽布局的功能。以下将详细介绍这些关键技术及其在项目中的应用。 Vue3 是一...

    echarts离线百度地图+demo(演示)+步骤文档(超详细)

    环境在内网,又需要echarts结合百度地图,请参考本资源。里面有echarts+离线百度地图+demo+步骤文档(超详细)。百分百能用,用过麻烦好评,谢谢。

    基于ECharts结合百度地图绘制地理信息数据

    ECharts提供了一种自定义地图的方式,可以使用百度地图作为地图底图。通过设置`map`类型图表,指定地图类型为`baidu`,并传入地图配置。 4. **加载地理信息数据** 地理信息数据通常包含地理位置坐标(经度和纬度...

    echarts 迁徙图+百度地图

    **ECharts 迁徙图与百度地图的集成详解** ECharts 是一个由百度开发的开源JavaScript图表库,它提供了丰富的可视化图表类型,如折线图、柱状图、饼图等,同时也支持自定义交互和动画效果。在ECharts中,迁徙图是一...

    Echart+百度地图实现个人轨迹

    在本项目中,我们利用ECharts这一强大的JavaScript数据可视化库,结合百度地图API,来实现个人轨迹的可视化展示。ECharts是由百度开发的一款基于Canvas的开源图表库,它提供了丰富的图表类型,精美的视觉效果以及...

    Echarts结合百度地图实现省市区散点展示

    公司要做数据大屏,Echart和百度地图的结合,实现利用百度地图的行政区划展示,在行政区区划中添加相应的Echarts散点图,散点图随地图放大和缩小,默认实景图,限制缩放等级,也可展示多个省市区划,代码注释详细,...

    ECharts+html展示大屏模板116套

    ECharts+html展示大屏模板116套,可以根据自己需求修改数据和样式。方便便捷,几乎涵盖目前市面上所有常见模板。 ECharts+html展示大屏模板116套,可以根据自己需求修改数据和样式。方便便捷,几乎涵盖目前市面上所有...

    基于ECharts & 百度地图的热力图展示设计与实现

    本篇将详细讲解如何利用ECharts与百度地图结合,创建一个动态的热力图展示。 首先,我们要了解ECharts的基本用法。ECharts是一个轻量级的图表库,通过引入其JavaScript库,可以方便地在网页上绘制各种图表。它的API...

    uni-app-echarts+PC+移动端中国地图下钻+标点+统计+放大缩小.rar

    在"uni-app-echarts+PC+移动端中国地图下钻+标点+统计+放大缩小.rar"项目中,ECharts 结合 uni-app 实现了对PC和移动端的兼容。这意味着地图组件不仅能在桌面浏览器上正常工作,还能在不同尺寸和操作系统的移动设备...

    echarts+安徽省地图+数据显示

    在"echarts+安徽省地图+数据显示"这个项目中,我们利用ECharts3的特性,结合了安徽省的地理信息,创建了一个可以显示安徽各地市数据的地图应用。这种地图可视化能够清晰地展示各个地市的统计数据,如经济指标、人口...

    flask+echarts+jinjia2考研数据可视化

    在本项目中,“flask+echarts+jinjia2考研数据可视化”是一个结合了Python Web框架Flask、数据可视化库Echarts以及模板引擎Jinja2的毕业或课程设计项目。这个项目的主要目的是通过爬虫获取数据,进行数据解析,然后...

Global site tag (gtag.js) - Google Analytics