supermap三維場景基本操作程式碼
阿新 • • 發佈:2019-02-12
四、三維場景基本操作
概述
在三維場景中可以很方便地對二維\三維點、二維\三維線、面、文字、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 + "米"); }