echarts拓扑图_ECharts+BaiduMap+HT for Web网络拓扑图应用

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

b133268bb1205184c3aca1d70db7fa64.gif

在这个Demo中,将GraphView拓扑图组件添加到百度地图组件中,覆盖在百度地图组件之上,并且在百度地图组件上和GraphView拓扑图组件上分别添加事件监听,相互同步经纬度和屏幕位置信息,从而来控制拓扑图上的组件位置固定在地图上,并在节点和节点之间的连线上加上了流动属性。右下角的图标框是采用HT for Web的Panel面板组件结合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中存在id为map的div,再通过百度地图的api来创建一个map地图对象,然后创建GraphView拓扑图组件,并获取GraphView组件中的view,最后将view添加到id为map的div的第二代孩子节点中。这时候问题就来了,为什么要将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中所有data的position属性,让其在屏幕上的坐标与地图同步,然后将GraphView的Scroll和Pinch两个事件的执行函数设置为空函数,就是当监听到Scroll或者Pinch事件时不做任何的处理,将这两个事件交给map来处理。

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

ae261f08a4966e3414e1ab28ca8db11c.gif
8d6d3ff577dd1add0fb2edc0ae0f7ab3.gif

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Vue和百度地图的绘图,你可以使用百度地图提供的JavaScript API来实现。下面是一个基本的例子: 首先,你需要在HTML文件中引入百度地图的API脚本: ```html <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你的密钥"></script> ``` 然后,在Vue组件中,你可以使用生命周期钩子函数或者方法来初始化地图和绘制图形。这里以一个简单的Vue组件为例: ```vue <template> <div id="mapContainer" style="width: 100%; height: 500px;"></div> </template> <script> export default { mounted() { // 初始化地图 const map = new BMap.Map('mapContainer'); const point = new BMap.Point(116.404, 39.915); map.centerAndZoom(point, 15); // 创建多边形 const polygonPoints = [ new BMap.Point(116.387, 39.910), new BMap.Point(116.380, 39.920), new BMap.Point(116.400, 39.920), ]; const polygon = new BMap.Polygon(polygonPoints, { strokeColor: 'red', strokeWeight: 2, fillColor: 'blue' }); map.addOverlay(polygon); }, }; </script> ``` 在这个例子中,我们在`mounted`生命周期钩子函数中初始化了地图,并创建了一个多边形并添加到地图上。你可以根据自己的需要修改多边形的坐标和样式。 需要注意的是,你需要将上述代码中的`ak`替换为你自己的百度地图密钥。你可以在百度地图开放平台申请一个密钥。 这只是一个简单的示例,如果你需要更复杂的绘图功能,你可以参考百度地图的官方文档或者搜索一些第三方库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值