<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>ImageryTileLayer - shaded relief renderer | Sample | ArcGIS Maps SDK for JavaScript</title>
<!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
<script type="module" src="https://js.arcgis.com/5.0/"></script>
<calcite-shell content-behind="">
<arcgis-map basemap="gray-vector" center="-111.819, 37.111" zoom="7">
<arcgis-zoom slot="top-left"></arcgis-zoom>
<calcite-shell-panel slot="panel-end" display-mode="float">
<calcite-block expanded="" id="rendererPanel" heading="Shaded Relief Parameters">
<calcite-select id="hillshadeTypeSelect">
<calcite-option value="traditional">traditional</calcite-option>
<calcite-option value="multi-directional">multi-directional</calcite-option>
<calcite-select id="colorRampSelect"></calcite-select>
ticks="1"></calcite-slider>
ticks="90"></calcite-slider>
min="0"></calcite-slider>
<calcite-label layout="inline">
<calcite-checkbox id="tinted" checked=""></calcite-checkbox>
<calcite-label layout="inline">
<calcite-checkbox id="adjust" checked=""></calcite-checkbox>
const [ImageryTileLayer, RasterShadedReliefRenderer, colorRamps] = await $arcgis.import([
"@arcgis/core/layers/ImageryTileLayer.js",
"@arcgis/core/renderers/RasterShadedReliefRenderer.js",
"@arcgis/core/smartMapping/raster/support/colorRamps.js",
const hillshadeTypeSelect = document.getElementById("hillshadeTypeSelect");
const colorRampSelect = document.getElementById("colorRampSelect");
const zFactorSlider = document.getElementById("zFactorSlider");
const altitudeSlider = document.getElementById("altitudeSlider");
const azimuthSlider = document.getElementById("azimuthSlider");
const tintedCheckBox = document.getElementById("tinted");
const adjustCheckBox = document.getElementById("adjust");
// Set the hillshade type for the shaded relief renderer.
let hillshadeType = "traditional";
"https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer";
// Reference the map and wait for its property methods to be ready.
const viewElement = document.querySelector("arcgis-map");
await viewElement.componentOnReady();
// Create a multi-part color ramp based on color ramp name.
const changeColorRamp = (name) => {
const colors = colorRamps.byName(name);
return colorRamps.createColorRamp(colors);
// Initialize color ramp with Elevation #1 color ramp name.
let colorRamp = changeColorRamp("Elevation #1");
// Set the shaded relief renderer parameters.
const renderer = new RasterShadedReliefRenderer({
// Create the imagery tile layer with shaded relief renderer.
const layer = new ImageryTileLayer({ url, renderer });
// Add the layer and await its readiness before proceeding.
viewElement.map.add(layer);
await viewElement.whenLayerView(layer);
// Update the renderer when the user adjusts its parameters via UI.
const updateRenderer = () => {
if (!layer.loaded) return;
const renderer = layer.renderer.clone();
renderer.scalingType = adjustCheckBox.checked ? "adjusted" : "none";
renderer.hillshadeType = hillshadeType;
renderer.zFactor = zFactorSlider.value;
renderer.altitude = altitudeSlider.value;
renderer.azimuth = azimuthSlider.value;
case "multi-directional":
renderer.zFactor = zFactorSlider.value;
renderer.colorRamp = tintedCheckBox.checked ? colorRamp : null;
layer.renderer = renderer;
// Populate color ramp select with available color ramps on load.
colorRamps.names().forEach((name) => {
const colorItem = document.createElement("calcite-option");
colorItem.setAttribute("label", name);
colorItem.setAttribute("value", name);
if (name === "Elevation #1") colorItem.selected = true;
colorRampSelect.appendChild(colorItem);
// Create a multi part color ramp based on user selected color ramp name.
colorRampSelect.addEventListener("calciteSelectChange", (event) => {
colorRamp = changeColorRamp(colorRampSelect.value);
// Update the renderer to reflect hillshadeType user picked from select.
hillshadeTypeSelect.addEventListener("calciteSelectChange", (event) => {
hillshadeType = hillshadeTypeSelect.value;
altitudeSlider.disabled = false;
azimuthSlider.disabled = false;
case "multi-directional":
altitudeSlider.disabled = true;
azimuthSlider.disabled = true;
// Listen to z factor slider's value change event and update renderer.
zFactorSlider.addEventListener("calciteSliderInput", updateRenderer);
// Listen to altitude slider's value change event and update renderer.
altitudeSlider.addEventListener("calciteSliderInput", updateRenderer);
// Listen to azimuth slider's value change event and update renderer.
azimuthSlider.addEventListener("calciteSliderInput", updateRenderer);
// Make the renderer grayscale or use the color ramp.
tintedCheckBox.addEventListener("calciteCheckboxChange", updateRenderer);
// Adjust the renderer to large or smaller scales.
adjustCheckBox.addEventListener("calciteCheckboxChange", updateRenderer);