Display custom labels in a 3D scene.
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
- Create an
AGSScene
using a URL. - Assign the scene to an
AGSSceneView
and load it. - After loading is complete, obtain the
AGSFeatureLayer
from the scene'soperationalLayers
property. - Set the feature layer's
labelsEnabled
property totrue
. - Create an
AGSTextSymbol
to use for displaying the label text. - Create an
AGSLabelDefinition
using anAGSArcadeLabelExpression
. - 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
// 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 "Gas Main" feature layer.
if let groupLayer = scene.operationalLayers.lazy.compactMap({ $0 as? AGSGroupLayer }).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"]
}
}