View on GitHub Sample viewer app

Display an ArcGIS scene layer from a URL.

Screenshot of add scene layer from service

Use case

Adding a scene layer from a URL allows you to author the scene layer elsewhere in the platform, such as with ArcGIS Pro or CityEngine, and then add that scene layer to a scene in ArcGIS Maps SDK for Kotlin. 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 by passing in the URL to a scene layer service.
  2. Create an ArcGISScene and add the scene layer to its operational layers.
  3. Create a Surface and add an ArcGISTiledElevationSource to it.
  4. Set the surface as the scene’s base surface.
  5. Set the scene’s initial viewpoint to center the scene view on the scene layer.
  6. Display the scene in a SceneView composable.

Relevant API

  • ArcGISScene
  • ArcGISSceneLayer
  • ArcGISTiledElevationSource
  • 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

MainActivity.kt MainActivity.kt AddSceneLayerFromServiceViewModel.kt AddSceneLayerFromServiceScreen.kt
/* Copyright 2025 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.arcgismaps.sample.addscenelayerfromservice
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import com.arcgismaps.ApiKey
import com.arcgismaps.ArcGISEnvironment
import com.esri.arcgismaps.sample.sampleslib.theme.SampleAppTheme
import com.esri.arcgismaps.sample.addscenelayerfromservice.screens.AddSceneLayerFromServiceScreen
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// authentication with an API key or named user is
// required to access basemaps and other location services
ArcGISEnvironment.apiKey = ApiKey.create(BuildConfig.ACCESS_TOKEN)
enableEdgeToEdge()
setContent {
SampleAppTheme {
AddSceneLayerFromServiceApp()
}
}
}
@Composable
private fun AddSceneLayerFromServiceApp() {
Surface(color = MaterialTheme.colorScheme.background) {
AddSceneLayerFromServiceScreen(
sampleName = getString(R.string.add_scene_layer_from_service_app_name)
)
}
}
}