四、三维场景基本操作
概述
在三维场景中可以很方便地对二维\三维点、二维\三维线、面、文本、DEM、Grid、TIN、影像等数据进行三维实时浏览,并且可以进行飞行、距离量算等功能。在SuperMap iClient3D 8C for Plugin
中提供了Pan、Select、MeasureArea、MeasureDistance、MeasureHeight、NullAction、PanSelec类来实现对三维的实时浏览操作及量算功能,它们都继承自SceneAction ,并且提供了FlyingOperator来进行飞行操作。
下面以全幅显示、漫游、飞行、选择模型、距离量算为例予以说明。
FlyingOperator 飞行状态类结构图
FlyingOperator 常用方法
接口 | 说明 | |
---|---|---|
flyTo | 在指定的时间内,以指定的方式从当前场景飞行至指定的相机位置。 | |
flyToBounds | 在指定的时间内,从当前场景飞行至指定的 Bounds 区域。 | |
flyToGeometry | 在指定的时间内,以指定的方式从当前场景飞行至指定的几何对象。 | |
play | 按照指定路线飞行。 | |
moveTo | 将三维图层集合中指定索引号的三维图层移动到指定索引号位置。 | |
moveToBottom | 将三维图层集合中指定索引号的三维图层移动到底层。 | |
moveToTop | 将三维图层集合中指定索引号的三维图层移动到顶层。 | |
moveUp | 将三维图层集合中指定索引号的三维图层向上移动一层。 | |
removeAll | 删除图层集合中的所有图层。 | |
removeAt | 删除指定图层名称或索引号的图层。 |
SceneAction 结构图
SceneAction是其他三维浏览操作类Pan、Select、MeasureArea、MeasureDistance、MeasureHeight、NullAction、PanSelect的父类。用户可以对SceneAction进行扩展,实现一系列的操作。
ScencAction 常用属性
接口 | 说明 | |
---|---|---|
name | 获取或设置交互操作的名称。当用户自行开发一个SceneAction子类时,可自定义该操作的名称。 | |
sceneControl | 获取或。 | |
sceneName | 获取所属场景服务的名称。 | |
sceneAddress | 获取图层集合的服务地址。 |
SceneAction 常用方法
接口 | 说明 | |
---|---|---|
flyTo | 在指定的时间内,以指定的方式从当前场景飞行至指定的相机位置。 | |
flyToBounds | 在指定的时间内,从当前场景飞行至指定的 Bounds 区域。 | |
flyToGeometry | 在指定的时间内,以指定的方式从当前场景飞行至指定的几何对象。 | |
play | 按照指定路线飞行。 | |
moveTo | 将三维图层集合中指定索引号的三维图层移动到指定索引号位置。 | |
moveToBottom | 将三维图层集合中指定索引号的三维图层移动到底层。 | |
moveToTop | 将三维图层集合中指定索引号的三维图层移动到顶层。 | |
moveUp | 将三维图层集合中指定索引号的三维图层向上移动一层。 | |
removeAll | 删除图层集合中的所有图层。 | |
removeAt | 删除指定图层名称或索引号的图层。 |
三维场景基本操作
- 飞行
- 在 “default.html” 页面的 <body onload="onPageLoad()"> </body>中,场景控件后加入以下代码,在页面中添加飞行控件:
-
JavaScript 拷贝代码 <!--工具条-->
<div id="toolSet" style="position: relative; top:0px; height: 5%; width: 100%; visibility: visible; display: block;">
<!--通过设定经纬度和相机高度进行飞行--><label style="position:relative; left: 10px;">经度:</label> <input id="longitude" name="longitude" type="text" value="0" style="position:relative; left:10px; width:60px; z-index:11; "/> <label style="position:relative; left: 20px;">纬度:</label> <input id="latitude" name="latitude" type="text" value="0" style="position:relative; left:20px; width:60px; z-index:11; "/> <label style="position:relative; left: 30px;">高度:</label> <input id="altitude" name="altitude" type="text" value="500000" style="position:relative; left:30px; width:60px; z-index:11; "/> <img id="fly" alt="飞行" title="飞行" src="images/fly.png" style="position:relative; left:50px; width:32px; z-index:11;" onclick="fly()" onmouseover="this.style.width='36px';this.style.height='36px';this.src='images/fly_over.png'" onmouseout="this.style.width='32px';this.style.height='32px';this.src='images/fly.png'"/> </div>
- 在 “GettingStarted.js” 中填入以下代码:
-
JavaScript 拷贝代码 function fly() { var longitude = document.getElementById("longitude").value; var latitude = document.getElementById("latitude").value; var altitude = document.getElementById("altitude").value; var camera = new SuperMap.Web.Realspace.Camera(longitude,latitude,altitude); scene.get_flyingOperator().flyTo(camera);
//或者scene.set_camera(camera)}
-
scene.get_flyingOperator().flyTo(camera)
方法即以一定速度和方式飞行到指定地点。该方法有三个参数:第一个是相机对象,第二个和第三个参数为可选参数,分别为飞行速度和飞行方式枚举常量。而scene.get_camera(camera)
会将场景直接切换到相机指定位置。 - 全幅显示
- 在 “default.html” 页面中 id="toolSet" 的 <div></div>表示工具条的标签中加入以下代码,在页面添加全幅显示控件:
-
JavaScript 拷贝代码 <!--全幅显示-->
<img id="viewentire"alt="全幅显示" title="全幅显示" src="images/entire.png" style="position:relative; left:60px; width:32px; height:32px; z-index:11;" onclick="viewEntire()" onMouseOver="this.style.width='36px';this.style.height='36px';this.src='images/entire_over.png'" onMouseOut="this.style.width='32px';this.style.height='32px';this.src='images/entire.png'" />
- 在 “GettingStarted.js” 中填入以下代码,实现全幅显示功能:
-
JavaScript 拷贝代码 function viewEntire() { scene.viewEntire(); }
- 漫游
- 在 “default.html” 页面中 id="toolSet" 的 <div></div> 表示工具条的标签中加入以下代码,在页面中添加漫游控件:
-
JavaScript 拷贝代码 <!--漫游-->
<img id="pan" alt="漫游" title="漫游" src="images/pan.png" style="position:relative;left:70px;width:32px; height:32px; z-index:11; " onclick="setPan()" onMouseOver="this.style.width='36px';this.style.height='36px';this.src='images/pan_over.png'" onMouseOut="this.style.width='32px';this.style.height='32px';this.src='images/pan.png'" />
- 在 “GettingStarted.js” 中填入以下代码:
-
JavaScript 拷贝代码 function setPan() { var panAction = new SuperMap.Web.UI.Action3Ds.Pan(sceneControl); sceneControl.set_sceneAction(panAction); }
- 选择模型(模型和矢量数据可以被选中并高亮显示,还能获取被选中地物的 ID 号)
- 在 “default.html” 页面中 id="toolSet" 的 <div></div> 表示工具条的标签中加入以下代码,在页面中添加选择控件:
-
JavaScript 拷贝代码 <!--选择-->
<img id="select" alt="选择" title="选择" src="images/select.png" style="position:relative; left:80px; width:32px; z-index:11; " onclick="setSelect()" onmouseover="this.style.width='36px';this.style.height='36px';this.src='images/select_over.png'" onmouseout="this.style.width='32px';this.style.height='32px';this.src='images/select.png'" />
- 在 “GettingStarted.js” 中填入以下代码,实现选择操作。由于要在场景中选择对象后弹出选中对象的 ID 号,因此首先在场景控件中添加
addEvent
方法,该方法中第一个参数 “objectSelected” 表示侦听选中地物完成状态,第二个参数为用户自定义函数。也就是说一旦场景控件发生选择操作后触发selectMode
自定义函数。addEvent
还可以侦听距离量算、面积量算中或者结束后的操作,第一个参数可选值请参见该方法的接口文档: -
JavaScript 拷贝代码 function setSelect() { var selectAction = new SuperMap.Web.UI.Action3Ds.Select(sceneControl); sceneControl.set_sceneAction(selectAction); sceneControl.addEvent("objectSelected", selectModel) }
- 然后在 “GettingStarted.js” 中加入selectMode 自定义函数,实现 弹出选中对象的 ID 号(选择操作会返回一个 Selection3Ds 对象,关于侦听事件传回的参数请参见场景控件的
addEvent
方法): -
JavaScript 拷贝代码 function selectModel (selection3Ds) { var selection3DCount = selection3Ds.length; for(var i=0; i<selection3DCount; i++) { var selectCount = selection3Ds[i].get_count(); for(var j=0; j<selectCount; j++) { var selection3D = selection3Ds[i]; var layer3D = scene.get_layer3Ds().get_item(selection3D.get_layer3D().get_name()); var selectObjectName = layer3D.findFeature3DByID(selection3D.get_item(j)).get_name(); alert("该地物的ID为: "+selection3D.get_item(j)+"\n"+selectObjectName); } } }
- 运行后的效果:
-
图1 选中模型后提示模型 ID 号
- 距离量算
- 在 “default.html” 页面中 id="toolSet" 的 <div></div> 表示工具条的标签中加入以下代码,在页面中添加量算控件:
-
JavaScript 拷贝代码 <!--距离量算-->
<img id="refresh" alt="量算" title="量算" src="images/measure_distance.png" style="position:relative; left:90px; width:32px; height:32px; z-index:11; " onclick="measureDistance()" onmouseover="this.style.width='36px';this.style.height='36px'; this.src='images/measure_distance_over.png'" onmouseout="this.style.width='32px';this.style.height='32px';this.src='images/measure_distance.png'" />
- 在 “GettingStarted.js” 中填入以下代码,实现选择距离量算操作。与选择操作类似,也需要在场景控件中添加
addEvent
方法侦听距离量算结束状态,由"measureDistanceFinished" 表示。当量算操作结束后触发disFinished
自定义函数: -
JavaScript 拷贝代码 function measureDistance() { var measureDAction = new SuperMap.Web.UI.Action3Ds.MeasureDistance(sceneControl); sceneControl.set_sceneAction(measureDAction); sceneControl.addEvent("measureDistanceFinished", disFinished); }
- 然后在 “GettingStarted.js” 中加入disFinished 自定义函数,实现 距离量算结束后弹出总距离(量算操作会返回一个 dTotalDis 总距离参数,关于侦听事件传回的参数请参见场景控件的 addEvent 方法):
-
JavaScript 拷贝代码 function disFinished(dTotalDis) { alert("总距离:" + dTotalDis + "米"); }