Skip To Content ArcGIS for Developers Sign In Dashboard

ArcGIS Runtime SDK for Qt

Feature layer extrusion

Sample Viewer View Sample on GitHub

Extrude features based on their attributes.

Use case

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

  1. Create a ServiceFeatureTable from a URL.
  2. Create a feature layer from the service feature table.
  • Make sure to set the rendering mode to dynamic: FeatureLayer.renderingMode: Enums.FeatureRenderingModeDynamic.
  1. Apply a SimpleRenderer to the feature layer.
  2. Set ExtrusionMode of render: RendererSceneProperties.extrusionMode: Enums.ExtrusionModeAbsoluteHeight.
  3. Set extrusion expression of renderer: RendererSceneProperties.extrusionExpression: "[POP2007] / 10".

Relevant API

  • extrusionExpression
  • ExtrusionMode
  • FeatureLayer
  • FeatureRenderingMode
  • RendererSceneProperties
  • ServiceFeatureTable
  • SimpleRenderer

Tags

3D, extrude, extrusion, extrusion expression, height, renderer, scene

Sample Code

import QtQuick 2.6
import QtQuick.Controls 2.2
import Esri.ArcGISRuntime 100.9

Rectangle {
    id: rootRectangle
    clip: true
    width: 800
    height: 600    

    SceneView {
        id: sceneView
        anchors.fill: parent        

        Scene {
            id: scene
            BasemapImagery {}

            ServiceFeatureTable {
                id: featureTable
                url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3"
            }

            FeatureLayer {
                id: featureLayer
                featureTable: featureTable
                renderingMode: Enums.FeatureRenderingModeDynamic
                renderer: renderer
            }

            Surface {
                id: baseSurface
                ArcGISTiledElevationSource {
                    url: "https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer"
                }
            }

            ViewpointCenter {
                Point {
                    id: lookAtPoint
                    x: -99.659448
                    y: 20.513652
                    z: 12940924
                    spatialReference: SpatialReference { wkid: 4326 }
                }
                targetScale: 12940924

                Camera {
                    id: initialCamera
                    location: lookAtPoint
                    roll: 0
                    pitch: 15
                    heading: 0
                }
            }
        }

        // combo box to update the extrusion
        ComboBox {
            id: popCombo
            anchors {
                top: parent.top
                left: parent.left
                margins: 10
            }
            property int modelWidth: 0
            width: modelWidth + leftPadding + rightPadding + indicator.width
            model: ["TOTAL POPULATION", "POPULATION DENSITY"]

            onCurrentTextChanged: {
                if (currentText === "TOTAL POPULATION")
                    sceneProperties.extrusionExpression = "[POP2007] / 10";
                else
                    sceneProperties.extrusionExpression = "([POP07_SQMI] * 5000) + 100000";
            }

            Component.onCompleted : {
                for (let i = 0; i < model.length; ++i) {
                    metrics.text = model[i];
                    modelWidth = Math.max(modelWidth, metrics.width);
                }
            }
            TextMetrics {
                id: metrics
                font: popCombo.font
            }
        }

        SimpleRenderer {
            id: renderer
            symbol: fillSymbol
            sceneProperties: sceneProperties
        }

        RendererSceneProperties {
            id: sceneProperties
            extrusionMode: Enums.ExtrusionModeAbsoluteHeight
            extrusionExpression: "[POP2007] / 10"
        }

        SimpleFillSymbol {
            id: fillSymbol
            color: "blue"
            outline: lineSymbol
        }

        SimpleLineSymbol {
            id: lineSymbol
            color: "black"
        }
    }
}