View inWPFWinUIMAUIUWPView on GitHubSample viewer app
Display a raster on a map and apply different rendering rules to that raster.
Use case
Raster images whose individual pixels represent elevation values can be rendered in a number of different ways, including representation of slope, aspect, hillshade, and shaded relief. Applying these different rendering rules to the same raster allows for a powerful visual analysis of the data. For example, a geologist could interrogate the raster image to map subtle geological features on a landscape, which may become apparent only through comparing the raster when rendered using several different rules.
How to use the sample
Run the sample and use the drop-down menu at the top to select a rendering rule.
How it works
Create an ImageServiceRaster using a URL to an online image service.
After loading the raster, use imageServiceRaster.ServiceInfo.RenderingRuleInfos to get a list of RenderingRuleInfo supported by the service.
Choose a rendering rule info to apply and use it to create a RenderingRule.
Create a new ImageServiceRaster using the same URL.
Apply the rendering rule to the new raster.
Create a RasterLayer from the raster for display.
Relevant API
ImageServiceRaster
RasterLayer
RenderingRule
About the data
This raster image service contains 9 LAS files covering Charlotte, North Carolina's downtown area. The lidar data was collected in 2007. Four Raster Rules are available for selection: None, RFTAspectColor, RFTHillshade, and RFTShadedReliefElevationColorRamp.
Additional information
Image service rasters of any type can have rendering rules applied to them; they need not necessarily be elevation rasters. See the list of raster function objects and syntax for rendering rules in the ArcGIS REST API documentation.
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
// 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.using Esri.ArcGISRuntime.ArcGISServices;
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.Mapping;
using Esri.ArcGISRuntime.Rasters;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespaceArcGIS.WPF.Samples.RasterRenderingRule{
[ArcGIS.Samples.Shared.Attributes.Sample(
name: "Raster rendering rule",
category: "Layers",
description: "Display a raster on a map and apply different rendering rules to that raster.",
instructions: "Run the sample and use the drop-down menu at the top to select a rendering rule.",
tags: new[] { "raster", "rendering rules", "visualization" })]
publicpartialclassRasterRenderingRule {
publicRasterRenderingRule() {
InitializeComponent();
// Create the UI, setup the control references and execute initialization _ = Initialize();
}
// Create an empty read-only list for the various rendering rules of the image service rasterprivate IReadOnlyList<RenderingRuleInfo> _myReadOnlyListRenderRuleInfos;
// Create a Uri for the image serverprivate Uri _myUri = new Uri("https://sampleserver6.arcgisonline.com/arcgis/rest/services/CharlotteLAS/ImageServer");
privateasync Task Initialize() {
// Assign a new map to the MapView MyMapView.Map = new Map
{
// Set the basemap to Streets Basemap = new Basemap(BasemapStyle.ArcGISStreets)
};
// Create a new image service raster from the Uri ImageServiceRaster myImageServiceRaster = new ImageServiceRaster(_myUri);
try {
// Load the image service rasterawait myImageServiceRaster.LoadAsync();
// Get the ArcGIS image service info (metadata) from the image service raster ArcGISImageServiceInfo myArcGISImageServiceInfo = myImageServiceRaster.ServiceInfo;
// Get the full extent envelope of the image service raster (the Charlotte, NC area) Envelope myEnvelope = myArcGISImageServiceInfo.FullExtent;
// Define a new view point from the full extent envelope Viewpoint myViewPoint = new Viewpoint(myEnvelope);
// Zoom to the area of the full extent envelope of the image service rasterawait MyMapView.SetViewpointAsync(myViewPoint);
// Get the rendering rule info (i.e. definitions of how the image should be drawn) info from the image service raster _myReadOnlyListRenderRuleInfos = myArcGISImageServiceInfo.RenderingRuleInfos;
// Loop through each rendering rule infoforeach (RenderingRuleInfo myRenderingRuleInfo in _myReadOnlyListRenderRuleInfos)
{
// Get the name of the rendering rule infostring myRenderingRuleName = myRenderingRuleInfo.Name;
// Add the name of the rendering rule info to the combo box RenderingRuleChooser.Items.Add(myRenderingRuleName);
}
// Set the combo box index to the first rendering rule info name RenderingRuleChooser.SelectedIndex = 0;
}
catch (Exception e)
{
MessageBox.Show(e.ToString(), "Error");
}
}
///<summary>/// Called when a rendering rule info name is changed in the combo box///</summary>privatevoidcomboBox_RenderingRuleChooser_SelectionChanged(object sender, SelectionChangedEventArgs e) {
// Loop through each rendering rule info in the image service rasterforeach (RenderingRuleInfo myRenderingRuleInfo in _myReadOnlyListRenderRuleInfos)
{
// Get the name of the rendering rule infostring myRenderingRuleName = myRenderingRuleInfo.Name;
// If the name of the rendering rule info matches what was chosen in the combo box, proceedif (myRenderingRuleName == (string)RenderingRuleChooser.SelectedItem)
{
// Create a new rendering rule from the rendering rule info RenderingRule myRenderingRule = new RenderingRule(myRenderingRuleInfo);
// Create a new image service raster ImageServiceRaster myImageServiceRaster = new ImageServiceRaster(_myUri)
{
// Set the image service raster's rendering rule to the rendering rule created earlier RenderingRule = myRenderingRule
};
// Create a new raster layer from the image service raster RasterLayer myRasterLayer = new RasterLayer(myImageServiceRaster);
// Add the raster layer to the operational layers of the map view MyMapView.Map.OperationalLayers.Add(myRasterLayer);
}
}
}
}
}