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
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).
Add the surface.
The surface visualizes the elevation source.
Configure the surface's elevationExaggeration.
Relevant API
AGSArcGISTiledElevationSource
AGSScene
AGSSurface
Tags
3D, DEM, DTM, elevation, scene, surface, terrain
Sample Code
TerrainExaggerationViewController.swift
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
// 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
classTerrainExaggerationViewController: UIViewController{
@IBOutletweakvar exaggerationValue: UILabel!
@IBOutletweakvar exaggerationSlider: UISlider!
@IBOutletweakvar sceneView: AGSSceneView!
// Initialize scene with streets basemap style.let scene =AGSScene(basemapStyle: .arcGISStreets)
// initialize surfacelet surface =AGSSurface()
overridefuncviewDidLoad() {
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 scenelet elevation =AGSArcGISTiledElevationSource(url: worldElevationServiceURL)
surface.elevationSources.append(elevation)
scene.baseSurface = surface
// assign scene to scene viewself.sceneView.scene = scene
// set up initial camera locationlet 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 }
@IBActionfuncsliderValueChanged(_sender: UISlider) {
// assign slider value to elevation exaggeration surface.elevationExaggeration = sender.value
// display current exaggeration value exaggerationValue.text =String(format: "%.1fx", sender.value)
}
}