Skip to content

Add point cloud layer from file

View on GitHub

Display local 3D point cloud data.

Image of add point cloud layer from file

Use case

Point clouds are often used to visualize massive sets of sensor data such as lidar. The point locations indicate where the sensor data was measured spatially, and the color or size of the points indicate the measured/derived value of the sensor reading. In the case of lidar, the color of the visualized point could be the color of the reflected light, so that the point cloud forms a true color 3D image of the area.

Point clouds can be loaded offline from scene layer packages (.slpk).

How to use the sample

The sample starts with a point cloud layer loaded and draped on top of a scene. Pan and zoom to explore the scene and see the detail of the point cloud layer.

How it works

  1. Create a PointCloudLayer with the path to a local .slpk file containing a point cloud layer.
  2. Add the layer to a scene's operational layers collection.

Relevant API

  • PointCloudLayer

About the data

This point cloud data comes from Balboa Park in San Diego, California. Created and provided by USGS.

Tags

3D, lidar, point cloud

Sample Code

add_point_cloud_layer_from_file.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// 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
//
//   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 'dart:io';

import 'package:arcgis_maps/arcgis_maps.dart';
import 'package:arcgis_maps_sdk_flutter_samples/common/common.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';

class AddPointCloudLayerFromFile extends StatefulWidget {
  const AddPointCloudLayerFromFile({super.key});

  @override
  State<AddPointCloudLayerFromFile> createState() =>
      _AddPointCloudLayerFromFileState();
}

class _AddPointCloudLayerFromFileState extends State<AddPointCloudLayerFromFile>
    with SampleStateSupport {
  // Create a controller for the scene view.
  final _sceneViewController = ArcGISSceneView.createController();

  // A flag for when the scene view is ready.
  var _ready = false;
  // The download progress of the sample data.
  var _downloadProgress = 0.0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          ArcGISSceneView(
            controllerProvider: () => _sceneViewController,
            onSceneViewReady: onSceneViewReady,
          ),
          // Display a progress indicator and prevent interaction until state is ready.
          Visibility(
            visible: !_ready,
            child: Center(
              child: Column(
                spacing: 10,
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  CircularProgressIndicator(
                    value: _downloadProgress,
                    backgroundColor: Colors.white,
                    valueColor: const AlwaysStoppedAnimation<Color>(
                      Colors.blue,
                    ),
                  ),
                  Text(
                    'Downloading sample data ${(_downloadProgress * 100).toStringAsFixed(0)}%',
                    style: const TextStyle(
                      color: Colors.white,
                      fontSize: 12,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }

  Future<void> onSceneViewReady() async {
    // Add the scene to the view controller.
    _sceneViewController.arcGISScene = _setupScene();

    // Load the point cloud layer.
    await loadCloudPointLayerFromFile();
  }

  ArcGISScene _setupScene() {
    // Create a scene with an imagery basemap style.
    final scene = ArcGISScene.withBasemapStyle(BasemapStyle.arcGISImagery);

    // Set the scene's initial viewpoint.
    scene.initialViewpoint = Viewpoint.withPointScaleCamera(
      center: ArcGISPoint(x: 0, y: 0),
      scale: 1,
      camera: Camera.withLatLong(
        latitude: 32.720195,
        longitude: -117.155593,
        altitude: 1050,
        heading: 23,
        pitch: 70,
        roll: 0,
      ),
    );

    // 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);

    return scene;
  }

  Future<void> loadCloudPointLayerFromFile() async {
    // Download the sample data.
    // Get the temp directory.
    final directory = await getApplicationDocumentsDirectory();
    // Create a file reference to the scene layer package for Balboa Park, San Diego, CA.
    final sanDiegoPointCloudFile = File(
      '${directory.absolute.path}/sandiego-north-balboa-pointcloud.slpk',
    );
    if (!sanDiegoPointCloudFile.existsSync()) {
      // If the file does not exist, download it.
      await downloadSampleDataWithProgress(
        itemIds: ['34da965ca51d4c68aa9b3a38edb29e00'],
        destinationFiles: [sanDiegoPointCloudFile],
        onProgress: (progress) {
          setState(() => _downloadProgress = progress);
        },
      );
    }

    // Create a Point Cloud Layer from the file URI.
    final pointCloudLayer = PointCloudLayer.withUri(sanDiegoPointCloudFile.uri);
    await pointCloudLayer.load();
    // Add the point cloud layer to the map's operational layers.
    _sceneViewController.arcGISScene?.operationalLayers.add(pointCloudLayer);
    // Set the ready state variable to true to enable the sample UI.
    setState(() => _ready = true);
  }
}

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