<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>Hosted Land Cover ImageryTileLayer | 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.1/"></script>
<arcgis-map center="0, 0" scale="19975114">
<arcgis-zoom slot="top-left"></arcgis-zoom>
<calcite-block slot="top-right" id="infoDiv" heading="Land cover types - 2016" expanded>
<calcite-radio-button-group name="Select land type" layout="vertical" id="landCoverTypeSelect" scale="s">
<calcite-label layout="inline"
><calcite-radio-button id="forests" value="forests" checked></calcite-radio-button>Forested
<calcite-label layout="inline"
><calcite-radio-button value="developed"></calcite-radio-button>Developed Areas</calcite-label
<calcite-label layout="inline"
><calcite-radio-button value="crops"></calcite-radio-button>Cultivated Areas</calcite-label
<calcite-label layout="inline"
><calcite-radio-button value="hay"></calcite-radio-button>Hay/Pasture Areas</calcite-label
<calcite-label layout="inline"
><calcite-radio-button value="wetlands"></calcite-radio-button>Wetlands</calcite-label
</calcite-radio-button-group>
<calcite-select id="projectWKID" label-text="Change view's projection:">
<calcite-option value="102003" selected>Albers Equal Area</calcite-option>
<calcite-option value="102100">Web Mercator</calcite-option>
<calcite-option value="4326">WGS 84</calcite-option>
] = await $arcgis.import([
"@arcgis/core/layers/ImageryTileLayer.js",
"@arcgis/core/layers/FeatureLayer.js",
"@arcgis/core/layers/GroupLayer.js",
"@arcgis/core/renderers/SimpleRenderer.js",
"@arcgis/core/symbols/SimpleFillSymbol.js",
"@arcgis/core/renderers/UniqueValueRenderer.js",
"@arcgis/core/renderers/support/UniqueValueInfo.js",
"@arcgis/core/geometry/SpatialReference.js",
const viewElement = document.querySelector("arcgis-map");
const initialWKID = 102003;
// Reproject the data to the projection selected by the user.
const wkidSelect = document.getElementById("projectWKID");
wkidSelect.addEventListener("calciteSelectChange", () => {
viewElement.spatialReference = new SpatialReference({
wkid: Number(wkidSelect.selectedOption?.value ?? initialWKID),
const viewSpatialReference = new SpatialReference({
viewElement.spatialReference = viewSpatialReference;
spatialReference: viewSpatialReference,
viewElement.background = {
// States layer used as the basemap.
const statesLayer = new FeatureLayer({
url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer/2",
renderer: new SimpleRenderer({
symbol: new SimpleFillSymbol({
spatialReference: viewSpatialReference,
effect: "drop-shadow(-10px, 10px, 6px gray)",
definitionExpression: "STATE_NAME NOT IN ('Alaska', 'Hawaii')",
// Land cover types to set when the user changes the selected land cover type.
categories: ["Deciduous Forest", "Evergreen Forest", "Mixed Forest"],
color: ["#006622", "#006622", "#006622", "#006622"],
"Developed, Low Intensity",
"Developed, Medium Intensity",
"Developed, High Intensity",
color: ["#E5D0DD", "#E08B88", "#FF0000", "#A70000"],
categories: ["Cultivated Crops"],
categories: ["Hay/Pasture"],
categories: ["Woody Wetlands", "Emergent Herbaceuous Wetlands"],
color: ["#0073e6", "#0073e6"],
// Initialize the imagery layer with LERC format.
const layer = new ImageryTileLayer({
url: "https://tiledimageservices.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/NLCD_2016_Land_Cover_L48_20190424/ImageServer",
renderer: changeLandCoverType(landTypes.forests),
blendMode: "color-dodge",
effect: "bloom(0.5, 0.5px, 20%) drop-shadow(1px, 1px, 1px, grey)",
const groupLayer = new GroupLayer({
title: "Forested areas 2016",
viewElement.map = new Map({
baseLayers: [statesLayer],
// Radio button group for changing the land cover types.
const landCoverTypeSelect = document.getElementById("landCoverTypeSelect");
landCoverTypeSelect.addEventListener("calciteRadioButtonGroupChange", () => {
const value = landCoverTypeSelect.selectedItem.value;
layer.renderer = changeLandCoverType(landTypes[value]);
document.getElementById("forests").checked = true;
// Create a renderer for the selected land cover type.
function changeLandCoverType(landType) {
const uvr = new UniqueValueRenderer({
landType.categories.forEach((value, i) => {
const uniqueValue = new UniqueValueInfo({
symbol: new SimpleFillSymbol({
color: landType.color[i],
uvr.uniqueValueInfos.push(uniqueValue);