<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<title>Measurement in 3D | Sample | ArcGIS Maps SDK for JavaScript</title>
background-color: transparent;
border: 1px solid #d3d3d3;
box-shadow: 0 0 1px rgba(0, 0, 0, 0.3);
<link rel="stylesheet" href="https://js.arcgis.com/5.1/esri/themes/light/main.css" />
<!-- Load the ArcGIS Maps SDK for JavaScript from CDN -->
<script type="module" src="https://js.arcgis.com/5.1/"></script>
const [WebScene, SceneView, DirectLineMeasurement3D, AreaMeasurement3D, promiseUtils] = await $arcgis.import([
"@arcgis/core/WebScene.js",
"@arcgis/core/views/SceneView.js",
"@arcgis/core/widgets/DirectLineMeasurement3D.js",
"@arcgis/core/widgets/AreaMeasurement3D.js",
"@arcgis/core/core/promiseUtils.js",
const webscene = new WebScene({
id: "5ce0de673d3b41a3bf3a217942211c4b",
const view = new SceneView({
// add the toolbar for the measurement widgets
view.ui.add("topbar", "top-right");
document.getElementById("distanceButton").addEventListener("click", (event) => {
if (!event.target.classList.contains("active")) {
setActiveWidget("distance");
document.getElementById("areaButton").addEventListener("click", (event) => {
if (!event.target.classList.contains("active")) {
function setActiveWidget(type) {
activeWidget = new DirectLineMeasurement3D({
// skip the initial 'new measurement' button
activeWidget.viewModel.start().catch((error) => {
if (promiseUtils.isAbortError(error)) {
return; // don't display abort errors
throw error; // throw other errors since they are of interest
view.ui.add(activeWidget, "top-right");
setActiveButton(document.getElementById("distanceButton"));
activeWidget = new AreaMeasurement3D({
// skip the initial 'new measurement' button
activeWidget.viewModel.start().catch((error) => {
if (promiseUtils.isAbortError(error)) {
return; // don't display abort errors
throw error; // throw other errors since they are of interest
view.ui.add(activeWidget, "top-right");
setActiveButton(document.getElementById("areaButton"));
view.ui.remove(activeWidget);
function setActiveButton(selectedButton) {
// focus the view to activate keyboard shortcuts for sketching
const elements = document.getElementsByClassName("active");
for (let i = 0; i < elements.length; i++) {
elements[i].classList.remove("active");
selectedButton.classList.add("active");
class="action-button esri-icon-measure-line"
title="Measure distance between two points"
<button class="action-button esri-icon-measure-area" id="areaButton" type="button" title="Measure area"></button>