@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
260 lines (255 loc) • 12.9 kB
TypeScript
import type AreaMeasurement2D from "./AreaMeasurement2D.js";
import type AreaMeasurement3D from "./AreaMeasurement3D.js";
import type DirectLineMeasurement3D from "./DirectLineMeasurement3D.js";
import type DistanceMeasurement2D from "./DistanceMeasurement2D.js";
import type Widget from "./Widget.js";
import type MeasurementViewModel from "./Measurement/MeasurementViewModel.js";
import type { Icon } from "@esri/calcite-components/components/calcite-icon";
import type { SystemOrAreaUnit, SystemOrLengthUnit } from "../core/units.js";
import type { MapViewOrSceneView } from "../views/MapViewOrSceneView.js";
import type { MeasurementComponentType } from "./Measurement/types.js";
import type { MeasurementViewModelProperties } from "./Measurement/MeasurementViewModel.js";
import type { WidgetProperties } from "./Widget.js";
export interface MeasurementProperties extends WidgetProperties, Partial<Pick<Measurement, "activeTool" | "areaUnit" | "linearUnit" | "view">> {
/**
* Icon which represents the widget. It is typically used when the widget is controlled by another
* one (e.g. in the Expand widget).
*
* @default "measure"
* @since 4.27
* @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
* @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
*/
icon?: Icon["icon"] | null;
/**
* The widget's default label. This property is useful whenever the widget is controlled by another one
* (e.g. [Expand](https://developers.arcgis.com/javascript/latest/references/core/widgets/Expand/)).
*
* @since 4.11
*/
label?: string | null;
/**
* The view model for this widget. This is a class that contains all the logic
* (properties and methods) that controls this widget's behavior. See the
* [MeasurementViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/Measurement/MeasurementViewModel/) class to access
* all properties and methods on the widget.
*
* @example
* // Initialize a measurement widget using the view model.
* const measurement = new Measurement({
* viewModel: {
* view: view,
* activeTool: "distance",
* unit: "yards"
* }
* });
*/
viewModel?: MeasurementViewModelProperties;
}
export type AreaMeasurement = AreaMeasurement2D | AreaMeasurement3D;
export type DistanceMeasurement = DistanceMeasurement2D | DirectLineMeasurement3D;
export type MeasurementWidget = AreaMeasurement | DistanceMeasurement;
/**
* The Measurement widget groups and manages multiple measurement tools and allows you to easily switch between them using
* the [activeTool](https://developers.arcgis.com/javascript/latest/references/core/widgets/Measurement/#activeTool) property. The tools correspond to the measurement widgets for area and distance in 2D
* ([AreaMeasurement2D](https://developers.arcgis.com/javascript/latest/references/core/widgets/AreaMeasurement2D/), [DistanceMeasurement2D](https://developers.arcgis.com/javascript/latest/references/core/widgets/DistanceMeasurement2D/)) and in 3D
* ([AreaMeasurement3D](https://developers.arcgis.com/javascript/latest/references/core/widgets/AreaMeasurement3D/), [DirectLineMeasurement3D](https://developers.arcgis.com/javascript/latest/references/core/widgets/DirectLineMeasurement3D/)).
*
* This widget follows a composite pattern that allows developers to configure the UI to best match their specific requirements.
* The measurement tools, placements, and icons can all be configured, which offers great flexibility to use with tabbed
* interfaces or other customized UI. See the [Measurement widget sample](https://developers.arcgis.com/javascript/latest/sample-code/widgets-measurement/)
* for an example of this flexibility.
*
* [](https://developers.arcgis.com/javascript/latest/sample-code/widgets-measurement/)
*
* How distances, areas, and perimeters are computed depends on the view type and its spatial reference.
*
* In 2D MapViews:
* - In geographic coordinate systems (GCS) and in Web Mercator, they are computed geodetically.
* - In projected coordinate systems (PCS), apart from Web Mercator, they are computed
* in a Euclidean manner (in their respective PCS).
*
* In 3D SceneViews:
* - In geographic coordinate systems (GCS) and in Web Mercator:
* - horizontal distance is computed geodetically;
* - vertical distance is computed as a difference in z-values;
* - direct distance is computed in a Euclidean manner;
* - area and perimeter are computed:
* - in a Euclidean manner if the perimeter is below 100km;
* - geodetically if the perimeter is above 100km.
* - In projected coordinate systems (PCS), apart from Web Mercator:
* - all three distances (direct, horizontal, and vertical), areas, and perimeters are computed in
* a Euclidean manner (in their respective PCS).
*
* @deprecated since version 5.0. Use the [Area Measurement 2D](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-area-measurement-2d/), [Area Measurement 3D](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-area-measurement-3d/), [Direct Line Measurement 3D](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-direct-line-measurement-3d/), or [Distance Measurement 2D](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-distance-measurement-2d/) components instead. For information on widget deprecation, read about [Esri's move to web components](https://developers.arcgis.com/javascript/latest/components-transition-plan/).
* @since 4.13
* @see [MeasurementViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/Measurement/MeasurementViewModel/)
* @see [Sample - Measurement widget](https://developers.arcgis.com/javascript/latest/sample-code/widgets-measurement/)
* @see [DefaultUI](https://developers.arcgis.com/javascript/latest/references/core/views/ui/DefaultUI/)
* @see [AreaMeasurement2D](https://developers.arcgis.com/javascript/latest/references/core/widgets/AreaMeasurement2D/)
* @see [DistanceMeasurement2D](https://developers.arcgis.com/javascript/latest/references/core/widgets/DistanceMeasurement2D/)
* @see [AreaMeasurement3D](https://developers.arcgis.com/javascript/latest/references/core/widgets/AreaMeasurement3D/)
* @see [DirectLineMeasurement3D](https://developers.arcgis.com/javascript/latest/references/core/widgets/DirectLineMeasurement3D/)
* @example
* // Add the measurement widget to the upper right hand corner
* // with the distance tool active
* const map = new Map({
* basemap: "hybrid"
* });
*
* const view = new MapView({
* container: "viewDiv",
* map: map,
* center: [-71.69, 43.76],
* zoom: 15
* });
*
* const measurement = new Measurement({
* view: view,
* activeTool: "distance"
* });
* view.ui.add(measurement, "top-right");
*
* // Switch between area and distance measurement
* function switchTool() {
* const tool = measurement.activeTool === "distance" ? "area" : "distance";
* measurement.activeTool = tool;
* }
*/
export default class Measurement extends Widget {
constructor(properties?: MeasurementProperties);
/**
* Specifies the current measurement tool to display. Setting its value to `area` activates
* the area measurement tool and it works for both [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/) and
* [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/). To measure distance in a [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/)
* set the property to `distance` and in a [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/) set it to `direct-line`.
* If this property is not set, the widget will not be displayed.
*
* @example
* // To create the Measurement widget with SceneView's direct-line tool active.
* const measurement = new Measurement({
* view: view,
* activeTool: "direct-line"
* });
*
* // To switch between direct line and area measurement tools
* function switchTool() {
* const tool = measurement.activeTool === "direct-line" ? "area" : "direct-line";
* measurement.activeTool = tool;
* }
*/
accessor activeTool: MeasurementComponentType | null | undefined;
/**
* The measurement widget that is currently being used. Use this property to
* get access to the active widget.
*
* @example
* // Print the active widget to the console.
* const measurement = new Measurement({
* view: view,
* activeTool: "distance"
* });
* view.ui.add(measurement, "top-right");
* console.log("Active Widget: ", measurement.activeWidget);
*/
get activeWidget(): MeasurementWidget | null | undefined;
/**
* Unit system (imperial, metric) or specific unit used for displaying the area values.
* Possible values are: `metric`, `imperial`, `square-inches`, `square-feet`, `square-us-feet`, `square-yards`, `square-miles`, `square-nautical-miles`, `square-meters`, `square-kilometers`, `acres`, `ares`, `hectares`.
*
* @example
* // To create the Measurement widget that displays area in square US feet
* const measurement = new Measurement({
* view: view,
* activeTool: "area",
* areaUnit: "square-us-feet"
* });
*
* // To display the current area measurement unit
* console.log("Current unit: ", measurement.areaUnit);
*/
accessor areaUnit: SystemOrAreaUnit;
/**
* Icon which represents the widget. It is typically used when the widget is controlled by another
* one (e.g. in the Expand widget).
*
* @default "measure"
* @since 4.27
* @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
* @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
*/
get icon(): Icon["icon"];
set icon(value: Icon["icon"] | null | undefined);
/**
* The widget's default label. This property is useful whenever the widget is controlled by another one
* (e.g. [Expand](https://developers.arcgis.com/javascript/latest/references/core/widgets/Expand/)).
*
* @since 4.11
*/
get label(): string;
set label(value: string | null | undefined);
/**
* Unit system (imperial, metric) or specific unit used for displaying the distance values.
* Possible values are: `metric`, `imperial`, `inches`, `feet`, `us-feet`, `yards`, `miles`, `nautical-miles`, `meters`, `kilometers`.
*
* @example
* // To create the Measurement widget that displays distance in yards
* const measurement = new Measurement({
* view: view,
* activeTool: "distance",
* linearUnit: "yards"
* });
*
* // To display the current linear measurement unit
* console.log('Current linear unit: ', measurement.linearUnit);
*/
accessor linearUnit: SystemOrLengthUnit;
/**
* A reference to the [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/) or [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
* Set this to link the widget to a specific view.
*
* @example
* // To create the Measurement widget for SceneView with the direct-line tool active.
* const measurement = new Measurement({
* view: sceneView,
* activeTool: "direct-line"
* });
*/
accessor view: MapViewOrSceneView | null | undefined;
/**
* The view model for this widget. This is a class that contains all the logic
* (properties and methods) that controls this widget's behavior. See the
* [MeasurementViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/Measurement/MeasurementViewModel/) class to access
* all properties and methods on the widget.
*
* @example
* // Initialize a measurement widget using the view model.
* const measurement = new Measurement({
* viewModel: {
* view: view,
* activeTool: "distance",
* unit: "yards"
* }
* });
*/
get viewModel(): MeasurementViewModel;
set viewModel(value: MeasurementViewModelProperties);
/** Removes all measurement widgets and associated graphics. */
clear(): void;
/**
* Starts a new measurement for the active measurement widget.
*
* @example
* const measurement = new Measurement({
* view: view,
* activeTool: "distance"
* });
*
* function measure () {
* measurement.startMeasurement();
* }
*
* measure();
*/
startMeasurement(): void;
}