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


JavaScript ArcGIS FeatureLayer用法及代碼示例


基本信息

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

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

ESM: import FeatureLayer from "@arcgis/core/layers/FeatureLayer";

類: esri/layers/FeatureLayer

繼承: FeatureLayer > Layer > Accessor

自從:用於 JavaScript 4.0 的 ArcGIS API

用法說明

概述

FeatureLayer 是可以從 Map ServiceFeature Service 創建的單層; ArcGIS 在線或ArcGIS 企業門戶項目;或來自一係列客戶端函數。圖層可以是空間的(具有地理特征)或非空間的(表)。

空間圖層由離散要素組成,每個要素都有一個 Geometry,允許其在 2D MapView 或 3D SceneView 中渲染為具有空間上下文的 graphic。特征還包含數據attributes,提供有關其代表的real-world特征的附加信息;屬性可以在彈出窗口中查看並用於rendering圖層。 FeatureLayers 可以被查詢、analyzed 並被渲染以在空間上下文中可視化數據。

非空間層是沒有表示地理特征的空間列的表。

創建FeatureLayer

FeatureLayers 可以通過以下三種方式之一創建:從服務 URL、ArcGIS 門戶項目 ID 或從客戶端函數數組。

引用服務 URL

要從服務創建 FeatureLayer 實例,您必須將 url 屬性設置為要素服務或Map服務中圖層的 REST 端點。為了使圖層在視圖中可見,必須將其添加到視圖引用的Map中。有關向Map添加圖層的信息,請參閱Map.add()

require(["esri/layers/FeatureLayer"], function(FeatureLayer){
  // points to the states layer in a service storing U.S. census data
  const fl = new FeatureLayer({
    url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3"
  });
  map.add(fl);  // adds the layer to the map
});

可以從服務中的表 url 創建非空間表實例,並且必須通過調用 load() 方法加載該表。

// Add a non-spatial table.
require(["esri/layers/FeatureLayer"], function(FeatureLayer){
  // points to the non-spatial table in a service storing San Francisco crime incidents.
  const table = new FeatureLayer({
    url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/SF311/FeatureServer/1"
  });
  table.load().then(function() {
     // table is loaded. ready to be queried on the server.
  });
});

如果從不同的域請求服務,則需要 CORS enabled serverproxy

引用 ArcGIS 門戶項目 ID

如果 ArcGIS Online 或 ArcGIS Enterprise 中作為項目存在,您還可以根據其 ID 創建 FeatureLayer。例如,以下代碼片段顯示如何使用 PortalItem 屬性將新的 FeatureLayer 實例添加到Map。

// points to a hosted Feature Layer in ArcGIS Online
const fl = new FeatureLayer({
  portalItem: {  // autocasts as esri/portal/PortalItem
    id: "8444e275037549c1acab02d2626daaee"
  }
});
map.add(fl);  // adds the layer to the map

以下代碼片段展示了如何使用 PortalItem 屬性創建引用表的FeatureLayer。

// points to a hosted table in ArcGIS Online
const table = new FeatureLayer({
  portalItem: { // autocasts as esri/portal/PortalItem
    id: "123f4410054b43d7a0bacc1533ceb8dc"
  }
});

// Before adding the table to the map, it must first be loaded and confirm it is the right type.
table.load().then(function() {
  if (table.isTable) {
    map.tables.add(table);
  }
});

添加一係列客戶端函數

從版本 4.17 開始,非空間客戶端函數可用於創建 feature layer 表。

客戶端函數也可用於創建函數層。由於 FeatureLayer 需要模式,因此在從 features 數組創建圖層時需要設置多個屬性。如果使用空間圖層,則必須使用 GeometryType 屬性以及有效的空間參考來指示要素的幾何類型(因為每個圖層僅允許一種幾何類型)。空間和非空間要素集合都需要 objectId 字段,這必須與字段對象數組一起指示,提供每個字段的架構。指定這些屬性後,必須將要素數組設置為源屬性。查看create a FeatureLayer with client-side graphics sample 以了解其實際情況。

如果在層初始化時缺少任何必需的參數,API 將嘗試從提供的參數中確定所需的參數。例如,spatialReference、geometryType、hasZ 和 hasM 屬性可以基於提供給源屬性的特征來確定。但是,如果source屬性在初始化時為空數組,則無法確定geometryType,並且該圖層將被拒絕。

FeatureLayer 初始化後,FeatureLayer 的源不會更新。如果在運行時添加、刪除或更新函數,則使用 applyEdits() 更新函數,然後使用 queryFeatures() 返回更新的函數。查看add or remove graphics from a FeatureLayer sample 以了解其實際情況。針對客戶端要素圖層和圖層視圖執行的屬性查詢中使用的屬性值區分大小寫。

const layer = new FeatureLayer({

   // create an instance of esri/layers/support/Field for each field object
   fields: [
   {
     name: "ObjectID",
     alias: "ObjectID",
     type: "oid"
   }, {
     name: "type",
     alias: "Type",
     type: "string"
   }, {
     name: "place",
     alias: "Place",
     type: "string"
   }],
   objectIdField: "ObjectID", // inferred from fields array if not specified
   geometryType: "point", // geometryType and spatialReference are inferred from the first feature
                          // in the source array if they are not specified.
   spatialReference: { wkid: 4326 },
   source: graphics,  //  an array of graphics with geometry and attributes
                     // popupTemplate and symbol are not required in each feature
                     // since those are handled with the popupTemplate and
                     // renderer properties of the layer
   popupTemplate: pTemplate,
   // a default simple renderer will be applied if not set.
   renderer: uvRenderer  // UniqueValueRenderer based on `type` attribute
});
map.add(layer);

查詢

FeatureLayer 中的特征被渲染為 LayerView 中的圖形。因此,視圖中可見的特征是通過 LayerView 而不是 FeatureLayer 訪問的。要訪問視圖中可見的函數,請使用 FeatureLayerView 中的查詢方法。

// returns all the graphics from the layer view
view.whenLayerView(layer).then(function(layerView){
  layerView.watch("updating", function(val){
    if(!val){  // wait for the layer view to finish updating
      layerView.queryFeatures().then(function(results){
        console.log(results);  // prints all the client-side features to the console
      });
    }
  });
});

FeatureLayerView 上的查詢訪問特征時,請注意,特征按視圖中顯示的方式返回,包括可能已應用於特征以增強性能的任何概括。要獲取全分辨率的要素幾何圖形,請在要素圖層上使用queryFeatures()方法。

FeatureLayer 類中的查詢方法直接從服務查詢要素。例如,以下代碼片段返回服務中的所有函數,而不僅僅是 FeatureLayerView 中繪製的函數。

// Queries for all the features in the service (not the graphics in the view)
layer.queryFeatures().then(function(results){
  // prints an array of all the features in the service to the console
  console.log(results.features);
});

有關如何為特定圖層創建LayerView 的信息,請參閱View.whenLayerView()

數據可視化

通過將 Renderer 設置為圖層的渲染器屬性來可視化 FeatureLayer 中的函數。在任何渲染器中,可以使用 SimpleRenderer 使用相同的符號、使用 UniqueValueRenderer 通過類型、使用 ClassBreaksRenderer 進行分類、或者使用 visual variables 使用連續顏色、大小或不透明度方案來可視化要素。符號隻能通過渲染器設置,不能在圖層中的每個圖形上單獨設置。有關要素圖層的各種可視化選項的更多信息,請參閱 Renderer 的文檔和 Creating visualizations manually 指南。

使用上麵提到的FeatureLayer 渲染器和查詢函數,您可以創建動態的交互式數據探索應用程序。

featurelayer-fast-updates

FeatureLayers 也支持 highlight 。當用戶單擊或點擊函數以查看彈出窗口時,默認情況下會啟用此函數。您還可以在FeatureLayerView 上調用highlight() 方法以突出顯示其他工作流中的函數,例如顯示查詢/選擇結果和突出顯示pointer-move 事件的函數。

featurelayer-highlight

已知限製

  • 要素密度非常高的位置可能無法以小比例顯示所有可用要素。
  • 非常大的數據集可能需要很長的初始加載時間,特別是在小規模時。服務器端和客戶端函數切片緩存允許在初始數據下載後更快地加載函數。我們在每個版本中不斷改進我們的函數獲取策略和加載時間效率。

相關用法


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