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 using imageServiceRaster::setRenderingRule(renderingRuleInfo).
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
// [WriteFile Name=RasterRenderingRule, Category=Layers]// [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"RasterRenderingRule.h"#include"Map.h"#include"MapQuickView.h"#include"RasterLayer.h"#include"Basemap.h"#include"ImageServiceRaster.h"#include"RenderingRule.h"#include"RenderingRuleInfo.h"#include"Error.h"#include"MapTypes.h"#include"MapViewTypes.h"#include"TaskWatcher.h"#include"LayerListModel.h"#include"ArcGISImageServiceInfo.h"#include"Envelope.h"#include"Viewpoint.h"#include<QJsonObject>#include<QJsonDocument>usingnamespace Esri::ArcGISRuntime;
RasterRenderingRule::RasterRenderingRule(QQuickItem* parent /* = nullptr */):
QQuickItem(parent)
{
}
voidRasterRenderingRule::init(){
// Register the map view for QML qmlRegisterType<MapQuickView>("Esri.Samples", 1, 0, "MapView");
qmlRegisterType<RasterRenderingRule>("Esri.Samples", 1, 0, "RasterRenderingRuleSample");
}
voidRasterRenderingRule::componentComplete(){
QQuickItem::componentComplete();
// find QML MapView component m_mapView = findChild<MapQuickView*>("mapView");
m_mapView->setWrapAroundMode(WrapAroundMode::Disabled);
m_map = newMap(BasemapStyle::ArcGISStreets, this);
m_mapView->setMap(m_map);
//! [RasterRenderingRule cpp ImageServiceRaster]// set the url m_url = QUrl("https://sampleserver6.arcgisonline.com/arcgis/rest/services/CharlotteLAS/ImageServer");
// create an image service raster m_imageServiceRaster = newImageServiceRaster(m_url, this);
// zoom to the raster's extent once it's loadedconnect(m_imageServiceRaster, &ImageServiceRaster::doneLoading, this, [this]()
{
// set the extent of the mapview to the extent defined in the image service raster's service info m_mapView->setViewpoint(Viewpoint(m_imageServiceRaster->serviceInfo().fullExtent()));
// get the rendering rule infosconst QList<RenderingRuleInfo> renderingRuleInfos = m_imageServiceRaster->serviceInfo().renderingRuleInfos();
if (renderingRuleInfos.length() > 0)
{
for (const RenderingRuleInfo& renderingRuleInfo : renderingRuleInfos)
{
// populate the list with the rendering rule names m_renderingRuleNames << renderingRuleInfo.name();
}
emit renderingRuleNamesChanged();
}
});
//! [RasterRenderingRule cpp ImageServiceRaster]// create a raster layer using the image service raster m_rasterLayer = newRasterLayer(m_imageServiceRaster, this);
// add the raster layer to the map's operational layers m_map->operationalLayers()->append(m_rasterLayer);
}
voidRasterRenderingRule::applyRenderingRule(int index){
//! [ImageServiceRaster Create a rendering rule]// get the rendering rule info from the service info RenderingRuleInfo renderingRuleInfo = m_imageServiceRaster->serviceInfo().renderingRuleInfos().at(index);
// create a new rendering rule with the rendering rule info RenderingRule* renderingRule = newRenderingRule(renderingRuleInfo, this);
// create an image service raster ImageServiceRaster* isr = newImageServiceRaster(m_url, this);
// set the rendering rule isr->setRenderingRule(renderingRule);
//! [ImageServiceRaster Create a rendering rule]// create a new raster layer using the image service raster RasterLayer* rasterLayer = newRasterLayer(isr, this);
// add the raster layer to the map m_map->operationalLayers()->append(rasterLayer);
}