<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>View options for snapping, tooltips and units | 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.2/"></script>
--calcite-panel-background-color: var(--calcite-color-surface-2);
padding: var(--calcite-space-sm);
background-color: var(--calcite-color-surface-2);
border-bottom: 2px solid var(--calcite-color-border-1);
margin: 0 0 var(--calcite-space-md);
font-size: var(--calcite-font-size-0);
font-weight: var(--calcite-font-weight-medium);
margin-bottom: var(--calcite-space-sm);
arcgis-area-measurement-3d,
arcgis-direct-line-measurement-3d {
--calcite-font-line-height-relative-tight: 1.75;
max-width: calc(100vw - var(--calcite-space-3xl));
<arcgis-scene id="scene" item-id="99aa8db29f9d4b52878fb0253ba5493e">
<arcgis-zoom slot="top-left"></arcgis-zoom>
<arcgis-navigation-toggle slot="top-left"></arcgis-navigation-toggle>
<arcgis-compass slot="top-left"></arcgis-compass>
<arcgis-sketch id="sketch" slot="bottom-right" visual-scale="s" use-view-options></arcgis-sketch>
<calcite-shell-panel slot="panel-end" width="m">
<section class="settings" aria-labelledby="view-options-heading">
<h2 id="view-options-heading">View options</h2>
<calcite-label layout="inline-space-between">
<calcite-switch id="snapping" checked disabled></calcite-switch>
<calcite-label layout="inline-space-between">
<calcite-switch id="tooltips" disabled></calcite-switch>
<calcite-label class="units-label">
<calcite-segmented-control id="units" width="full" disabled>
<calcite-segmented-control-item value="meters" checked>Meters</calcite-segmented-control-item>
<calcite-segmented-control-item value="feet">Feet</calcite-segmented-control-item>
</calcite-segmented-control>
<calcite-block heading="Direct line measurement" expanded>
<arcgis-direct-line-measurement-3d
reference-element="scene"
></arcgis-direct-line-measurement-3d>
<calcite-block heading="Area measurement" expanded>
<arcgis-area-measurement-3d
reference-element="scene"
></arcgis-area-measurement-3d>
const [LineOfSightLayer, DimensionLayer, Point] = await $arcgis.import([
"@arcgis/core/layers/LineOfSightLayer.js",
"@arcgis/core/layers/DimensionLayer.js",
"@arcgis/core/geometry/Point.js",
/**************************************
* Initialize the scene and controls
**************************************/
const viewElement = document.querySelector("arcgis-scene");
const snapping = document.getElementById("snapping");
const tooltips = document.getElementById("tooltips");
const units = document.getElementById("units");
const area = document.querySelector("arcgis-area-measurement-3d");
const direct = document.querySelector("arcgis-direct-line-measurement-3d");
await viewElement.viewOnReady();
const webScene = viewElement.map;
/**************************************
**************************************/
snapping.addEventListener("calciteSwitchChange", () => {
viewElement.options.snapping.enabled = snapping.checked;
tooltips.addEventListener("calciteSwitchChange", () => {
viewElement.options.tooltips.enabled = tooltips.checked;
const unit = units.selectedItem.value;
area: unit === "feet" ? "square-feet" : "square-meters",
volume: unit === "feet" ? "cubic-feet" : "cubic-meters",
viewElement.options.displayUnits = selectedUnits;
viewElement.options.inputUnits = selectedUnits;
units.addEventListener("calciteSegmentedControlChange", updateUnits);
snapping.disabled = tooltips.disabled = units.disabled = false;
/**************************************
* Set up the measurement analyses
**************************************/
await webScene.loadAll();
await Promise.all([area.componentOnReady(), direct.componentOnReady()]);
// Use the hosted polygon's elevation values for the area measurement.
const source = webScene.allLayers.find((layer) => layer.title === "Tempio di Ercole Vincitore Footprint");
const { features } = await source.queryFeatures({
outSpatialReference: { wkid: 3857 },
area.analysis.geometry = features[0].geometry;
// The measurement displays the geometry, so hide the source feature layer.
// Seed a fixed direct-line measurement for comparing display units.
direct.analysis.startPoint = new Point({
spatialReference: { wkid: 3857 },
direct.analysis.endPoint = new Point({
spatialReference: { wkid: 3857 },
/**************************************
* Keep line of sight editable and dimensions fixed
**************************************/
for (const layer of webScene.allLayers) {
if (layer instanceof LineOfSightLayer) {
const analysisView = await viewElement.whenAnalysisView(layer.analysis);
analysisView.interactive = true;
} else if (layer instanceof DimensionLayer) {
const analysisView = await viewElement.whenAnalysisView(layer.source);
analysisView.interactive = false;