Display an ArcGIS scene layer from a URL.

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
- Create an
ArcGISScene. - Create an
ArcGISTiledElevationSourceobject and add it to the scene’s base surface. - Create an
ArcGISSceneLayerpassing in the URL to a scene layer service. - Add the scene layer to the scene’s operational layers.
Relevant API
- ArcGISScene
- ArcGISSceneLayer
- ArcGISTiledElevationSource
About the data
This sample shows data from Esri 3D Buildings in Portland, Oregon.
Tags
3D, buildings, model, Portland, scene, service, URL
Sample Code
// Copyright 2026 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 'package:arcgis_maps/arcgis_maps.dart';import 'package:arcgis_maps_sdk_flutter_samples/common/common.dart';import 'package:flutter/material.dart';
class AddSceneLayerFromService extends StatefulWidget { const AddSceneLayerFromService({super.key});
@override State<AddSceneLayerFromService> createState() => _AddSceneLayerFromServiceState();}
class _AddSceneLayerFromServiceState extends State<AddSceneLayerFromService> with SampleStateSupport { // Create a controller for the scene view. final _sceneViewController = ArcGISSceneView.createController();
@override Widget build(BuildContext context) { return Scaffold( // Add a scene view to the widget tree and set a controller. body: ArcGISSceneView( controllerProvider: () => _sceneViewController, onSceneViewReady: onSceneViewReady, ), ); }
void onSceneViewReady() { // Create a scene with the imagery basemap style. final scene = ArcGISScene.withBasemapStyle(BasemapStyle.arcGISImagery); _sceneViewController.arcGISScene = scene;
// Add surface elevation to the scene. final elevationSource = ArcGISTiledElevationSource.withUri( Uri.parse( 'https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer', ), ); scene.baseSurface.elevationSources.add(elevationSource);
// Add a scene layer from a service URL. final sceneLayer = ArcGISSceneLayer.withUri( Uri.parse( 'https://basemaps3d.arcgis.com/arcgis/rest/services/Esri3D_Buildings_v1/SceneServer', ), ); scene.operationalLayers.add(sceneLayer);
// Create a camera showing Portland, Oregon. final location = ArcGISPoint( x: -122.670, y: 45.517, z: 175, spatialReference: .wgs84, ); final camera = Camera.withLocation( location: location, heading: 215, pitch: 75, roll: 0, );
// Set the viewpoint of the scene using the camera. _sceneViewController.setViewpointCamera(camera); }}