加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ArcGIS Flex API for 3D—3D Map Control

发布时间:2020-12-15 01:18:12 所属栏目:百科 来源:网络整理
导读:要完全从0开始实现3D环境下的Map Control当然也可以,不过既然已经有了ArcGIS Server Flex API的Map Control,并且还有一整套现成的功能,那么将ArcGIS Server Flex API的Map Control加到PV3D的环境中是一个不错的选择。 但是要实现也不是非常容易的事情,在

要完全从0开始实现3D环境下的Map Control当然也可以,不过既然已经有了ArcGIS Server Flex API的Map Control,并且还有一整套现成的功能,那么将ArcGIS Server Flex API的Map Control加到PV3D的环境中是一个不错的选择。

但是要实现也不是非常容易的事情,在测试的过程中发现了一些问题。

①3D环境下显示Map Control必须保证同样添加到2D环境下,但是无法隐藏2D环境下的Map Control,或者是隐藏了2D环境下的Map Control,3D环境下显示的Map Control默认事件(双击、滚轮、移动)就无效;

②在Map Control上绘制图形对象会发生偏移,和鼠标点击的位置不一致。

最终的解决方法:将Map Control作为Plane的MovieMaterial,Map Control并不是直接加到MovieMaterial中,而是通过MovieClip,并且用一个ParentMovie Clip处理2D环境下的Map Control的隐藏,这样既能在2D环境下隐藏Map Control,还会保证Map Control在3D环境下保留原先的功能。

//add esri map control to pv3d environment
movie.addChild(map);
mat = new MovieMaterial(movie,true,false,new Rectangle(0,m_pv3dwidth,m_pv3dheight));
mat.smooth=true;
m_baseMapPlane = new Plane(mat,m_pv3dheight,20,20);
		    
//make esri map control invisible in flex 2d environment
movieParent.addChild(movie);
movieParent.alpha = 0;
pv3d.rawChildren.addChild(movieParent);

图形的绘制要在Map Control没有变形的时候进行,能够保证所绘即所得。

柱状图(createBarChartHeatMap)、饼状图(createPieChartHeatMap)的实现原理:通过QueryTask查询出需要做专题的对象,通过PV3D绘制出3D的柱状(Cube 3D object)、饼状(Cylinder 3D object)。考虑到柱状图和饼状图的三维效果,要对Cube、Cylinder不同面以不同的方式渲染。

柱状专题图

//create chart map materia list
matList.addMaterial(red,"front");
matList.addMaterial(red,"back");
matList.addMaterial(blue,"left");
matList.addMaterial(blue,"right");
matList.addMaterial(green,"top");
matList.addMaterial(green,"bottom");

var pvCube:Cube = new Cube(matList,2 * pv3dz,20);

饼状专题图

var pvCylinder:Cylinder = new Cylinder(null,pv3dz / 1.5,15,1,true);
		    	
var bottomMaterial:ColorMaterial = new ColorMaterial(0xff0000);
var middleMaterial:ColorMaterial = new ColorMaterial(0x0000ff);
var topMaterial:ColorMaterial = new ColorMaterial(0xff0000); 
var i:int;
		    	
//this is the bottom face
for (i = 0; i < 18; i++)
{
	 pvCylinder.geometry.faces[i].material = bottomMaterial;
}
	            
//the middle of the cylinder
for (i = 18; i < pvCylinder.geometry.faces.length - 18; i++)
{
	 pvCylinder.geometry.faces[i].material = middleMaterial;
}
	            
//the top
for (i = pvCylinder.geometry.faces.length - 18; i < 
pvCylinder.geometry.faces.length; i++)
{
	  pvCylinder.geometry.faces[i].material = topMaterial;
}

看看结果什么样


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读