Skip to content

Add scene layer from service

View on GitHub

Display an ArcGIS scene layer from a URL.

Screenshot of Add scene layer from service sample

Use case

Adding a scene layer from a URL allows you to author the scene layer elsewhere in the platform, say with ArcGIS Pro or CityEngine, and then add that scene layer to a scene in ArcGIS Maps SDK. Loading a scene layer from a URL also permits the layer source to change dynamically without updating the code. Each scene layer added to a scene can assist in performing helpful visual analysis. For example, if presenting the results of a shadow analysis of a major metropolitan downtown area in 3D, adding a scene layer of 3D buildings to the scene that could be toggled on/off would help to better contextualize the source of the shadows.

How to use the sample

Pan and zoom to explore the scene.

How it works

  1. Create an ArcGISSceneLayer passing in the URL to a scene layer service.
  2. Create a Scene and add the scene layer to its operational layers.
  3. Create a Surface object and add an ArcGISTiledElevationSource to it.
  4. Set the surface to the scene's base surface.
  5. Create a SceneView with the scene.

Relevant API

  • ArcGISSceneLayer
  • ArcGISTiledElevationSource
  • Scene
  • SceneView
  • Surface

About the data

This sample shows a Portland, Oregon USA Scene hosted on ArcGIS Online.

Tags

3D, buildings, model, scene, service, URL

Sample Code

AddSceneLayerFromServiceView.swift
Use dark colors for code blocksCopy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Copyright 2022 Esri
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import ArcGIS
import SwiftUI

struct AddSceneLayerFromServiceView: View {
    /// A scene with an imagery basemap and a 3D buildings layer.
    @State private var scene: ArcGIS.Scene = {
        // Creates a scene layer using a URL to a scene layer service.
        let sceneLayer = ArcGISSceneLayer(url: .portlandBuildingService)

        // Creates a scene and adds the scene layer to its operational layers.
        let scene = Scene(basemapStyle: .arcGISImagery)
        scene.addOperationalLayer(sceneLayer)

        // Creates an elevation source and adds it to the scene's base surface.
        let elevationSource = ArcGISTiledElevationSource(url: .worldElevationService)
        scene.baseSurface.addElevationSource(elevationSource)

        // Sets the scene's initial viewpoint to center the scene view on the scene layer.
        let point = Point(x: -122.66949, y: 45.51869, z: 227, spatialReference: .wgs84)
        let camera = Camera(location: point, heading: 219, pitch: 82, roll: 0)
        let viewpoint = Viewpoint(latitude: .nan, longitude: .nan, scale: .nan, camera: camera)
        scene.initialViewpoint = viewpoint

        return scene
    }()

    var body: some View {
        // Displays the scene in a scene view.
        SceneView(scene: scene)
    }
}

private extension URL {
    /// The URL of a scene service containing buildings in Portland, OR, USA.
    static var portlandBuildingService: URL {
        URL(string: "https://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/Buildings_Portland/SceneServer")!
    }

    /// The URL of the Terrain 3D ArcGIS REST Service.
    static var worldElevationService: URL {
        URL(string: "https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer")!
    }
}

#Preview {
    AddSceneLayerFromServiceView()
}

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.