Extrusion is the process of stretching a flat, 2D shape vertically to create a 3D object in a scene. For example, you can extrude building polygons by a height value to create three-dimensional building shapes.
How to use the sample
Press the button to switch between using population density and total population for extrusion. Higher extrusion directly corresponds to higher attribute values.
How it works
Create a ServiceFeatureTable from a URL.
Create a feature layer from the service feature table.
Make sure to set the rendering mode to dynamic, setRenderingMode(FeatureRenderingMode::Dynamic).
Apply a SimpleRenderer to the feature layer.
Set ExtrusionMode of render, renderer::sceneProperties()::setExtrusionMode(ExtrusionMode::AbsoluteHeight).
Set extrusion expression of renderer, renderer::getSceneProperties()::setExtrusionExpression("[POP2007] / 10").
Relevant API
ExtrusionExpression
ExtrusionMode
FeatureLayer
FeatureRenderingMode
SceneProperties
ServiceFeatureTable
SimpleRenderer
Tags
3D, extrude, extrusion, extrusion expression, height, renderer, scene
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
// [WriteFile Name=FeatureLayerExtrusion, Category=Scenes]// [Legal]// Copyright 2017 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.// [Legal]#ifdef PCH_BUILD#include"pch.hpp"#endif// PCH_BUILD#include"FeatureLayerExtrusion.h"#include"FeatureLayer.h"#include"ServiceFeatureTable.h"#include"ArcGISTiledElevationSource.h"#include"Scene.h"#include"SceneQuickView.h"#include"Point.h"#include"SimpleLineSymbol.h"#include"SimpleFillSymbol.h"#include"SimpleRenderer.h"#include"RendererSceneProperties.h"#include"Camera.h"#include"MapTypes.h"#include"SymbolTypes.h"#include"Surface.h"#include"ElevationSourceListModel.h"#include"RendererSceneProperties.h"#include"LayerListModel.h"#include"SceneViewTypes.h"#include"SpatialReference.h"#include"Viewpoint.h"usingnamespace Esri::ArcGISRuntime;
FeatureLayerExtrusion::FeatureLayerExtrusion(QQuickItem* parent /* = nullptr */):
QQuickItem(parent),
// define line and fill symbols for a simple rendererm_lineSymbol(newSimpleLineSymbol(SimpleLineSymbolStyle::Solid, QColor("Black"), 1.0f, this)),
m_fillSymbol(newSimpleFillSymbol(SimpleFillSymbolStyle::Solid, QColor("Blue"), m_lineSymbol, this)),
m_renderer(newSimpleRenderer(m_fillSymbol, this))
{
// set renderer extrusion mode to absolute to prevent clipping RendererSceneProperties props = m_renderer->sceneProperties();
props.setExtrusionMode(ExtrusionMode::AbsoluteHeight);
props.setExtrusionExpression("[POP2007] / 10");
m_renderer->setSceneProperties(props);
}
voidFeatureLayerExtrusion::init(){
// Register classes for QML qmlRegisterType<SceneQuickView>("Esri.Samples", 1, 0, "SceneView");
qmlRegisterType<FeatureLayerExtrusion>("Esri.Samples", 1, 0, "FeatureLayerExtrusionSample");
}
voidFeatureLayerExtrusion::componentComplete(){
QQuickItem::componentComplete();
// Create the feature service to use m_featureTable = newServiceFeatureTable(QUrl("https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3"), this);
// add the service feature table to a feature layer m_featureLayer = newFeatureLayer(m_featureTable, this);
// set the feature layer to render dynamically to allow extrusion m_featureLayer->setRenderingMode(FeatureRenderingMode::Dynamic);
// set the simple renderer to the feature layer m_featureLayer->setRenderer(m_renderer);
// Create a scene and give it to the SceneView m_sceneView = findChild<SceneQuickView*>("sceneView");
Scene* scene = newScene(BasemapStyle::ArcGISImageryStandard, this);
Surface* surface = newSurface(this);
surface->elevationSources()->append(
newArcGISTiledElevationSource(
QUrl("https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer"),
this));
scene->setBaseSurface(surface);
scene->operationalLayers()->append(m_featureLayer);
// set initial viewpointconstdouble distance = 12940924;
const Point lookAtPoint(-99.659448, 20.513652, distance, SpatialReference::wgs84());
const Camera camera(lookAtPoint, 0, 15, 0);
const Viewpoint initialVp(lookAtPoint, distance, camera);
scene->setInitialViewpoint(initialVp);
// apply initial extrusiontotalPopulation();
m_sceneView->setArcGISScene(scene);
}
voidFeatureLayerExtrusion::popDensity(){
// multiply population density by 5000 to make data legible RendererSceneProperties props = m_renderer->sceneProperties();
props.setExtrusionExpression("([POP07_SQMI] * 5000) + 100000");
m_renderer->setSceneProperties(props);
}
voidFeatureLayerExtrusion::totalPopulation(){
// divide total population by 10 to make data legible RendererSceneProperties props = m_renderer->sceneProperties();
props.setExtrusionExpression("[POP2007] / 10");
m_renderer->setSceneProperties(props);
}