基本信息
以下是所在類或對象的基本信息。
AMD:
require(["esri/views/SceneView"], (SceneView) => { /* code goes here */ });
ESM:
import SceneView from "@arcgis/core/views/SceneView";
類:
esri/views/SceneView
繼承: SceneView > View > Accessor
自從:用於 JavaScript 4.0 的 ArcGIS API
用法說明
概述
SceneView 使用 WebGL 顯示 Map 或 WebScene 實例的 3D 視圖。要以 2D 形式渲染Map及其圖層,請參閱 MapView 的文檔。有關視圖的一般概述,請參閱View。
為了使Map在 DOM 中對用戶可見,SceneView 必須同時具有有效的 Map 實例和用於渲染的非零高度和寬度的 DOM 元素。請注意,在視圖開始渲染Map之前,Map中必須存在有效數據,例如帶有基礎圖層的 operational layers 或 basemap。
// Create a basic SceneView instance with a basemap and world elevation
const view = new SceneView({
// An instance of Map or WebScene
map: new Map({
basemap: "hybrid"
}),
// The id of a DOM element (may also be an actual DOM element)
container: "viewDiv"
});
使用視圖
SceneView 在構建後可能無法立即準備好顯示。例如,可能需要首先加載Map數據以確定視圖的空間參考,或者 DOM 容器可能尚未具有非零大小。許多視圖方法(例如 hitTest 或 goTo)需要視圖準備好才能使用。
// create a SceneView instance (for 3D viewing)
const view = new SceneView({
map: new Map({
basemap: "topo-vector"
}),
container: "viewDiv"
});
view.when(function() {
// SceneView is now ready for display and can be used. Here we will
// use goTo to view a particular location at a given zoom level, camera
// heading and tilt.
view.goTo({
center: [-112, 38],
zoom: 13,
heading: 30,
tilt: 60
})
})
.catch(function(err) {
// A rejected view indicates a fatal error making it unable to display,
// this usually means that WebGL is not available, or too old.
console.error("SceneView rejected:", err);
});
有關 view.when()
的實時示例,請參閱 2D overview map in SceneView 和 Toggle elevation layer 示例。
SceneView 導航
可以通過 goTo() 和視圖屬性以編程方式導航視圖,也可以使用鼠標、鍵盤或觸摸輸入以交互方式導航。 SceneView 導航默認啟用,包括鼠標、鍵盤和觸摸交互,如下表所述。觸摸交互適用於任何支持觸摸的顯示器或筆記本電腦屏幕。
行動 | SceneView 行為 |
---|---|
Drag | Pan |
Double-click | 放大光標 |
向前滾動 | 放大光標 |
向後滾動 | 在視圖中心縮小 |
右鍵單擊+拖動 | 3D-rotate 圍繞視圖中心 |
方向鍵 | 向左、向右、向上或向下微調視圖(僅在全局場景中支持) |
B + 左鍵單擊+拖動 | 3D-rotate圍繞相機的位置 |
P | 移動相機以垂直於視圖中顯示的數據 |
N | 調整SceneView 指向北方 |
W | 向上傾斜相機 |
A | 逆時針旋轉相機 |
S | 向下傾斜相機 |
D | 順時針旋轉相機 |
J | 向下移動,靠近視圖(僅在全局場景中支持) |
U | 從視圖中向上移動(僅在全局場景中支持) |
用一根或多根手指拖動 | Pan |
Double-tap用一根手指 | 放大手指位置 |
兩指捏入/捏出 | 縮小/放大 |
順時針或逆時針方向移動兩根手指 | Rotate |
在屏幕上上下拖動兩根手指 | 傾斜場景 |
要禁用SceneView 導航,您必須對觸發導航的指針或手勢事件的事件對象調用stopPropagation()
方法。
有關示例,請參閱我們在 disabling view navigation 上的示例。
SceneView 使用遊戲手柄和 3DConnexion 設備進行導航
當 view.navigation.gamepad.enabled
設置為 true
(默認)時,遊戲手柄和 3Dconnexion 設備(如 SpaceMouse)可用於導航。有關支持的設備,請參閱GamepadInputDevice。
遊戲手柄動作 | SceneView 行為 |
---|---|
左觸發器 | Descend |
右觸發器 | Ascend |
左搖杆 | Pan |
右搖杆 | 3D-rotate 圍繞視圖中心 |
動作形象 | SpaceMouse 動作 | SceneView 行為 |
---|---|---|
推(左/右/前/後) | Pan | |
拉起 | Ascend | |
向下推 | Descend | |
順時針旋轉 | 順時針旋轉視圖 | |
逆時針旋轉 | 逆時針旋轉視圖 | |
Tilt | 傾斜場景 |
要禁用遊戲手柄導航,您可以將 view.navigation.gamepad.enabled
設置為 false
。
注意:
- 根據 W3C Working Draft 29 October 2020 ,如果 Web 應用程序托管在 non-secure context(例如 http 而不是 https)上,則遊戲手柄函數可能無法在部分或所有瀏覽器上使用。用於 JavaScript 的 ArcGIS API 的未來版本可能會在非安全上下文中顯式禁用遊戲手柄函數。
程序化導航
傳統的 2D 映射屬性(例如比例、縮放、中心和範圍)在 3D 中並不總是能很好地工作。例如,在地球儀背景下查看Map時,其比例尺並不清晰。因此,SceneView 盡最大努力支持這些屬性,但有一定的限製(有關更多信息,請參閱各個屬性的文檔)。
// Compatibility with 2D viewing properties, such as center and zoom, allows
// convenient transitioning from the familiar use of the 2D MapView to the
// use of the SceneView for 3D viewing.
let view = new SceneView({
map: new Map({
basemap: "satellite"
}),
container: "viewDiv",
// Sets the center point of the view at a specified lon/lat
center: [-112, 38],
// Sets the zoom LOD to 13
zoom: 13
});
3D 查看的本質包括傾斜視圖、z-values 和旋轉,所有這些都增加了定義視圖中可見內容的複雜性。與主要由範圍或中心和比例定義的 2D MapView 相比,SceneView 的主要視圖規範是 Camera 實例。相機由 3D position 、 heading 和 tilt 定義。有關更多詳細信息,請參閱Camera 的文檔。
由於某些視圖屬性重疊(例如中心和相機),因此在構建視圖期間(直到視圖準備好)應用這些屬性有一個設定的優先級。下表說明了哪些屬性在視圖構造期間具有優先級(被覆蓋的屬性在構造期間不會產生任何影響)。
屬性 | 覆蓋 |
---|---|
camera | 視點、範圍、中心、比例、縮放 |
viewpoint | 範圍、中心、比例、縮放 |
extent | 中心、比例、縮放 |
scale | zoom |
定義用於在特定位置查看數據的相機可能很困難。 goTo 方法提供了一種便捷的方法,可以根據您想要查看的數據(幾何圖形、圖形)以及使用標題、傾斜、縮放或縮放從任何角度設置視圖的相機。此外,默認情況下,goTo 將提供到視圖新位置的平滑過渡。
// go to a location specified in geographic coordinates,
// from a 45 degree angle.
view.goTo({
center: [-112, 38],
heading: 45
});
// go to view all the graphics in view.graphics, while northing the
// the camera and tilting it to 60 degrees
view.goTo({
target: view.graphics,
heading: 0,
tilt: 60
});
// Set the view to show an extent at a -20 degree heading, disabling the
// animated transition
view.goTo({
target: new Extent(694942, 5596444, 1284090, 6163926, SpatialReference.WebMercator),
heading: -20
}, {
animate: false
});
觀看模式
SceneView 支持兩種不同的查看模式,global
(上左圖)和local
(上右圖),由viewingMode 屬性指定。全局場景將地球渲染為球體,而局部場景將表麵渲染為平麵。本地模式允許在局部或剪切區域中進行導航和函數顯示。在兩種查看模式下,用戶可以通過將 Ground.navigationConstraint.type 設置為 none
來導航地麵以下的相機。
查看模式(如果用戶未明確設置)是根據視圖的空間參考確定的。如果空間參考是 Web Mercator、WGS84、CGCS2000、Mars_2000_(Sphere)、GCS_Mars_2000 或 GCS_Moon_2000,則viewingMode 將默認為 global
。對於任何其他空間參考,viewingMode 將默認為 local
。
支持的坐標係
SceneView 支持全局場景中的以下坐標係:
- WGS84、WebMercator和CGCS2000
- 對 Mars_2000_(Sphere)、GCS_Mars_2000 和 GCS_Moon_2000 的支持是實驗性的(參見可視化火星上的數據樣本)。具有這些坐標係的場景具有以下限製:
- 不支持動態圖層、矢量切片圖層和場景圖層
- 日光當前未正確顯示
- 無法保存到門戶項目
在局部場景中,支持以下坐標係:
非緩存圖層可以添加到具有任何空間參考的場景中,因為它們將被重新投影到場景空間參考中。具有 GCS WGS84 的場景圖層也可以添加到具有 Web 墨卡托空間參考的場景中。
請參閱spatialReference 了解如何導出SceneView 的空間參考。
使用高程數據
在渲染地表時,SceneView 將使用Map.ground 中的elevation layers 作為高程源。與 basemap 類似,ground 可以使用眾所周知的名稱進行初始化,從而使用一組已知的高程圖層創建它。
let view = new SceneView({
map: new Map({
basemap: "satellite",
// A ground preset containing a single elevation layer, sourced from
// https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer
ground: "world-elevation"
},
container: "viewDiv"
});
可以將局部高程圖層添加到 ground.layers 以將多個高程源合並到一個表麵中。有關示例,請參見3D Map With Elevation Services。
處理事件
當用戶與 SceneView 交互時,他們的操作會觸發您可以偵聽和響應的事件。例如,您可以監聽用戶將鼠標移到Map上並顯示鼠標位置的坐標。這稱為pointer-move 事件。有關所有事件的列表,請參閱SceneView 事件部分。
請務必注意,某些事件是相互依賴的,並且用戶交互的時間可能會影響觸發的事件類型。例如,單擊一次會觸發一係列事件:當用戶按下鼠標按鈕時pointer-down,當用戶釋放鼠標按鈕時pointer-up。 immediate-click 事件在 pointer-up 事件之後立即觸發。 immediate-click 應用於立即響應用戶交互。隻有在確保用戶不會再次單擊後才會觸發單擊事件(在這種情況下會觸發雙擊事件)。
如果是雙擊,則在第一次單擊後會重複相同的事件鏈。但是,如果用戶在接近的時間範圍內第二次單擊,則不再發出單擊事件,但會再次觸發 pointer-down、pointer-up 和 immediate-click 事件。在兩個 immediate-click 事件之後,雙擊事件會與 immediate-double-click 事件一起觸發。兩者之間的區別在於,immediate-double-click 無法通過在 immediate-click 事件上使用 stopPropagation
來阻止,因此可用於對 double-clicking 做出反應,而與 immediate-click 事件的使用無關。
這些事件也在內部用於導航、彈出窗口或不同的交互工具,如測量或草圖。在某些用例中,添加額外的事件偵聽器可能會幹擾默認事件偵聽器。例如,添加immediate-click
事件來打開一個彈出窗口,將幹擾同樣打開一個彈出窗口的默認 click
事件。
請參閱Event explorer 示例,以可視化與視圖交互時觸發的不同事件。
已知限製
-
SceneView 中可渲染的要素數量取決於視圖的質量配置文件以及每個要素的幾何圖形和符號的複雜性。當您在場景中導航時,會動態加載並顯示具有大量要素的圖層。為了獲得最佳性能,顯示的函數數量會根據符號的複雜性和設備函數進行調整。因此,某些要素可能在視圖中不可見。
-
SceneView 不支持Multipoint 幾何體的渲染。
相關用法
- JavaScript ArcGIS SceneView double-click事件用法及代碼示例
- JavaScript ArcGIS SceneView.breakpoints用法及代碼示例
- JavaScript ArcGIS SceneView.on用法及代碼示例
- JavaScript ArcGIS SceneView.highlightOptions用法及代碼示例
- JavaScript ArcGIS SceneView mouse-wheel事件用法及代碼示例
- JavaScript ArcGIS SceneView click事件用法及代碼示例
- JavaScript ArcGIS SceneView.input用法及代碼示例
- JavaScript ArcGIS SceneView.ui用法及代碼示例
- JavaScript ArcGIS SceneView key-down事件用法及代碼示例
- JavaScript ArcGIS SceneView layerview-create事件用法及代碼示例
- JavaScript ArcGIS SceneView.whenAnalysisView用法及代碼示例
- JavaScript ArcGIS SceneView.camera用法及代碼示例
- JavaScript ArcGIS SceneView.widthBreakpoint用法及代碼示例
- JavaScript ArcGIS SceneView.navigation用法及代碼示例
- JavaScript ArcGIS SceneView.hitTest用法及代碼示例
- JavaScript ArcGIS SceneView.popup用法及代碼示例
- JavaScript ArcGIS SceneView.graphics用法及代碼示例
- JavaScript ArcGIS SceneView.when用法及代碼示例
- JavaScript ArcGIS SceneView.zoom用法及代碼示例
- JavaScript ArcGIS SceneView.container用法及代碼示例
- JavaScript ArcGIS SceneView.takeScreenshot用法及代碼示例
- JavaScript ArcGIS SceneView layerview-create-error事件用法及代碼示例
- JavaScript ArcGIS SceneView.whenLayerView用法及代碼示例
- JavaScript ArcGIS SceneView.goTo用法及代碼示例
- JavaScript ArcGIS SceneView.tryFatalErrorRecovery用法及代碼示例
注:本文由純淨天空篩選整理自arcgis.com大神的英文原創作品 SceneView。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。