百度地图、ECharts整合HT for Web网络拓扑图应用

摘要:
直击现场百度地图、ECharts整合HTforWeb网络拓扑图应用发表于3周前阅读|评论78人收藏此文章,我要收藏赞8慕课网,程序员升职加薪神器,点击免费学习摘要前一篇谈及到了ECharts整合HTforWeb的网络拓扑图应用,后来在ECharts的Demo中看到了有关空气质量的相关报表应用,就想将百度地图、ECharts和HTforWeb三者结合起来也做一个类似空气质量报告的报表+拓扑图应用。

直击现场

百度地图、ECharts整合HT for Web网络拓扑图应用
发表于3周前(2015-03-23 01:32) 阅读(1320)|评论(578人收藏此文章,我要收藏
8

慕课网,程序员升职加薪神器,点击免费学习

摘要前一篇谈及到了ECharts整合HT for Web的网络拓扑图应用,后来在ECharts的Demo中看到了有关空气质量的相关报表应用,就想将百度地图、ECharts和HT for Web三者结合起来也做一个类似空气质量报告的报表+拓扑图应用。

前一篇谈及到了ECharts整合HT for Web网络拓扑图应用,后来在ECharts的Demo中看到了有关空气质量的相关报表应用,就想将百度地图、ECharts和HT for Web三者结合起来也做一个类似空气质量报告的报表+拓扑图应用,于是有了下面的Demo:

百度地图、ECharts整合HT for Web网络拓扑图应用第1张

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

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

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

1
2
3
4
5
map=newBMap.Map("map");
varview=graphView.getView();
view.className='graphView';
varmapDiv=document.getElementById('map');
mapDiv.firstChild.firstChild.appendChild(view);

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
map.addEventListener('moveend',function(e){
resetPosition();
});
map.addEventListener('dragend',function(e){
resetPosition();
});
map.addEventListener('zoomend',function(e){
resetPosition();
});
graphView.handleScroll=function(){};
graphView.handlePinch=function(){};
functionresetPosition(e){
graphView.tx(0);
graphView.ty(0);
dataModel.each(function(data){
varlonLat,position;
if(datainstanceofht.HtmlNode){
if(data.getId()!='chartTotal'){
position=data.getHost().getPosition();
position={x:position.x+168,y:position.y+158};
data.setPosition(position.x,position.y);
}
}elseif(datainstanceofht.Node){
lonLat=data.lonLat;
position=map.pointToPixel(lonLat);
data.setPosition(position.x,position.y);
}
});
}

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

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

百度地图、ECharts整合HT for Web网络拓扑图应用第2张

百度地图、ECharts整合HT for Web网络拓扑图应用第3张

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
ht.Chart=function(option){
varself=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(){
varself=this,
chart=self._chart;
chart.resize();
if(self._FIRST){
self._FIRST=false;
chart.restore();
}
},
setSize:function(w,h){
varview=this._view;
view.style.width=w+'px';
view.style.height=h+'px';
}
});
functioncreatePanel(title,width,height){
chart=newht.Chart(option);
varc=chart.getChart();
c.on(echarts.config.EVENT.LEGEND_SELECTED,legendSelectedFun);
varchartPanel=newht.widget.Panel({
title:title,
restoreToolTip:"Overview",
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,因此chart将option内容绘制在宽高为0的div中,即使你resize了chart,如果没用重置图表状态的话,图表状态将无法在图表上正常显示。

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

4.ECharts和GraphView拓扑图组件的交互:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
legendSelectedFun=function(param){
if(chart._legendSelect){
deletechart._legendSelect;
return;
}
console.info(param);
varid=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]);
varindex=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);
varc=chart.getChart(),
legend=c.component.legend,
selectedMap=legend.getSelectedMap();
if(e.kind==='endRectSelect'){
chart._legendSelect=true;
for(varnameinnotes){
legend.setSelected(name,false);
}
notes={};
graphView.dm().sm().each(function(data){
varnote=data.s('note');
if(note)
notes[note]=1;
});
for(varnameinnotes){
legend.setSelected(name,true);
}
}elseif(e.kind==='clickData'){
chart._legendSelect=true;
vardata=e.data;
if(datainstanceofht.Node){
varnote=data.s('note');
if(note){
varselected=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中节点属性操作。

百度地图、ECharts整合HT for Web网络拓扑图应用第4张

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

免责声明:文章转载自《百度地图、ECharts整合HT for Web网络拓扑图应用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux下实现免密码登录(超详细)lvs 管理工具-ipvsadm下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python多进程与多线程

1、基本概念 2、多线程内容方法 3、多进程内容方法 1、基本概念 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流, 一个进程中可以并发多个线程,每条线程并行执行不同的任务。A thread is an execution context,...

Qt编写地图综合应用6-百度在线地图

一、前言 百度在线地图的应用老早就做过,后面经过不断的完善才到今天的这个程序,除了基本的可以载入地图并设置一些相关的属性以外,还增加了各种js函数直接异步加载数据比如动态添加点、矩形、圆形、行政区划等各种。当然最大的是增加了离线地图的支持,当年这个离线地图拖了很久很久才去做,最终还是搞定了。 在线地图没有太多的难点,搞一个简单的在线地图demo绝对是分分钟...

基于canvas实现合图引擎 设计思路

合图引擎基于json数据 解析,比较与htmltocanvas 先生成html再生成canva的解决方案, 渲染过程更可控,定制化成都高。 import Dev from '@ali/hetuCanva/dist/dev'; const data = { "name": "draw edit action", "width": 375, "h...

C#开发GIS应用简明教程(二)

第二章入门        1.工具(ToolConstants)        在上一章里我们试着做了一个将地图放大的应用程序.在这章里,我们将接触到更多的工具,并介绍自定义工具.        MapX为开发人员提供一系列的工具,这些工具的作用各有不同,我们通过开发一个应用程序来了解这些工具的作用,至于这些工具的具体说明,可以在MapX的帮助文档中...

简易google地图api调用

代码如下: <!DOCTYPE html> <html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <style type="text/css">html { h...

amcharts使用心得

在使用amcharts做统计的时候,遇到一个问题,就是怎么把后台传过来的一个json格式的字符串怎么转换成json数组,因为amchatrs要求解析的数据格式是json格式的数组。 解决方案:在js中先将隐藏域中的值转换成Array数组,再赋给chart的dataProvider属性,具体过程如下: 1、action中需要一个变量存储json格式的字符串传...