Show labels on layer in 3D

View on GitHub
Sample viewer app

Display custom labels in a 3D scene.

Show labels on layer in 3D

Use case

Labeling features is useful to visually display information or attributes on a scene. For example, city officials or maintenance crews may want to show installation dates of features of a gas network.

How to use the sample

Pan and zoom to explore the scene. Notice the labels showing installation dates of features in the 3D gas network.

How it works

  1. Create an AGSScene using a URL.
  2. Assign the scene to an AGSSceneView and load it.
  3. After loading is complete, obtain the AGSFeatureLayer from the scene's operationalLayers property.
  4. Set the feature layer's labelsEnabled property to true.
  5. Create an AGSTextSymbol to use for displaying the label text.
  6. Create an AGSLabelDefinition using an AGSArcadeLabelExpression.
  7. Add the definition to the feature layer's labelDefinitions array.

Relevant API

  • AGSArcadeLabelExpression
  • AGSFeatureLayer
  • AGSLabelDefinition
  • AGSScene
  • AGSSceneView
  • AGSTextSymbol

About the data

This sample shows a New York City infrastructure scene hosted on ArcGIS Online.

Tags

3D, arcade, attribute, buildings, label, model, scene, symbol, text, URL, visualization

Sample Code

ShowLabelsOnLayer3DViewController.swift
                                                                                
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Copyright 2021 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
//
//   http://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 UIKit
import ArcGIS

class ShowLabelsOnLayer3DViewController: UIViewController {
    @IBOutlet var sceneView: AGSSceneView! {
        didSet {
            // Set the scene to the scene view.
            sceneView.scene = makeScene()
        }
    }

    func makeScene() -> AGSScene {
        let scene = AGSScene(
            item: AGSPortalItem(
                portal: AGSPortal.arcGISOnline(withLoginRequired: false),
                itemID: "850dfee7d30f4d9da0ebca34a533c169"
            )
        )
        // Load the scene.
        scene.load { [weak self] error in
            guard let self = self else { return }
            // Get the feature layer.
            if let operationalLayers = scene.operationalLayers as? [AGSGroupLayer],
               let groupLayer = operationalLayers.first(where: { $0.name == "Gas" }),
               let layers = groupLayer.layers as? [AGSLayer],
               let gasFeatureLayer = layers.first(where: { $0.name == "Gas Main" }) as? AGSFeatureLayer {
                let labelDefinition = self.makeLabelDefinition()
                // Enable labels on the feature layer.
                gasFeatureLayer.labelsEnabled = true
                // Set the layer's label definitions.
                gasFeatureLayer.labelDefinitions.setArray([labelDefinition])
            } else if let error = error {
                self.presentAlert(error: error)
            }
        }
        return scene
    }

    func makeLabelDefinition() -> AGSLabelDefinition {
        // Make and stylize the text symbol.
        let textSymbol = AGSTextSymbol()
        textSymbol.color = .orange
        textSymbol.haloColor = .white
        textSymbol.haloWidth = 2
        textSymbol.size = 16

        // Create and return a label definition using the text symbol.
        let labelDefinition = AGSLabelDefinition()
        // Set an arcade expression to provide better formatting.
        labelDefinition.expression = AGSArcadeLabelExpression(arcadeString: "Text($feature.INSTALLATIONDATE, `DD MMM YY`)")
        labelDefinition.placement = .lineAboveAlong
        labelDefinition.useCodedValues = true
        labelDefinition.textSymbol = textSymbol

        return labelDefinition
    }

    // MARK: UIViewController

    override func viewDidLoad() {
        super.viewDidLoad()

        // Add the source code button item to the right of navigation bar.
        (navigationItem.rightBarButtonItem as? SourceCodeBarButtonItem)?.filenames = ["ShowLabelsOnLayer3DViewController"]
    }
}

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