基本信息
以下是所在類或對象的基本信息。
AMD:
require(["esri/views/MapView"], (MapView) => { /* code goes here */ });
ESM:
import MapView from "@arcgis/core/views/MapView";
類:
esri/views/MapView
自從:用於 JavaScript 4.0 的 ArcGIS API
用法說明
概述
MapView 顯示 Map 實例的 2D 視圖。必須創建 MapView 的實例以在 2D 中渲染 Map(及其操作層和基礎層)。要以 3D 形式渲染Map及其圖層,請參閱 SceneView 的文檔。有關視圖的一般概述,請參閱View。
對於用戶在 DOM 中可見的Map,必須創建 MapView 表示至少兩個對象:Map 實例和 DOM 元素。每個分別在Map和容器屬性中設置。
// Create a MapView instance (for 2D viewing)
const view = new MapView({
map: myMap, // References a Map instance
container: "viewDiv" // References the ID of a DOM element
});
使用視圖
除了負責Map 及其元素的渲染之外,MapView 還處理用戶與Map之間的交互。例如,傳統Map比例尺未設置在 Map 上;它設置在 MapView 上。
view.scale = 24000; // Sets a 1:24,0000 scale on the view
MapView 在構建後可能無法立即準備好顯示。例如,可能需要首先加載Map數據以確定視圖的空間參考,或者 DOM 容器可能尚未具有非零大小。許多視圖方法(例如 hitTest 或 goTo)需要視圖準備好才能使用。
可以調用MapView 實例上的.when()
方法來執行隻能在Map加載後運行的進程。
view.when(function() {
// MapView is now ready for display and can be used. Here we will
// use goTo to view a particular location at a given zoom level and center
view.goTo({
center: [-112, 38],
zoom: 12
});
})
.catch(function(err) {
// A rejected view indicates a fatal error making it unable to display.
// Use the errback function to handle when the view doesn't load properly
console.error("MapView rejected:", err);
});
有關 view.when()
的實時示例,請參閱如何使用 Add 2D overview map in SceneView 示例。
程序化導航
您可以通過使用中心和比例或縮放的組合,或者通過在 MapView 的構造函數中設置範圍或視點屬性來設置初始範圍(或Map的可見部分)。
由於某些視圖屬性會相互覆蓋,因此在構建視圖期間應用這些屬性時會存在一組優先級。初始化時,MapView 需要一個中心和比例,以及可選的旋轉。中心和比例源自多個屬性:中心、縮放、比例、範圍或視點。 center
和 scale
都可以從 extent
和 viewpoint
派生。如果在構造函數中設置了所有屬性,則它們將按照定義的順序應用。例如,比例是從範圍派生的,因此在範圍之後設置比例會覆蓋派生值,而從範圍中心派生的中心保持不變。下表說明了哪些屬性在視圖構造期間具有優先級(被覆蓋的屬性在構造期間不會產生任何影響)。
屬性 | 覆蓋 |
---|---|
viewpoint | 範圍、中心、比例、縮放 |
extent | 中心、比例、縮放 |
const view = new MapView({
map: map,
container: "viewDiv",
zoom: 10,
extent: initialExtent, // will override zoom
// map will be centered at [0,0], but the scale from initialExtent will be used
center: [0,0]
});
注意
- 如果構造函數中設置的中心、範圍或viewpoint.targetGeometry的空間參考與視圖的spatialReference不匹配,則將動態加載projection engine。
- 在運行時,當將中心、範圍或視點設置為與視圖空間參考不匹配的空間參考時,projection engine 必須為 loaded。您可以在設置這些屬性之前通過調用 projection.isLoaded() 檢查投影引擎是否已加載。如果尚未加載,您可以調用projection.load()。
// Create a map with Antarctic imagery basemap
const map = new Map({
basemap: new Basemap({
portalItem: {
id: "6553466517dd4d5e8b0c518b8d6b64cb" // Antarctic Imagery
}
});
});
// Set the center and zoom level on the view.
// In this case, the view's spatial reference wkid is 3031
// center is lat/long. Projection engine will be loaded dynamically
// to project the center to match the spatial reference of the view
const view = new MapView({
map: map, // References a Map instance
container: "viewDiv" // References the ID of a DOM element
center: [-100, 35], // Sets the center point of the view at a specified lon/lat
zoom: 3 // MapView converts this to its corresponding scale which is 112823780.660964
});
// Sets the center point of the view at a specified lon/lat
view.center = [-112, 38];
view.zoom = 13; // Sets the zoom LOD to 13
// new extent for the mapview where the spatialReference.wkid is 4326
const extent = new Extent({
xmin: -9177882,
ymin: 4246761,
xmax: -9176720,
ymax: 4247967,
spatialReference: {
wkid: 102100
}
});
if (!projection.isLoaded()) {
// load the projection engine if it is not loaded
await projection.load();
}
view.extent = extent;
由於 View 處理用戶交互,因此單擊等事件是在 MapView 上處理的。使用 goTo() 方法也可以實現動畫,該方法允許您將 MapView 從一個範圍更改或移動到另一個範圍。
縮放和 LOD
為什麽設置MapView.zoom總是不起作用,為什麽它的值是-1
?本節介紹 MapView 縮放和 LOD 的工作原理。Map的 basemap 定義加載視圖時 MapView 的有效 LOD。 LOD 具有 scale 和相應的 zoom 值,可用於導航Map。如果MapView具有有效的有效LOD,則可以在MapView上設置縮放值。在這種情況下,視圖將其轉換為相應的比例,或者如果縮放是小數,則對其進行插值。
如果以下陳述成立,則 MapView 的 constraints.effectiveLODs 將是 null
:
如果有效LOD 為null
,則無法在MapView 上設置zoom
,因為無法進行轉換。在這種情況下,縮放值將為-1
。設置比例就可以了。為了解決這個問題,可以在初始化時通過調用 TileInfo.create().lods 來定義 MapView 的 constraints.lods 。
const layer = new FeatureLayer({
url: "https://services.arcgis.com/P3ePLMYs2RVChkJx/ArcGIS/rest/services/World_Countries_(Generalized)/FeatureServer/0"
});
// initialize the map without basemap, just add the feature layer to the map
// feature layer does not have tileInfo to derive effectiveLODs from
const map = new Map({
layers: [layer]
});
// Create a tileInfo instance using the default settings and pass its
// resulting LODs to a MapView's constraints.lods.
const view = new MapView({
container: "viewDiv",
map: map,
zoom: 3, // this will work because we are creating LODs. Otherwise, it will not work
constraints: {
lods: TileInfo.create({
// create the LODs to match the spatial reference of the view
spatialReference: viewSpatialReference
}).lods
},
spatialReference: viewSpatialReference
});
MapView 導航
MapView 導航默認啟用,包括鼠標交互,如下表所述。
行動 | MapView 行為 |
---|---|
Drag | Pan |
Double-click | 放大光標 |
Ctrl+雙擊 | 縮小光標處 |
向前滾動 | 放大光標 |
向後滾動 | 縮小光標處 |
右鍵單擊+拖動 | 2D-rotate |
Shift+左鍵單擊+拖動 | 縮放到繪製圖形的範圍 |
方向鍵 | 向左、向右、向上或向下微移視圖 |
N | 調整視圖指向北方 |
A | 逆時針旋轉視圖 |
D | 順時針旋轉視圖 |
+ | 在Map中心逐漸放大 |
- | 在Map中心逐漸縮小 |
用一根或多根手指拖動 | Pan |
Double-tap 用一根手指縮放 | 在手指位置平移 |
兩指捏入/捏出 | 縮小/放大 |
順時針或逆時針方向移動兩根手指 | Rotate |
要禁用MapView 導航,您必須對觸發導航的指針或手勢事件的事件對象調用stopPropagation()
方法。
有關示例,請參閱我們在 disabling view navigation 上的示例。
MapView 使用遊戲手柄和 3DConnexion 設備進行導航
當 view.navigation.gamepad.enabled
設置為 true
(默認)時,遊戲手柄和 3Dconnexion 設備(如 SpaceMouse)可用於導航。要在 MapView 中啟用縮放,必須將 view.constraints.snapToZoom
設置為 false
(默認為 true
)。請參閱GamepadInputDevice 了解支持的設備。
遊戲手柄動作 | MapView 行為 |
---|---|
左觸發器 | 放大 |
右觸發器 | 縮小 |
左搖杆 | 平移視圖 |
右搖杆 | 旋轉視圖 |
動作形象 | SpaceMouse 動作 | MapView 行為 |
---|---|---|
推(左/右/前/後) | 平移視圖 | |
拉起 | 縮小 | |
向下推 | 放大 | |
順時針旋轉 | 順時針旋轉視圖 | |
逆時針旋轉 | 逆時針旋轉視圖 |
要禁用遊戲手柄導航,您可以將 view.navigation.gamepad.enabled
設置為 false
。
注意:
- 縮放捕捉必須禁用連續縮放。在Map視圖中,
snapToZoom
是true
默認。view.constraints.snapToZoom = false;
- 根據 W3C Working Draft 29 October 2020 ,如果 Web 應用程序托管在 non-secure context(例如 http 而不是 https)上,則遊戲手柄函數可能無法在部分或所有瀏覽器上使用。用於 JavaScript 的 ArcGIS API 的未來版本可能會在非安全上下文中顯式禁用遊戲手柄函數。
處理事件
當用戶與 MapView 交互時,他們的操作會觸發您可以偵聽和響應的事件。例如,您可以監聽用戶將鼠標移到Map上並顯示鼠標位置的坐標。這稱為pointer-move 事件。有關所有事件的列表,請參閱MapView 事件部分。
請務必注意,某些事件是相互依賴的,並且用戶交互的時間可能會影響觸發的事件類型。例如,單擊一次會觸發一係列事件:當用戶按下鼠標按鈕時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 示例,以可視化與視圖交互時觸發的不同事件。
相關用法
- JavaScript ArcGIS MapView double-click事件用法及代碼示例
- JavaScript ArcGIS MapView.constraints用法及代碼示例
- JavaScript ArcGIS MapView.takeScreenshot用法及代碼示例
- JavaScript ArcGIS MapView.when用法及代碼示例
- JavaScript ArcGIS MapView.highlightOptions用法及代碼示例
- JavaScript ArcGIS MapView layerview-create事件用法及代碼示例
- JavaScript ArcGIS MapView.extent用法及代碼示例
- JavaScript ArcGIS MapView.whenLayerView用法及代碼示例
- JavaScript ArcGIS MapView click事件用法及代碼示例
- JavaScript ArcGIS MapView.scale用法及代碼示例
- JavaScript ArcGIS MapView pointer-move事件用法及代碼示例
- JavaScript ArcGIS MapView.toScreen用法及代碼示例
- JavaScript ArcGIS MapView.navigation用法及代碼示例
- JavaScript ArcGIS MapView.animation用法及代碼示例
- JavaScript ArcGIS MapView.widthBreakpoint用法及代碼示例
- JavaScript ArcGIS MapView.input用法及代碼示例
- JavaScript ArcGIS MapView.fatalError用法及代碼示例
- JavaScript ArcGIS MapView.hitTest用法及代碼示例
- JavaScript ArcGIS MapView.destroy用法及代碼示例
- JavaScript ArcGIS MapView.background用法及代碼示例
- JavaScript ArcGIS MapView.spatialReference用法及代碼示例
- JavaScript ArcGIS MapView.breakpoints用法及代碼示例
- JavaScript ArcGIS MapView.tryFatalErrorRecovery用法及代碼示例
- JavaScript ArcGIS MapView layerview-create-error事件用法及代碼示例
- JavaScript ArcGIS MapView hold事件用法及代碼示例
注:本文由純淨天空篩選整理自arcgis.com大神的英文原創作品 MapView。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。