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


JavaScript ArcGIS SceneLayer用法及代碼示例

基本信息

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

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

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

類: esri/layers/SceneLayer

繼承: SceneLayer > Layer > Accessor

自從:用於 JavaScript 4.0 的 ArcGIS API

用法說明

概述

SceneLayer 是一種圖層類型,專為 on-demand 流式傳輸並在 SceneView 中顯示大量數據而設計。 SceneLayers 支持兩種幾何類型:Point 和 3D 對象(例如建築物)。

san-francisco-buildings

您可以在 searching the gallery 的 ArcGIS Online 中找到許多 SceneLayers 的樣本。

city-scene-layer-guide

發布SceneLayer

SceneLayer 顯示來自 Scene Service 的數據。場景服務可以以適合網絡流的開放格式保存大量特征。 SceneLayer 逐漸加載這些特征,從粗略的表示開始,並根據close-up 視圖的需要將它們細化到更高的細節。

scenelayer-ny

場景服務可以托管在ArcGIS在線或者ArcGIS企業通過上傳場景圖層包 (.slpk) 或從 ArcGIS Pro 發布。根據您發布 SceneLayer 的方式,有兩種類型的圖層:SceneLayers 具有關聯的要素圖層SceneLayers 僅具有緩存屬性.有關更多信息,請參閱場景圖層指南主題的發布部分.

場景服務由 ArcGIS 服務器 REST 資源的 URL 或 PortalItem 標識:

let sceneLayer = new SceneLayer({
  url: "https://scene.arcgis.com/arcgis/rest/services/Hosted/Building_Hamburg/SceneServer/layers/0"
});
let sceneLayer = new SceneLayer({
 portalItem: {
   id: "6fce72d1a3df4b309a317f1e2faae05e"
 }
});

大多數時候,最好從門戶項目而不是場景服務 URL 創建 SceneLayer,因為有關關聯要素服務的信息存儲在項目級別而不是服務級別。

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

盡管顯示 SceneLayer 的內部邏輯在技術上很先進,但它在 API 中的使用遵循與其他層相同的模型。您可以使用渲染器設置 SceneLayer 的樣式,並使用彈出窗口來檢索屬性信息並將其顯示給用戶。

數據可視化

就像其他層一樣,SceneLayers 可以使用渲染器進行可視化。可以使用 MeshSymbol3D 設置 3D 對象的樣式。可以將 FillSymbol3DLayer 添加到 MeshSymbol3D 以從 SceneLayer 可視化 3D 對象:

let symbol = {
  type: "mesh-3d",  // autocasts as new MeshSymbol3D()
  symbolLayers: [{
    type: "fill",  // autocasts as new FillSymbol3DLayer()
    material: { color: "red" }
  }]
};

sceneLayer.renderer = {
  type: "simple",  // autocasts as new SimpleRenderer()
  symbol: symbol
};

SceneLayers 還支持 visual variables ,這使您可以輕鬆地以連續顏色可視化圖層中的數字數據。例如,下圖中使用的服務表示包含數字屬性的建築物特征,該數字屬性存儲每棟建築物中的居民數量。圖層的渲染器使用顏色視覺變量根據給定字段的值沿連續的白色到藍色漸變對每個要素進行著色。白色特征表示距離公共交通站較遠的建築物,深藍色特征表示非常接近的建築物(步行時間不到 1 分鍾)。值介於低值和高值之間的建築物被分配中間顏色。為了提高對 3D 對象場景層形狀的感知,還可以使用 edges 將它們可視化。請參閱 Visualization overview 主題以了解有關數據可視化技術的更多信息。

scenelayer-edges

visual variables 的數據驅動可視化中使用的屬性必須可由 SceneLayer's cache 訪問。對於僅具有緩存屬性的 SceneLayers 和具有關聯要素圖層的 SceneLayer,屬性值都來自緩存。因此,如果要素圖層上的屬性發生更改,則可視化將不會更新。將緩存屬性的數量保持在最低限度可以提高 SceneLayer 的性能。因此,最佳做法是明智地使用您通過圖層緩存提供的屬性。

過濾數據

SceneLayers 可以使用 SQL where 子句進行過濾。過濾是通過definitionExpression 屬性實現的。此屬性在客戶端上使用 SceneLayer 緩存屬性進行評估,並且僅支持 standardized SQL

let layer = new SceneLayer({
 url: "http://scene.arcgis.com/arcgis/rest/services/Hosted/Building_Hamburg/SceneServer/layers/0",
 definitionExpression: "usage = 'Residential' AND totalHeight < 5"
});

另一種過濾數據的方法是在 SceneLayerView 上使用 FeatureFilter。這將隻顯示滿足過濾條件的特征。設置 geometryspatialRelationship 允許您根據與傳入幾何的空間關係過濾要素。目前僅支持 containsintersectsdisjoint 類型的空間關係。

有關詳細信息,請參閱 Filter features by geometry with SceneLayer 示例。

彈出窗口

點和 3D 對象 SceneLayers 可以使用 popupTemplate 屬性自定義彈出內容。具有關聯要素圖層的 SceneLayer 將查詢關聯要素圖層的屬性。對於僅具有緩存屬性的SceneLayer,屬性來自緩存。還支持 popupTemplate 中 expressionInfo 的 Arcade 表達式。

custom-popups

查詢

SceneLayer 和 SceneLayerView 都支持查詢,但行為不同。

查詢 SceneLayer 將從關聯要素圖層中的屬性中檢索結果。如果圖層沒有關聯的要素圖層,則查詢將被拒絕並出現錯誤。圖層上的查詢函數強大,因為它們是基於SceneLayer 中的所有函數進行的,並且它們還支持高級查詢。當 spatialRelationship 設置為 intersectscontainsdisjoint 時,支持空間查詢。

要在 SceneLayerView 上進行基於屬性的查詢,您需要在 SceneLayer 的 outFields 屬性中指定必填字段,以確保客戶端上的屬性值可用於查詢。您可以使用 availableFields 檢查客戶端上可用的字段。在SceneLayerView 上,可以通過設置查詢的geometryspatialRelationship 來進行空間查詢。請注意,對於 3D 對象 SceneLayers,這些空間關係是基於 Extent 而不是要素的足跡進行評估的。 SceneLayerView 上的查詢返回視圖中當前加載的要素的結果。

查詢方式 SceneLayer(僅在具有關聯要素圖層時才有效) SceneLayerView(適用於所有場景圖層)
queryExtent 返回二維程度全部滿足查詢的特征 返回3D程度當前加載滿足查詢的特征
queryFeatureCount 返回數量全部滿足查詢的特征 返回數量當前加載滿足查詢的特征
queryFeatures 返回全部滿足查詢的特征 返回當前加載滿足查詢的特征
queryObjectIds 返回 objectIds 的全部滿足查詢的特征 返回的 objectIds當前加載滿足查詢的特征

已知限製

  • 空間查詢與 projection engine 文檔中列出的限製相同。
  • 在計算與 query geometry 的空間關係時,空間查詢使用要素的 Extent 而不是足跡。這意味著可能會從查詢中返回一個要素,即使它的足跡與幾何圖形沒有空間關係。
  • 目前在空間 queries 上僅支持 intersectscontainsdisjoint spatialRelationships
  • 如果 SceneLayer 具有以下任何一項,則當前不支持空間查詢SpatialReference
    • GDM 2000 (4742) - 馬來西亞
    • Gsterberg (Ferro) (8042) - 奧地利/捷克共和國
    • ISN2016 (8086) - 冰島
    • SVY21 (4757) - 新加坡

獲取SceneLayers的幾何/範圍

3D 對象 SceneLayers 不返回原始幾何圖形,因為這是二進製格式。要獲取空間信息,您可以查詢 SceneLayer 中要素的 2D 範圍或 3D 範圍。可以使用 SceneLayer 上的 queryExtent() 方法檢索所有要素(甚至尚未加載的要素)的 2D 範圍。僅當圖層具有關聯的要素圖層時,此方法才會成功。隻能通過使用 SceneLayerView 上的 queryExtent() 方法來查詢 3D 範圍以獲取已加載的要素。

當在任何查詢方法上將returnGeometry設置為true時,點SceneLayers返回幾何圖形。此外,可以使用 SceneLayer 上的 queryExtent() 檢索多個點的 2D 範圍。僅使用緩存屬性無法獲取 SceneLayer 的範圍。

編輯:屬性更新

目前,僅場景圖層上的applyEdits 方法支持屬性更新。可編輯SceneLayer 的先決條件是關聯的FeatureLayer 啟用了編輯和更改跟蹤。有關發布的詳細信息,請參閱 Publishing section of the scene layer guide topic 。具有已編輯屬性的要素將使用更新的屬性進行渲染,直到已編輯要素的數量超過 50,000。之後,不會檢索已編輯的屬性,而是使用緩存的過時屬性呈現特征。 Rebuild the cache 用於達到此最大數量之前的場景圖層。

場景圖層屬性更新的一個用例是更改狀態和類型,請查看此示例:Sample - SceneLayer attribute editing 在此示例中,可編輯要素圖層共享給所有人。因此,每個人都可以修改這些數據。在實際用例中,隻有經過授權的編輯者才能編輯圖層。在這種情況下,關聯的要素圖層不會公開共享,隻能由編輯者訪問。要使編輯對場景圖層用戶可見,有必要 rebuild the cache

相關用法


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