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

百度地图与HT for Web结合的GIS网络拓扑应用

阅读更多

在《HT for Web整合OpenLayers实现GIS地图应用》篇中介绍了HT for Web与OpenLayers的整合,不少朋友反应国内用得比较多的还是百度地图,虽然HT整合百度地图原理与OpenLayers一致,但不同GIS引擎客户端结合代码细节还是有不少差异,自定义地图风格更是完全不一样,为此我再开篇介绍下HT与百度地图整合的方案,这次我们将改进以前的例子,除了代表城市的拓扑节点外,再增加连线连接省会和城市,实现网络拓扑链路的流动效果。

Screen Shot 2014-12-03 at 11.43.05 PMScreen Shot 2014-12-03 at 11.18.02 PMScreen Shot 2014-12-03 at 11.16.55 PM

百度地图有多种客户端SDK,我们这里用的自然是JavaScript版的API,百度地图的2.0版增加了不少新功能,例如可以自定义地图样式模板,本例中我们特意设置成style:’midnight’的深色背景风格。插入map的位置与OpenLayers也不一样,通过mapDiv.firstChild.firstChild.appendChild(view);插入,zIndex这些属性都还好不需要设置。

坐标转换方面从经纬度转换成平面坐标是map.pointToPixel函数,通过node.setPosition(map.pointToPixel(new BMap.Point(lon, lat)));可设置ht.Node对应的平面逻辑坐标,通过map.pixelToPoint(new BMap.Pixel(x,y))可将平面坐标转换成经纬度坐标,我们在监听节点图元被拖拽结束的endMove需要重新计算当前位置的经纬度时用到。

地图数据方面每个省的省会城市都是第一个出现,因此我们构建了size大一点的带渐进色的图元代表省会城市,其他城市构建时同时构建ht.Edge的连线与省会节点连接,同时引入HTht-flow.js插件,只需要graphView.enableFlow(60);一句话就可以启动流动连线功能,每条edge连线还可以有很多flow.*相关的流动参考可控制流动效果,这里的简单例子我们不需要做定制,保持HT默认的流动参数就足够酷了。

另外通过graphView.setLayers(['edgeLayer', 'nodeLayer']);我们为拓扑设置了两个层,node.setLayer(‘nodeLayer’);和edge.setLayer(‘edgeLayer’)使得图元节点全部呈现于连线之上,从这个细节大家可以发现,以前需要在GIS的SDK扩展的功能也可以通过在HTGraphView实现,地图仅仅是作为背景,业务逻辑代码完全在更灵活强大的HT模型中进行。

其他方面细节还由监听map的缩放等操作对拓扑图元重新定位,以及监听交互决定GraphView还是Map进行控制等都与以前的文章类似,这里就不再介绍了,以下为操作视频、抓图和源代码供大家参考,这样的结合可完美的将百度地图丰富的地图数据信息,与HT强大的逻辑拓扑功能相结合,否则光靠百度地图SDK的API的扩展方式,用户只能做些简单的效果,例如连线流动等效果都远不如HT这样一行代码就搞定来的容易。http://v.youku.com/v_show/id_XODQxMDcwNjQ0.html

<iframe src="http://player.youku.com/embed/XODQxMDcwNjQ0" frameborder="0" width="510" height="498"></iframe>

Screen Shot 2014-12-03 at 11.12.43 PM

Screen Shot 2014-12-03 at 9.43.40 PMScreen Shot 2014-12-04 at 12.31.13 AM

var dataModel = new ht.DataModel();
var graphView = new ht.graph.GraphView(dataModel);              
var map = null;   

function init() {
	map = new BMap.Map("map");   
	var point = new BMap.Point(116.404, 39.915);                          
	map.addTileLayer(new BMap.TrafficLayer());                    
	map.centerAndZoom(point, 4);                    
	map.enableScrollWheelZoom();                       
	map.addControl(new BMap.NavigationControl());                               

	map.setMapStyle({
		features: ["road", "building","water","land"],
		style:'midnight'
	});

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

	map.addEventListener('movestart', function(e){                   
	   view.style.opacity = 0;
	});
	map.addEventListener('moveend', function(e){
	   view.style.opacity = 1; 
	   resetPosition(); 
	});
	map.addEventListener('dragstart', function(e){
	   view.style.opacity = 0;                
	});
	map.addEventListener('dragend', function(e){
	   view.style.opacity = 1; 
	   resetPosition(); 
	});                                
	map.addEventListener('zoomstart', function(e){
		view.style.opacity = 0;
	});                
	map.addEventListener('zoomend', function(e){
		view.style.opacity = 1;    
		resetPosition(); 
	});                

	graphView.setLayers(['edgeLayer', 'nodeLayer']);
	graphView.enableFlow(60);
	graphView.enableToolTip();
	graphView.getToolTip = function(event){
		var data = this.getDataAt(event);
		if(data instanceof ht.Node){
			return '城市:' + data.s('note') + '
经度:' + data.lonLat.lng + '
维度:' + data.lonLat.lat;
		}
		return null;
	};
	graphView.isVisible = function(data){
		return map.getZoom() > 1 || this.isSelected(data);
	};
	graphView.isNoteVisible = function(data){
		return map.getZoom() > 8 || this.isSelected(data);
	}; 
	graphView.getLabel = function(data){
		if(data instanceof ht.Node){
			return '经度:' + data.lonLat.lng + '\n维度:' + data.lonLat.lat;
		}                    
	};
	graphView.isLabelVisible = function(data){
		return map.getZoom() > 9 || this.isSelected(data);
	}; 

	graphView.mi(function(e){
		if(e.kind === 'endMove'){
			graphView.sm().each(function(data){
				if(data instanceof ht.Node){
				   var position = data.getPosition(),
					   x = position.x + graphView.tx(),
					   y = position.y + graphView.ty();                             
				   data.lonLat = map.pixelToPoint(new BMap.Pixel(x,y)); 
				}                            
			});
		}
	});

	graphView.setAutoScrollZone(-1);
	graphView.handleScroll = function(){};
	graphView.handlePinch = function(){};

	var handleClick = function(e){
		var data = graphView.getDataAt(e);
		if(data){
			e.stopPropagation();
		}
		else if(e.metaKey || e.ctrlKey){
			e.stopPropagation();
		}
	};
	graphView.getView().addEventListener('click', handleClick, false);                
	graphView.getView().addEventListener('dblclick', handleClick, false);
	graphView.getView().addEventListener(ht.Default.isTouchable ? 'touchstart' : 'mousedown', handleClick, false);

	window.addEventListener("resize", function(e) {
		graphView.invalidate();
	}, false);                 

	var color = randomColor(),
		province = null;
	lines = china.split('\n');
	for(var i=0; i<lines.length; i++) {
		line = lines[i].trim();
		if(line.indexOf('【') === 0){               
			color = randomColor();
			province = null;
		}else{
			var ss = line.split(' ');
			if(ss.length === 3){
				var node = createNode(parseFloat(ss[1].substr(3)), parseFloat(ss[2].substr(3)), ss[0].substr(3), color); 
				if(province){
					var edge = new ht.Edge(province, node);
					edge.s({
						'edge.center': true,
						'edge.width': 1,                                    
						'flow': true
					});
					edge.setLayer('edgeLayer');
					dataModel.add(edge);
				}else{
					province = node;
					node.s({                                   
						'shape.gradient': 'radial.center',                                    
						'border.type': 'circle',
						'border.width': 1,
						'border.color': 'rgba(200, 200, 200, 0.5)'                                    
					});
					node.setSize(15, 15);
				}
			}
		}
	}                

}

function createNode(lon, lat, name, color){
	var node = new ht.Node();
	node.s({
		'shape': 'circle',
		'shape.background': color,
		'note': name,                    
		'label.background': 'rgba(255, 255, 0, 0.5)',                    
		'select.type': 'circle'
	});
	node.setLayer('nodeLayer');
	node.setSize(10, 10);
	var lonLat = new BMap.Point(lon, lat); 
	node.setPosition(map.pointToPixel(lonLat));
	node.lonLat = lonLat;
	graphView.dm().add(node);
	return node;
}            

function resetPosition(e){
	graphView.tx(0);
	graphView.ty(0);
	dataModel.each(function(data){
		if(data instanceof ht.Node){
			var lonLat = data.lonLat,
				position = map.pointToPixel(lonLat);   
			data.setPosition(position.x,position.y);                           
		}
	});            
}

 

3
4
分享到:
评论
1 楼 elan1986 2014-12-04  

相关推荐

    HT for Web列表和3D拓扑组件的拖拽应用

    NULL 博文链接:https://xhload3d.iteye.com/blog/2226706

    HT for Web Demo

    1. **htForWeb3D.html**:这个HTML文件是整个3D可视化的入口点。它会包含必要的HTML结构,以及引入HT for Web库和其他相关JavaScript、CSS资源。HTML文件中通常会有创建图形实例、设置数据模型、定义交互行为等代码...

    hightopo HT for Web(hightopo.zip)

    3. **图形渲染**:HT for Web采用了高性能的SVG和HTML5 Canvas技术进行图形渲染,能够快速绘制复杂的图表和交互式拓扑图,适合用于数据可视化、流程图、网络拓扑等场景。 4. **数据驱动**:HT for Web基于数据驱动...

    HT for Web 入门手册

    HT for Web是基于HTML5标准的企业应用图形界面一站式解决方案, 其包含通用组件、拓扑组件和3D渲染引擎等丰富的图形界面开发类库,提供了完全基于HTML5的矢量编辑器、拓扑编辑器及 3D场景编辑器等多套可视化设计工具...

    ht-for-web

    【ht-for-web】是一款专为前端开发者设计的框架,主要用于创建和管理拓扑图以及页面布局。这个框架的强大之处在于它的灵活性和可定制性,使得开发者可以轻松地构建出复杂且交互性强的可视化应用。 在拓扑图制作方面...

    HT for Web - Box2d

    一直在找苦苦寻找一个Box2D的物理引擎javascript整合例子,发现 http://www.hightopo.com/blog/275.html 这篇文章的例子效果非常棒,通过HT for Web的3D引擎直观的呈现Box2D物理碰撞的实时运行效果,这么强大的3D...

    HT for Web基础动画介绍

    【标题】"HT for Web基础动画介绍"涉及的是在Web开发中使用HT(Hightopo)框架进行动画制作的相关知识。HT for Web是一款基于HTML5的2D/3D图形和交互开发工具,广泛应用于数据可视化、模拟仿真、工业互联网等领域。...

    HT for Web 3d引擎示例加api说明文档

    HT for Web,通常简称为 HT,这是一个基于 JavaScript 开发的 WebGL 引擎。可用于 2D/3D 可视化开发,其核心文件只有一个,就是 ”ht.js”。在 index.html 中使用 script 标签进入后便可使用。 完全版本效果:...

    基于HT for Web矢量实现HTML5上传文件进度条

    总之,基于HT for Web的HTML5文件上传进度条实现结合了现代Web技术,如Web Workers、HTML5 File API和Node.js的Formidable库,提供了高效、流畅的文件上传体验。开发者可以通过这种方式创建更先进的Web应用程序,...

    基于HT for Web矢量实现HTML5文件上传进度条

    HT for Web是一款强大的Web可视化工具,它允许开发者通过矢量图形来构建交互式的Web应用程序。在HTML5中,File API提供了处理文件和数据的能力,包括读取本地文件、监控文件上传进度等功能。 这篇博客(博文链接:...

    HT FOR WEB 自定义图标菜单

    HT FOR WEB 一套强大的基于 WebGL 技术的 3D 图形引擎,编辑器下,左边菜单可自定义控制多个不同的菜单操作。

    快速开发基于 HTML5 网络拓扑图应用--入门篇(四)

    上回我们用 ht.widget....HT for Web 提供了工具条组件类 ht.widget.Toolbar,工具条上的元素可为原生的 html 元素, 也支持 ht 提供的如 ht-form.js 的表单插件中的组件,并内置提供了按钮、单选按钮、复选框等组件。

    HT1622应用程序+应用笔记

    《HT1622应用程序与应用笔记详解》 在电子设计领域,LCD驱动芯片是实现图形和文本显示的关键元件。HT1622是一款高效、经济的LCD驱动器,广泛应用于各种嵌入式系统和消费电子产品中。本资料包包含了与HT1622相关的两...

    hightopo-master

    Hightopo Master,简称HT for Web,是一个强大的图形界面组件库,旨在帮助开发者轻松创建桌面和移动终端上的企业级应用。它以HTML5为基础,无需担心跨平台兼容性问题,同时处理触屏手势交互等复杂功能,极大地简化了...

    html5绘图工具 基于 HTML5 的 Canvas 技术,拓扑图是电力

    HTML5 是一种强大的 web 开发技术,它在网页...通过这样的方式,HTML5 和 Canvas 结合 JTopo 等绘图库,能够在网页上实现灵活且功能丰富的电力或电信行业的拓扑图应用,帮助工程师进行系统监控、故障排查和网络规划。

    hightopo.zip

    3. **触屏手势交互**:对于触控设备,HT for Web 提供了对常见手势(如滑动、缩放、旋转)的支持,使得在触摸屏上的用户体验与桌面设备一样流畅。 4. **图形界面组件**:HT for Web 包含多种可重用的组件,如图表、...

    基于 HTML5 快速构建拓扑图1

    总的来说,HTML5 技术与 HT 结合为快速构建拓扑图提供了强大支持,无论是在企业级应用还是个人项目中,都能实现高效、美观且功能丰富的拓扑图展示。开发者可以通过不断学习和实践,充分利用 HTML5 的各种特性,创造...

    HT66Fxx flash 单片机原理与应用(C语言版)

    《HT66Fxx flash 单片机原理与应用(C语言版)》是一本深入讲解合泰(Holtek)HT66F系列Flash单片机的书籍,它结合了硬件原理与C语言编程,旨在帮助读者全面理解和掌握这类单片机在实际应用中的操作与设计。...

    HT 手册-07311656.pdf

    HT-for-web 的概述、开发类库、开发工具、运行环境、函数简写、模型、设计模式、类包层次、工具类、数据类型、数据容器、选择模型、组件、配置、图片、动画、属性组件、列表组件、树形组件、表格组件、工具条组件、...

    HT1625 STM32.rar_HT1625液晶驱动_HT1625驱动程序_STM32 段式液晶_stm32 产品

    总的来说,HT1625与STM32的配合使用,为段式液晶显示提供了一种高效且经济的解决方案。通过熟练掌握STM32的GPIO控制和串行通信,开发者可以有效地编写出可靠的驱动程序,实现定制化的显示效果。而提供的经过严格验证...

Global site tag (gtag.js) - Google Analytics