Terrain exaggeration

View on GitHub
Sample viewer app

Vertically exaggerate terrain in a scene.

Terrain exaggeration sample

Use case

Vertical exaggeration can be used to emphasize subtle changes in a surface. This can be useful in creating visualizations of terrain where the horizontal extent of the surface is significantly greater than the amount of vertical change in the surface. A fractional vertical exaggeration can be used to flatten surfaces or features that have extreme vertical variation.

How to use the sample

Use the slider to update terrain exaggeration.

How it works

  1. Create an AGSArcGISTiledElevationSource and add it to an AGSSurface.

    • An elevation source defines the terrain based on a digital elevation model (DEM) or digital terrain model (DTM).
  2. Add the surface.

    • The surface visualizes the elevation source.
  3. Configure the surface's elevationExaggeration.

Relevant API

  • AGSArcGISTiledElevationSource
  • AGSScene
  • AGSSurface

Tags

3D, DEM, DTM, elevation, scene, surface, terrain

Sample Code

TerrainExaggerationViewController.swift
                                                                
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
// 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.

import UIKit
import ArcGIS

class TerrainExaggerationViewController: UIViewController {
    @IBOutlet weak var exaggerationValue: UILabel!
    @IBOutlet weak var exaggerationSlider: UISlider!
    @IBOutlet weak var sceneView: AGSSceneView!

    // initialize scene with streets basemap
    let scene = AGSScene(basemap: .streets())

    // initialize surface
    let surface = AGSSurface()

    override func viewDidLoad() {
        super.viewDidLoad()

        // add the source code button item to the right of navigation bar
        (self.navigationItem.rightBarButtonItem as! SourceCodeBarButtonItem).filenames = ["TerrainExaggerationViewController"]

        /// The url of the Terrain 3D ArcGIS REST Service.
        let worldElevationServiceURL = URL(string: "https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer")!
        // initialize surface and add it to scene
        let elevation = AGSArcGISTiledElevationSource(url: worldElevationServiceURL)
        surface.elevationSources.append(elevation)
        scene.baseSurface = surface

        // assign scene to scene view
        self.sceneView.scene = scene

        // set up initial camera location
        let initialLocation = AGSPoint(x: -119.94891542688772, y: 46.75792111605992, spatialReference: sceneView.spatialReference)
        let camera = AGSCamera(lookAt: initialLocation, distance: 15000.0, heading: 40.0, pitch: 60.0, roll: 0.0)
        sceneView.setViewpointCamera(camera)

        // set up initial slider values
        exaggerationSlider.minimumValue = 1
        exaggerationSlider.maximumValue = 10
        exaggerationSlider.isContinuous = true
        exaggerationSlider.value = 1
    }

    @IBAction func sliderValueChanged(_ sender: UISlider) {
        // assign slider value to elevation exaggeration
        surface.elevationExaggeration = sender.value

        // display current exaggeration value
        exaggerationValue.text = String(format: "%.1fx", sender.value)
    }
}

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