當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


JavaScript ArcGIS MapView用法及代碼示例


基本信息

以下是所在類或對象的基本信息。

AMD: require(["esri/views/MapView"], (MapView) => { /* code goes here */ });

ESM: import MapView from "@arcgis/core/views/MapView";

類: esri/views/MapView

繼承: MapView > View > Accessor

自從:用於 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 需要一個中心和比例,以及可選的旋轉。中心和比例源自多個屬性:中心、縮放、比例、範圍或視點。 centerscale 都可以從 extentviewpoint 派生。如果在構造函數中設置了所有屬性,則它們將按照定義的順序應用。例如,比例是從範圍派生的,因此在範圍之後設置比例會覆蓋派生值,而從範圍中心派生的中心保持不變。下表說明了哪些屬性在視圖構造期間具有優先級(被覆蓋的屬性在構造期間不會產生任何影響)。

屬性 覆蓋
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 了解支持的設備。

Gamepad

遊戲手柄動作 MapView 行為
左觸發器 放大
右觸發器 縮小
左搖杆 平移視圖
右搖杆 旋轉視圖
動作形象 SpaceMouse 動作 MapView 行為
3DMousePan 推(左/右/前/後) 平移視圖
3DMousePan 拉起 縮小
3DMousePan 向下推 放大
3DMousePan 順時針旋轉 順時針旋轉視圖
3DMousePan 逆時針旋轉 逆時針旋轉視圖

要禁用遊戲手柄導航,您可以將 view.navigation.gamepad.enabled 設置為 false

注意:

  • 縮放捕捉必須禁用連續縮放。在Map視圖中,snapToZoomtrue默認。
    • 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 應用於立即響應用戶交互。隻有在確保用戶不會再次單擊後才會觸發單擊事件(在這種情況下會觸發雙擊事件)。

Various events

如果是雙擊,則在第一次單擊後會重複相同的事件鏈。但是,如果用戶在接近的時間範圍內第二次單擊,則不再發出單擊事件,但會再次觸發 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 示例,以可視化與視圖交互時觸發的不同事件。

相關用法


注:本文由純淨天空篩選整理自arcgis.com大神的英文原創作品 MapView。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。