Skip to content

A BuildingSceneLayer allows you to display and analyze detailed building models created from 3D BIM data. These building models are usually exported from Building Information Modeling (BIM) projects. Unlike 3D object scene layers, which represent all features within a single layer, building scene layers are organized into a hierarchy of sublayers representing individual building components such as walls, light fixtures, and mechanical systems. These sublayers are often grouped by disciplines like architecture, structural, or mechanical. This structure enables deeper interaction and analysis of both interior and exterior features, providing insight into how a building is designed, used, and situated in its spatial context.

Local scene displaying the interior of a building.

Structure

Building scene layers visualize complex digital models of buildings and allow you to interact with all the components of the building such as walls, light fixtures, and mechanical systems. Due to the high complexity, the data in BuildingSceneLayer is organized into a hierarchy of building sublayers. The sublayers of the building scene layer are:

  • An overview sublayer: contains just the building components necessary to visualize the exterior shell of the building. In cases where viewing the interior features of a building are not required, the overview sublayer provides a means to quickly visualize the building's exterior. The overview sublayer is optional and may not exist for every building scene layer. When it is present the overview is built during the creation of the underlying model, which is usually made up of building components on the outside of the model merged into a single feature.

    Exterior shell of a building.
  • A full model sublayer: contains all building components that are organized into a hierarchy of sublayers, grouped by discipline such as architectural, mechanical, or structural.

    A detailed building interior and its components.

Due to the complexity of the building scene layer, the data in this layer is organized using BuildingSublayer to represent a building component (BuildingComponentSublayer) or a group of components (BuildingGroupSubLayer).

  • BuildingComponentSublayer: a sublayer that contains 3D object or point features representing building components like doors, pipes, or air conditioning units. The buildling component sublayer contains data that can be rendered in the view.

  • BuildingGroupSubLayer: a group that manages a hierarchy of sublayers. Used to group building component sublayers into disciplines (for example, architectural, mechanical, or structural); however, this sublayer could contain the building component data in this group and additional groups.

The building scene layer often contains an overview building component sublayer that can be loaded to display the exterior shell of a building. This provides a preview of the entire building without loading all interior features. The building scene layer might also contain a full model building group sublayer with all the features in a building grouped by disciplines. Each discipline is a building group sublayer containing building component sublayers with features such as rooftops, walls, doors, air conditioning units, lighting fixtures, columns, or foundations.

Add buildings to local scene view

Building data coming from a Revit or from IFC files can be imported and published as a scene service using ArcGIS Pro version 2.3. To add a building scene layer to a local scene view, create the building scene layer with a link to the portal item.

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
// Initialize the building scene layer.
final buildingSceneLayer = BuildingSceneLayer.withUri(
  Uri.parse(
    'https://www.arcgis.com/home/item.html?id=669f6279c579486eb4a0acc7eb59d7ca',
  ),
);

// Load the building scene layer.
await buildingSceneLayer.load();

Extract the sublayer for the building overview and set the visibility on the layer as true.

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
// Extract the overview model sublayer from the building scene layer.
overviewSublayer = buildingSceneLayer.sublayers.firstWhere(
  (sublayer) => sublayer.name == 'Overview',
);

// Turn the visibility on for the overview model layer.
// "showFullModelFlag" is a boolean flag used to indicate if the app is displaying
// the full model or overview sublayer.
overviewSublayer.isVisible = showFullModelFlag;

Similar logic can be utilized to retrieve the full model sublayer. Depending on your application requirements, you can provide some sort of toggle between the two layers so only the overview or full model layer is displayed at a time.

Lastly, you need to add the building scene layer as an operational layer to the scene, then take the scene and attach it to the view to display on the map.

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
// Add the building scene layer to the scene.
scene.operationalLayers.add(buildingSceneLayer);

// Add the Scene to the LocalSceneViewController.
localSceneViewController.arcGISScene = scene;

Visualization

Being able to visualize detailed building information in its spatial context and landscape is a useful capability. To extract even more information from the visualization, attribute driven renderers can be assigned to a BuildingComponentSublayer.renderer. For example, the Doors sublayer can use a UniqueValueRenderer to render all the interior doors that need replacement with a red color. For more details, see Symbols, renderers, and styles topic to investigate different renderers that can be applied to data.

Interior doors that need replacement with a red color.

Filtering data

Features in a building scene layer often obstruct one another. Attribute based filtering can be used to display only the features that satisfy a certain SQL expression. Use BuildingFilter to filter features based on their attributes. A building filter uses BuildingFilterBlock to define conditions for displaying or hiding components. Only a single filter block may apply to a feature at a time and the order of the filter blocks influences the order in which the filter blocks are applied. For example, it is common to filter floors within a building scene to display the selected floor with its original texture (BuildingSolidFilterMode) while displaying the floors below the selected floor with a semi-transparent white color, referred to as an xray view (BuildingXrayFilterMode).

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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
// Build a building filter to show the selected floor and an xray view of the floors below.
// Floors above the selected floor are not shown at all.
final buildingFilter = BuildingFilter(
  name: 'Floor filter',
  description: 'Show selected floor and xray filter for lower floors.',
  blocks: [
    // Display the selected floor with the original texture
    // defined in the building scene layer.
    BuildingFilterBlock(
      title: 'solid block',
      whereClause: 'BldgLevel = $_selectedFloor',
      mode: BuildingSolidFilterMode(),
    ),

    // Display the floors below the selected floor using
    // an xray view.
    BuildingFilterBlock(
      title: 'xray block',
      whereClause: 'BldgLevel < $_selectedFloor',
      mode: BuildingXrayFilterMode(),
    ),
  ],
);

// Apply the filter to the building scene layer.
buildingSceneLayer.activeFilter = buildingFilter;

Identify features

It can be helpful to allow users working with a building scene layer to identify features and display the associated attribute information.

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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
// Identify features on the building scene layer at a given location.
final identifyResult = await _localSceneViewController.identifyLayer(
  // Pass in the building scene layer.
  buildingSceneLayer,

  // Pass the location where you want to identify features.
  screenPoint: point,

  // Stipulate how precise the identify operation should be.
  tolerance: 12,
);

// Select the first identified feature and show the feature details in a popup.
if (identifyResult.sublayerResults.isNotEmpty) {
  final sublayerResult = identifyResult.sublayerResults.first;

  if (sublayerResult.geoElements.isNotEmpty) {
    // Retrieve the first feature identified at the stipulated location.
    final identifiedFeature = sublayerResult.geoElements.first as Feature;

    // Retrieve the building scene layer's component sub layer.
    final sublayer =
        sublayerResult.layerContent as BuildingComponentSublayer;

    // Select the identified feature for visual feedback.
    sublayer.selectFeature(identifiedFeature);

    // Using Flutter's toolkit PopupView widget to display a pop-up for
    // the identified feature.
    if (mounted) {
      // Create a pop-up definition with the identified feature. The name
      // of the attribute is used for the title if a value is available.
      final popupDefinition =
          PopupDefinition.withGeoElement(identifiedFeature)
            ..title = identifiedFeature.attributes['name'] as String? ?? '';

      // A modal bottom sheet was used as an alternative to a menu or dialog
      // to prevent the user from interacting with the rest of the app while
      // the pop-up information is displayed. Other approaches can be utilized
      // depending on your application requirements.
      showModalBottomSheet<void>(
        context: context,
        isScrollControlled: true,
        useSafeArea: true,
        builder: (_) => SizedBox(
          height: MediaQuery.sizeOf(context).height * 0.7,
          // Flutter's toolkit widget, PopupView, is used to display the pop-up
          // for the identified feature.
          child: PopupView(
            // Pass a new pop-up with the identified feature
            // and definition defined earlier.
            popup: Popup(
                geoElement: identifiedFeature,
                popupDefinition: popupDefinition),
            onClose: () => Navigator.of(context).maybePop(),
          ),
        ),
      );
    }
  }
}

Querying

Querying a BuildingComponentSublayer retrieves results from the attributes in the associated feature layer. Queries on the component sublayer are important because they are made on all the features in the component sublayer.

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