Show labels on layer in 3D

View on GitHubSample 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 ArcGISScene from a PortalItem.
  2. Add the scene to an SceneView and load it.
  3. After loading is complete, obtain the FeatureLayer from one of the GroupLayers in the scene's operationalLayers.
  4. Create an TextSymbol to use for displaying the label text.
  5. Create an LabelDefinition using an ArcadeLabelExpression.
  6. Add the definition to the feature layer's labelDefinitions array.
  7. Set the feature layer's labelsEnabled property to true.

Relevant API

  • ArcadeLabelExpression
  • ArcGISScene
  • FeatureLayer
  • LabelDefinition
  • SceneView
  • TextSymbol

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

MainActivity.kt
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
 * 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.
 *
 */

package com.esri.arcgisruntime.showlabelsonlayerin3d

import android.graphics.Color
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.esri.arcgisruntime.ArcGISRuntimeEnvironment
import com.esri.arcgisruntime.arcgisservices.LabelDefinition
import com.esri.arcgisruntime.arcgisservices.LabelingPlacement
import com.esri.arcgisruntime.layers.FeatureLayer
import com.esri.arcgisruntime.mapping.ArcGISScene
import com.esri.arcgisruntime.mapping.labeling.ArcadeLabelExpression
import com.esri.arcgisruntime.mapping.view.SceneView
import com.esri.arcgisruntime.portal.Portal
import com.esri.arcgisruntime.portal.PortalItem
import com.esri.arcgisruntime.showlabelsonlayerin3d.databinding.ActivityMainBinding
import com.esri.arcgisruntime.symbology.TextSymbol

class MainActivity : AppCompatActivity() {

    private val activityMainBinding by lazy {
        ActivityMainBinding.inflate(layoutInflater)
    }

    private val sceneView: SceneView by lazy {
        activityMainBinding.sceneView
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(activityMainBinding.root)

        ArcGISRuntimeEnvironment.setApiKey(BuildConfig.API_KEY)

        val portal = Portal("https://www.arcgis.com")
        val portalItem = PortalItem(portal, "850dfee7d30f4d9da0ebca34a533c169")

        val scene = ArcGISScene(portalItem)
        scene.addDoneLoadingListener {
            // get "Gas Main" feature layer from the "Gas" layer
            (scene.operationalLayers.first { it.name == "Gas" }
                .subLayerContents.first { it.name == "Gas Main" } as? FeatureLayer)?.let { gasMainFeatureLayer ->
                gasMainFeatureLayer.apply {
                    // clear the existing label definition
                    labelDefinitions.clear()
                    // add the label definition defined in the makeLabelDefinition function
                    labelDefinitions.add(makeLabelDefinition())
                    // enable labels
                    isLabelsEnabled = true
                }
            }
        }

        sceneView.scene = scene
    }

    private fun makeLabelDefinition(): LabelDefinition {
        // make and stylize the text symbol
        val textSymbol = TextSymbol().apply {
            color = getColor(R.color.colorLabels)
            haloColor = Color.WHITE
            haloWidth = 2f
            size = 16f
        }

        // create a label expression to show the installation date in day, month, year format
        val labelExpression = ArcadeLabelExpression("Text(\$feature.INSTALLATIONDATE, `DD MMM YY`)")

        // create and return a label definition
        return LabelDefinition(labelExpression, textSymbol).apply {
            placement = LabelingPlacement.LINE_ABOVE_ALONG
            isUseCodedValues = true
        }
    }

    override fun onPause() {
        sceneView.pause()
        super.onPause()
    }

    override fun onResume() {
        super.onResume()
        sceneView.resume()
    }

    override fun onDestroy() {
        sceneView.dispose()
        super.onDestroy()
    }
}

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