Skip to content
View on GitHub

Display an ArcGIS scene layer from a URL.

Image 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, 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

  1. Create an ArcGISScene.
  2. Create an ArcGISTiledElevationSource object and add it to the scene's base surface.
  3. Create an ArcGISSceneLayer passing in the URL to a scene layer service.
  4. 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

add_scene_layer_from_service.dart
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
// 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);
  }
}

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