SnappingOptions

AMD: require(["esri/views/interactive/snapping/SnappingOptions"], (SnappingOptions) => { /* code goes here */ });
ESM: import SnappingOptions from "@arcgis/core/views/interactive/snapping/SnappingOptions.js";
Class: esri/views/interactive/snapping/SnappingOptions
Inheritance: SnappingOptionsAccessor
Since: ArcGIS Maps SDK for JavaScript 4.19

The SnappingOptions allows users to configure snapping for their editing or drawing experience in both the Sketch and Editor widgets.

Snapping options provide the ability to specify whether an application will utilize self snapping, feature snapping, or both. Both are described below.

It is also possible to toggle snapping by pressing and holding down the CTRL key. This toggles the snapping on/off.

Self snapping (Geometry guides)

Self snapping is set via the selfEnabled property. This means that while a user is actively creating or updating a feature or graphic, they will see visualizations to help identify perpendicular and parallel lines, in addition to visualizations which aid in snapping to an extension of an existing feature. The following briefly demonstrates what self snapping looks like in a 2D application. Although this is shown for 2D, the same premise applies for 3D as well.

self-snapping

Feature snapping

Feature snapping is set via the featureEnabled property. It provides the ability to snap vertices of a graphic or feature that is currently being drawn or reshaped to that of an existing feature's vertex, edge, or end point. These existing features belong to layers within the Map and must be specified in the featureSources property. The following two images demonstrate feature snapping in a 2D application. Similar to self snapping, the same premise applies for 3D as well.

feature-snapping-create

The above shows feature snapping to an existing feature's vertex endpoint and edge while creating a new feature. The bottom demonstrates taking an existing feature and reshaping its geometry to snap to another feature's vertex points.

feature-snapping-update

Things to consider:

Name Details 3D Example 2D Example
Rectangle Snap lines that are perpendicular to each other Rectangle Rectangle-2d
Parallel Snap to all parallel lines Parallel Parallel-2d
Extension Snap to an extension of the current shape Extension Extension-2
Vertex (as seen when updating geometries) Snap vertices to an existing vertex Vertex Vertex-2
See also
Example
// Create a new instance of Sketch, and set
// a layer for one of the featureSources property.
// This enables feature snapping on that layer.
const sketch = new Sketch({
  layer: graphicsLayer,
  view: view,
  snappingOptions: { // autocasts to SnappingOptions()
    enabled: true, // global snapping is turned on
    // assigns a collection of FeatureSnappingLayerSource() and enables feature snapping on this layer
    featureSources: [{ layer: graphicsLayer, enabled: true }]
  }
});

Constructors

SnappingOptions

Constructor
new SnappingOptions(properties)
Parameter
properties Object
optional

See the properties for a list of all the properties that may be passed into the constructor.

Property Overview

Any properties can be set, retrieved or listened to. See the Watch for changes topic.
Show inherited properties Hide inherited properties
Name Type Summary Class

When true, enables support for attribute rule-based snapping.

SnappingOptions

The name of the class.

Accessor

Snapping distance for snapping in pixels.

SnappingOptions

Global configuration to turn snapping on or off.

SnappingOptions

Global configuration option to turn feature snapping on or off.

SnappingOptions

List of sources for feature snapping.

SnappingOptions

Turns the grid on or off.

SnappingOptions

Global configuration option to turn self snapping (within one feature while either drawing or reshaping) on or off.

SnappingOptions

Property Details

attributeRulesEnabled

Property
attributeRulesEnabled Boolean
Since: ArcGIS Maps SDK for JavaScript 4.30 SnappingOptions since 4.19, attributeRulesEnabled added at 4.30.

When true, enables support for attribute rule-based snapping. When enabled, resources needed for rule-based snapping, including any Utility Networks present in the map, will be automatically loaded.

Default Value:false

declaredClass

Inherited
Property
declaredClass Stringreadonly
Inherited from Accessor

The name of the class. The declared class name is formatted as esri.folder.className.

distance

Property
distance Number

Snapping distance for snapping in pixels.

Default Value:5

enabled

Property
enabled Boolean

Global configuration to turn snapping on or off. Note that snapping is turned off by default.

Default Value:false

featureEnabled

Property
featureEnabled Boolean

Global configuration option to turn feature snapping on or off.

Default Value:true

featureSources

Property
featureSources Collection<FeatureSnappingLayerSource>

List of sources for feature snapping. Please refer to FeatureSnappingLayerSource for additional information on what layer sources are supported.

gridEnabled

Property
gridEnabled Boolean
Since: ArcGIS Maps SDK for JavaScript 4.31 SnappingOptions since 4.19, gridEnabled added at 4.31.

Turns the grid on or off. The grid is a network of columns and rows used to divide the view into equal-area squares. The GridControls provides a user interface to interact and configure the grid's properties.

Note

It is recommended to wait for the view to be loaded first before setting the gridEnabled prop in the GridControls constructor. The grid is dependent on the view to be loaded first for it to be displayed.

  • This grid is only supported in a 2D MapView.
Default Value:false
See also
Example
// Turn on the grid programmatically for the GridControls.
// Wait for the view to load first.
view.when(() => {
  const gridControls = new GridControls({
    view,
    snappingOptions: {
      enabled: true,
      gridEnabled: true
    }
  });
  // Add GridControls to the view
  view.ui.add(gridControls, "top-left");
});

selfEnabled

Property
selfEnabled Boolean

Global configuration option to turn self snapping (within one feature while either drawing or reshaping) on or off.

Default Value:true

Method Overview

Show inherited methods Hide inherited methods
Name Return Type Summary Class

Adds one or more handles which are to be tied to the lifecycle of the object.

Accessor

Returns true if a named group of handles exist.

Accessor

Removes a group of handles owned by the object.

Accessor

Method Details

addHandles

Inherited
Method
addHandles(handleOrHandles, groupKey)
Inherited from Accessor
Since: ArcGIS Maps SDK for JavaScript 4.25 Accessor since 4.0, addHandles added at 4.25.

Adds one or more handles which are to be tied to the lifecycle of the object. The handles will be removed when the object is destroyed.

// Manually manage handles
const handle = reactiveUtils.when(
  () => !view.updating,
  () => {
    wkidSelect.disabled = false;
  },
  { once: true }
);

this.addHandles(handle);

// Destroy the object
this.destroy();
Parameters
handleOrHandles WatchHandle|WatchHandle[]

Handles marked for removal once the object is destroyed.

groupKey *
optional

Key identifying the group to which the handles should be added. All the handles in the group can later be removed with Accessor.removeHandles(). If no key is provided the handles are added to a default group.

hasHandles

Inherited
Method
hasHandles(groupKey){Boolean}
Inherited from Accessor
Since: ArcGIS Maps SDK for JavaScript 4.25 Accessor since 4.0, hasHandles added at 4.25.

Returns true if a named group of handles exist.

Parameter
groupKey *
optional

A group key.

Returns
Type Description
Boolean Returns true if a named group of handles exist.
Example
// Remove a named group of handles if they exist.
if (obj.hasHandles("watch-view-updates")) {
  obj.removeHandles("watch-view-updates");
}

removeHandles

Inherited
Method
removeHandles(groupKey)
Inherited from Accessor
Since: ArcGIS Maps SDK for JavaScript 4.25 Accessor since 4.0, removeHandles added at 4.25.

Removes a group of handles owned by the object.

Parameter
groupKey *
optional

A group key or an array or collection of group keys to remove.

Example
obj.removeHandles(); // removes handles from default group

obj.removeHandles("handle-group");
obj.removeHandles("other-handle-group");

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.