1. 程式人生 > >supermap三維場景基本操作程式碼

supermap三維場景基本操作程式碼

四、三維場景基本操作

概述

在三維場景中可以很方便地對二維\三維點、二維\三維線、面、文字、DEM、Grid、TIN、影像等資料進行三維實時瀏覽,並且可以進行飛行、距離量算等功能。在SuperMap iClient3D 8C for Plugin中提供了Pan、Select、MeasureArea、MeasureDistance、MeasureHeight、NullAction、PanSelec類來實現對三維的實時瀏覽操作及量算功能,它們都繼承自SceneAction ,並且提供了FlyingOperator來進行飛行操作。

下面以全幅顯示、漫遊、飛行、選擇模型、距離量算為例予以說明。

FlyingOperator 飛行狀態類結構圖

FlyingOperator 飛行狀態類結構圖

FlyingOperator 常用方法

介面 說明
公共方法 flyTo 在指定的時間內,以指定的方式從當前場景飛行至指定的相機位置。
公共方法 flyToBounds 在指定的時間內,從當前場景飛行至指定的 Bounds 區域。
公共方法 flyToGeometry 在指定的時間內,以指定的方式從當前場景飛行至指定的幾何物件。
公共方法 play 按照指定路線飛行。
公共方法 moveTo 將三維圖層集合中指定索引號的三維圖層移動到指定索引號位置。
公共方法 moveToBottom 將三維圖層集合中指定索引號的三維圖層移動到底層。
公共方法 moveToTop 將三維圖層集合中指定索引號的三維圖層移動到頂層。
公共方法 moveUp 將三維圖層集合中指定索引號的三維圖層向上移動一層。
公共方法 removeAll 刪除圖層集合中的所有圖層。
公共方法 removeAt 刪除指定圖層名稱或索引號的圖層。

SceneAction 結構圖

SceneAction是其他三維瀏覽操作類Pan、Select、MeasureArea、MeasureDistance、MeasureHeight、NullAction、PanSelect的父類。使用者可以對SceneAction進行擴充套件,實現一系列的操作。

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 + "米");
      }